在我的应用程序中,我使用以下代码允许用户选择多个图像。
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "image/*"
}
startActivityForResult(intent, SELECT_IMAGE_REQUEST_CODE)
在onActivityResult()
中,我得到了转换为文件列表的 URI 列表。我正在压缩这些文件并使用下面的代码保存位图。
private fun saveImage(bitmap: Bitmap?) {
val imageName = "image_${UUID.randomUUID().toString().substring(0, 5)}"
var uri: Uri? = null
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val relativeLocation =
Environment.DIRECTORY_PICTURES + File.separator + getString(R.string.app_name)
val contentValues = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, imageName)
put(MediaStore.MediaColumns.MIME_TYPE, "image/png")
put(MediaStore.MediaColumns.RELATIVE_PATH, relativeLocation)
}
val contentResolver = context?.contentResolver
var stream: OutputStream? = null
try {
val contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
uri = contentResolver?.insert(contentUri, contentValues)
if (uri == null) throw IOException("Failed to create new MediaStore record.")
stream = contentResolver?.openOutputStream(uri)
if (stream == null) throw IOException("Failed to get output stream.")
if (bitmap?.compress(Bitmap.CompressFormat.PNG, 100, stream) == false) {
throw IOException("Failed to save bitmap.")
}
} catch (e: IOException) {
if (uri != null) {
contentResolver?.delete(uri, null, null)
}
throw e
} finally {
stream?.close()
}
contentValues.clear()
contentValues.put(MediaStore.Images.Media.IS_PENDING, 0)
contentResolver?.update(uri!!, contentValues, null, null)
} else {
var stream: OutputStream? = null
try {
val savePath =
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
.toString() + File.separator + getString(R.string.app_name)
val file = File(savePath)
if (!file.exists()) file.mkdir()
val imageFile = File(savePath, "$imageName.png")
stream = FileOutputStream(imageFile)
bitmap?.compress(Bitmap.CompressFormat.PNG, 100, stream)
} catch (e: IOException) {
throw e
} finally {
stream?.close()
}
}
}
压缩完成后,我会向用户显示压缩图像列表及其压缩前后的大小。
问题是因为我得到了一个File
低于 Android Q 的版本,我可以轻松地提取压缩图像的名称和大小等信息。但是,在 Android Q 及更高版本中,我无法访问文件,因为位图是使用 MediaStore 保存的。是否有任何简单快捷的方法可以使用 MediaStore 获取保存的位图的名称和大小?