首页 > 解决方案 > 替换 getExternalStoragePublicDirectory() API 21-30

问题描述

我的应用minSdkVersion是 21 和targetSdkVersion30。我需要将图像保存到外部存储(到图片文件夹)

所以,这里的saveImage功能:

fun saveImage(context: Context) {
    val fileName = "${System.currentTimeMillis()}.png"
    val fileType = "image/png"
    val folder = "MyApp"
    val imageQuality = 100

    val write: (OutputStream) -> Boolean = { outputStream ->
        this.compress(Bitmap.CompressFormat.PNG, imageQuality, outputStream)
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        val contentValues = ContentValues().apply {
            put(MediaStore.MediaColumns.DISPLAY_NAME, fileName)
            put(MediaStore.MediaColumns.MIME_TYPE, fileType)
            put(MediaStore.MediaColumns.RELATIVE_PATH, "${Environment.DIRECTORY_PICTURES}/$folder")
        }

        context.contentResolver.let {
            it.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)?.let { uri ->
                it.openOutputStream(uri)?.let(write)
            }
        }
    } else {
        val imagesDir = Environment
            .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
            .toString() + File.separator + folder
        val file = File(imagesDir)
        if (!file.exists()) {
            file.mkdir()
        }
        val image = File(imagesDir, fileName)
        write(FileOutputStream(image))
    }
}

我在清单文件中也有这个权限:

<uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        tools:ignore="ScopedStorage" />

这工作正常,但getExternalStoragePublicDirectory在 API 29+ 中已弃用。有没有办法摆脱这个不推荐使用的功能?现在我只是压制警告,但感觉有点糟糕。

标签: androidandroid-permissionsandroid-external-storage

解决方案


推荐阅读