0

在我的应用程序中,我使用以下代码允许用户选择多个图像。

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 获取保存的位图的名称和大小?

4

0 回答 0