Java 滑动下载图像并同步另存为文件

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

我正在尝试使用Glide从URL下载图像,获取文件路径并将其转发到
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设置墙纸的首选方法吗
  • 如何处理其他错误

  • 关于从url获取图像的第一个问题,建议您使用此方法,而不是使用
    asFile
    。然后,您可以在加载资源时利用异步回调来获取异步回调,而不是使用
    AsyncTask


    至于你的第二个问题,你正在广播一个未经操作系统或你设备上的任何应用程序注册的隐含意图。您可以尝试利用系统服务,而不是广播意图。

    回答我自己的问题

  • 最好按照Elli White的建议使用。 但我在研究这个问题上浪费了足够的时间,我得到了一个可行的解决方案,所以我决定不从头开始

  • 我得到的错误是因为Glide返回的图像文件名

  • 我通过将文件复制到某个地方并将其用作源文件来修复它

            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))