Импортировать и сохранить картинку из галереи во внутреннюю память - PullRequest
1 голос
/ 04 июля 2019

Я занимаюсь разработкой приложения для Android, в котором мне нужно импортировать фотографии из галереи, чтобы сохранить их во внутренней памяти телефона. Понятия не имею, как это сделать, у тебя есть идеи?

Я посмотрел в интернете, но натолкнулся на случаи, когда мы хотели хранить в галерее ...

На самом деле, в моем приложении есть объекты с именем и изображением. Для изображения я сохранил его имя (в чертежах) как строку и извлеку его, отсортировав по именам. Я также хотел бы иметь возможность получать изображения из телефонной галереи, но я не знаю, как смешать два ...

Спасибо, парень!

1 Ответ

0 голосов
/ 05 июля 2019

Вы можете использовать Android ACTION_PICK намерение загрузить изображение из галереи пользователей, см. здесь , с EXTERNAL_CONTENT_URI в качестве целевого каталога.Это позволит пользователю выбрать изображение с помощью какого-либо внешнего приложения и предоставить URI обратно вашему приложению после выбора.Обратите внимание, что приведенный ниже код написан на Kotlin.

Где-то в своей деятельности запустите ACTION_PICK для результата:

val intent = Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
startActivityForResult(intent, 0)

Вы получите URI для изображения в виде данных в OnActivityResult оттуда вам нужно будет прочитать файл и записать его в хранилище приложений.Поскольку вы собираетесь загрузить этот файл в ImageView, я бы рекомендовал повторно использовать поток.Я включил возможный способ сделать это в блок ниже, который состоит в том, чтобы прочитать поток в ByteArray, затем записать это ByteArray в ваши FileOutputStream и в ваши ImageView (используя класс BitmapFactory).

См. ниже:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (resultCode == RESULT_OK) {
        val resultUri: Uri? = data?.data

        val extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(contentResolver.getType(resultUri))
        val newFile = File(context.filesDir.absolutePath, "aGeneratedFileName.${extension}")

        var inputStream: InputStream? = null
        var byteStream: ByteArrayOutputStream? = null
        var fileOutputStream: FileOutputStream? = null
        var bitmap: Bitmap? = null
        try {
            inputStream = contentResolver.openInputStream(resultUri)
            fileOutputStream = FileOutputStream(newFile)

            IOUtils.copy(inputStream, byteStream)
            var bytes = byteStream.toByteArray()

            fileOutputStream.write(bytes)
            bitmap = BitmapFactory.decodeByteArray(bytes, 0, byteStream.size())
            myImageView.setImageBitmap(bitmap)
        } catch (e: Exception) {
            Log.e(TAG, "Failed to copy image", e)

            inputStream?.close()
            fileOutputStream?.close()
            byteStream?.close()

            return
        } finally {
            inputStream?.close()
            fileOutputStream?.close()
            byteStream?.close()
        }
    } else {
        // Probably handle this error case
    }
}

Я предполагаю, что вы захотите перезагрузить изображения, которые вы импортировали при следующем запуске приложения, длячто вы можете получить список файлов в вашем filesDir и прочитать их, используя BitmapFactory.decodeFile.

Похоже, ваша цель - показать массив изображений, если вы этого еще не сделали, я предлагаю вам взглянуть на класс RecyclerView, чтобы реализовать это.Однако, если у вас возникнут проблемы, я предлагаю вам открыть еще один вопрос.

...