[保存位图Android 8时图像名称和类型不正确

问题描述 投票:0回答:1

我很有趣,可以将位图另存为PNG或JPG(两者均不起作用),但是似乎使用的内容值未按预期工作。

  1. 文件名不正确。
  2. 文件类型不正确。

我想念什么?在Android 10上有效,但在Android 8上无效]

fun Bitmap.save(context: Context) {
    val contentResolver = context.contentResolver

    val contentValues = ContentValues().apply {
        put(MediaStore.MediaColumns.DISPLAY_NAME, "test.png")
        put(MediaStore.MediaColumns.TITLE, "test")
        put(MediaStore.MediaColumns.MIME_TYPE, "image/png")
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES)
            put(MediaStore.MediaColumns.IS_PENDING, 1)
        }
    }

    val contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
    val uri = contentResolver.insert(contentUri, contentValues)
    if (uri != null) {
        try {
            contentResolver.openFileDescriptor(uri, "w", null)?.use {
                if (it.fileDescriptor != null) {
                    with(FileOutputStream(it.fileDescriptor)) {
                        compress(
                            Bitmap.CompressFormat.PNG,
                            DEFAULT_IMAGE_QUALITY,
                            this
                        )
                        flush()
                        close()
                    }
                }
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            contentValues.clear()
            contentValues.put(MediaStore.MediaColumns.IS_PENDING, 0)
            contentResolver.update(uri, contentValues, null, null)
        }

        MediaScannerConnection.scanFile(context, arrayOf(uri.toString()), null, null)
    }
    recycle()
}

实际文件名为1592205828045(某些时间戳记)

实际文件类型为jpg0B-因为未正确保存?

android kotlin bitmap
1个回答
0
投票

您正在创建文件,但仍需要将其写入Bitmap

fun Bitmap.save(context: Context) {

    ...

    val bitmap = this
    val maxImageQuality = 100

    val uri = contentResolver.insert(contentUri, contentValues)
    if (uri != null) {
        try {
            contentResolver.openFileDescriptor(uri, "w", null)?.use {
                if (it.fileDescriptor != null) {
                    with(FileOutputStream(it.fileDescriptor)) {
                        bitmap.compress(
                            Bitmap.CompressFormat.PNG,
                            maxImageQuality, this
                        )
                        flush()
                        close()
                    }
                }
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }

        // release pending status of the file
        contentValues.clear()
        contentValues.put(MediaStore.Images.Media.IS_PENDING, 0)
        contentResolver.update(uri, contentValues, null, null)

        // notify media scanner there's a new picture
        MediaScannerConnection.scanFile(context, arrayOf(uri.toString()), null, null)
    }
    // don't forget to recycle the bitmap when you don't need it any longer
    bitmap.recycle()
}
© www.soinside.com 2019 - 2024. All rights reserved.