Вы можете использовать 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
, чтобы реализовать это.Однако, если у вас возникнут проблемы, я предлагаю вам открыть еще один вопрос.