android - Kotlin:如何将图像从 Internet 保存到内部存储

标签 android kotlin

我是 Android Studio 的新手,尤其是 Kotlin。我需要从互联网加载图像,然后将其保存到手机。我尝试使用 Glide 作为位图加载图像,然后保存它。但它不起作用。这段代码是我发现的最好的东西,但它不起作用。

try {
var bitmap = Glide.with(this)
        .asBitmap()
        .load("https://s3.amazonaws.com/appsdeveloperblog/Micky.jpg")
        .apply(RequestOptions().override(100).downsample(DownsampleStrategy.CENTER_INSIDE).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE))
        .submit().get()
    val wrapper = ContextWrapper(applicationContext)
    var file = wrapper.getDir("Images", Context.MODE_PRIVATE)
    file = File(file, "img.jpg")
    val out = FileOutputStream(file)
    bitmap.compress(Bitmap.CompressFormat.JPEG, 85, out)
    out.flush()
    out.close()
}
catch (e: Exception) {
    println(e)
}

我如何理解问题在于 Glide 的“.submit().get()”部分。但是如果我把它拿走,那么压缩就不起作用了。

最佳答案

submit(): 返回可用于在后台线程上执行阻塞获取的 future 。

get():必要时等待计算完成,然后检索其结果。

如果您要从 url 下载图像并将其保存到内部存储,您应该使用后台线程来执行此操作。如果您在主线程上调用,您的应用可能会抛出 ANR 对话框。

这里我将演示如何使用AsyncTask API下载和保存图片

先写一个类来下载和保存图片。

class DownloadAndSaveImageTask(context: Context) : AsyncTask<String, Unit, Unit>() {
    private var mContext: WeakReference<Context> = WeakReference(context)

    override fun doInBackground(vararg params: String?) {
        val url = params[0]
        val requestOptions = RequestOptions().override(100)
            .downsample(DownsampleStrategy.CENTER_INSIDE)
            .skipMemoryCache(true)
            .diskCacheStrategy(DiskCacheStrategy.NONE)

        mContext.get()?.let {
            val bitmap = Glide.with(it)
                .asBitmap()
                .load(url)
                .apply(requestOptions)
                .submit()
                .get()

            try {
                var file = it.getDir("Images", Context.MODE_PRIVATE)
                file = File(file, "img.jpg")
                val out = FileOutputStream(file)
                bitmap.compress(Bitmap.CompressFormat.JPEG, 85, out)
                out.flush()
                out.close()
                Log.i("Seiggailion", "Image saved.")
            } catch (e: Exception) {
                Log.i("Seiggailion", "Failed to save image.")
            }
        }
    }
}

然后在 Activity 中调用

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        DownloadAndSaveImageTask(this).execute("https://s3.amazonaws.com/appsdeveloperblog/Micky.jpg")
    }
}

如果要保存到内部存储

var file = File(it.filesDir, "Images")
if (!file.exists()) {
    file.mkdir()
}
file = File(file, "img.jpg")

它将图像保存在路径 data/data/yourapppackagename/files/Images/img.jpg

关于android - Kotlin:如何将图像从 Internet 保存到内部存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53121993/

相关文章:

java - 安卓许可证 "LICENSED RESPONSE"错误

android - 在Dao中使用@Query时,房间[exception:KaptExecution]

Kotlin 字符串连接 - 保留多行字符串的缩进

multithreading - Kotlin Supervisor Job 意外行为

android - viewModelScope 未取消

Android 长按编辑文本行为

android - 您的内容必须有一个 id 属性为 'android.R.id.list' 的 ListView

android - Android 如何决定哪个应用程序可以先写入光盘?

Kotlin 高阶函数组合

java - 将 key 字符串转换为 tozny/java-aes-crypto 中的 SecretKeys 对象