Котлин: Как сохранить изображение из Интернета во внутреннее хранилище - PullRequest
0 голосов
/ 02 ноября 2018

Я новичок в Android Studio и особенно в Kotlin. Мне нужно загрузить изображение из Интернета, а затем сохранить его на телефон. Я попытался загрузить изображение с Glide как Bitmap и затем сохранить его. Но это не работает. Этот код - лучшее, что я нашел, но он не работает.

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

Как я понял, проблема в этой ".submit (). Get ()" части Glide. Но если я уберу его, то компресс не сработает.

1 Ответ

0 голосов
/ 03 ноября 2018

submit(): Возвращает будущее, которое может быть использовано для получения блокировки в фоновом потоке.

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.")
            }
        }
    }
}

Тогда в деятельности просто позвоните

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...