猿问

Glide 下载图片并同步保存为文件

我正在尝试使用 Glide 从 URL 下载图像并获取文件的路径并将其转发以WallpaperManager.getCropAndSetWallpaperIntent设置为墙纸。


我发现这可以使用asFileGlide 的方法来完成


科特林:


val data = Glide

    .with(context)

    .asFile()

    .load(url)

    .submit()

但是当我打电话时data.get()我得到了错误


java.lang.IllegalArgumentException: You must call this method on a background thread


所以遵循这个答案并实施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)

    }

}


而我现在正在这样做


fun getFile(context: Context, url: String) : File {

    val data = Glide

        .with(context)

        .asFile()

        .load(url)

        .submit()


    val asyncTask = MyAsyncTask(object : AsyncResponse {

        override fun processFinish(output: File?) {

            println(output?.path)

        }

    }).execute(data)


  return asyncTask.get()

}

但我似乎无法得到File




呼如林
浏览 504回答 2
2回答

狐的传说

关于您关于从 url 获取图像的第一个问题,而不是使用asFile,建议您使用该方法downloadOnly()。AsyncTask然后,您可以利用 aRequestListener在加载资源时获取异步回调,而不是使用 an 。至于你的第二个问题,你正在广播一个未被操作系统或你设备上的任何应用程序注册的隐式意图。您可以尝试利用系统服务,而不是广播意图WallpaperManager。

斯蒂芬大帝

回答我自己的问题最好downloadOnly()按照 Elli White&nbsp;here的建议使用。但是我在研究这个问题上浪费了足够多的时间,并且得到了一个可行的解决方案,所以我决定不从头开始。我得到的错误是因为 Glide 返回的图像文件名。我通过将文件复制到某处并将其用作源来修复它。&nbsp; &nbsp; &nbsp; &nbsp; val file = asyncTask.get()//&nbsp; &nbsp; &nbsp; &nbsp; copy file&nbsp; &nbsp; &nbsp; &nbsp; val tempFile = File.createTempFile("image", ".png")&nbsp; &nbsp; &nbsp; &nbsp; copyFile(file!!.inputStream(), FileOutputStream(tempFile))对于我的用例,即将图像设置为墙纸,我不必担心文件扩展名,只要我.png在这种情况下指定它是图像即可。
随时随地看视频慕课网APP

相关分类

Java
我要回答