Java 滑动下载图像并同步另存为文件
我正在尝试使用Glide从URL下载图像,获取文件路径并将其转发到Java 滑动下载图像并同步另存为文件,java,android,kotlin,android-glide,Java,Android,Kotlin,Android Glide,我正在尝试使用Glide从URL下载图像,获取文件路径并将其转发到wallpermanager.getcropandsetwallperintent以设置为墙纸 我发现这可以使用Glide的asFile方法来实现 科特林: val data = Glide .with(context) .asFile() .load(url) .submit() 但是当我调用data.get()时,我得到了错误 java.lang.IllegalArgumentExceptio
wallpermanager.getcropandsetwallperintent
以设置为墙纸
我发现这可以使用Glide的asFile
方法来实现
科特林:
val data = Glide
.with(context)
.asFile()
.load(url)
.submit()
但是当我调用data.get()
时,我得到了错误
java.lang.IllegalArgumentException:必须在后台线程上调用此方法
因此,遵循回答并实施了MyAsyncTask
interface AsyncResponse {
fun processFinish(output: File?)
}
class MyAsyncTask(delegate: AsyncResponse) : AsyncTask<FutureTarget<File>, Void, File?>() {
override fun doInBackground(vararg p0: FutureTarget<File>?): File? {
return p0[0]?.get()
}
private var delegate: AsyncResponse? = null
init {
this.delegate = delegate
}
override fun onPostExecute(result: File?) {
delegate!!.processFinish(result)
}
}
但我似乎无法获取文件
编辑:
它正在工作,但现在有一个新的错误
android.content.ActivityNotFoundException:找不到处理意图的活动{act=android.service.wallper.CROP_和_SET_wallper dat=content://com.rithvij.scrolltest.provider/cache/image_manager_disk_cache/efebce47b249d7d92fd17340ecf91eb6b7ff86f91d71aabf50468f9e74d0e324.0 flg=0x1 pkg=is.shortcut}
全堆栈跟踪
E/AndroidRuntime:致命异常:主
进程:com.rithvij.scrolltest,PID:2760
android.content.ActivityNotFoundException:找不到处理意图的活动{act=android.service.wallpaper.CROP_和_SET_wallpaper dat=content://com.rithvij.scrolltest.provider/cache/image_manager_disk_cache/efebce47b249d7d92fd17340ecf91eb6b7ff86f91d71aabf50468f9e74d0e324.0 flg=0x1 pkg=is.shortcut}
在android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1816)中
位于android.app.Instrumentation.execStartActivity(Instrumentation.java:1525)
在android.app.Activity.startActivityForResult上(Activity.java:4396)
位于androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767)
在android.app.Activity.startActivityForResult(Activity.java:4355)上
位于androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754)
在android.app.Activity.startActivity(Activity.java:4679)
在android.app.Activity.startActivity(Activity.java:4647)
在com.rithvij.scrolltest.MainActivity$onCreate$1.onClick(MainActivity.kt:71)上
在android.view.view.performClick上(view.java:5619)
在android.view.view$PerformClick.run(view.java:22298)
位于android.os.Handler.handleCallback(Handler.java:754)
位于android.os.Handler.dispatchMessage(Handler.java:95)
位于android.os.Looper.loop(Looper.java:165)
位于android.app.ActivityThread.main(ActivityThread.java:6375)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
关于从url获取图像的第一个问题,建议您使用此方法,而不是使用
asFile
。然后,您可以在加载资源时利用异步回调来获取异步回调,而不是使用AsyncTask
至于你的第二个问题,你正在广播一个未经操作系统或你设备上的任何应用程序注册的隐含意图。您可以尝试利用系统服务,而不是广播意图。回答我自己的问题
val file = asyncTask.get()
// copy file
val tempFile = File.createTempFile("image", ".png")
copyFile(file!!.inputStream(), FileOutputStream(tempFile))
对于我的用例,即将图像设置为墙纸,我不需要担心文件扩展名,只要我在本例中指定它是图像
.png
。墙纸管理器的结果是什么。IsWallperManager.IsWallperSupported()和isSetWallpaperAllowed()?是的。我确实请求了SET\u WALLPAPER
权限,并且它确实与其他URI一起工作,例如:从一个可绘制的文件,那么它很可能是由于URI。在android中,与其他应用程序共享文件已更改,直接共享文件的url可能不起作用。如果您尚未遵循此教程,请参阅本教程:我确实为此花费了3个小时,但失去了代表,却一无所获。谢谢大家。我正在使用WallperManager作为WallperManager。GetCropandSetWallperIntent()
提到的是一个没有被操作系统注册的隐含意图吗?我错过了你问题的这一部分,抱歉!
val file = asyncTask.get()
// copy file
val tempFile = File.createTempFile("image", ".png")
copyFile(file!!.inputStream(), FileOutputStream(tempFile))