删除 READ_MEDIA_IMAGES 权限以在 Android 应用程序中使用照片选择器时出现问题

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

根据 Google 的建议,我从我的应用程序中删除了使用 PhotoPicker 的 READ_MEDIA_IMAGES 权限,并且现在在应用程序保持安装状态时可以正常工作。该应用程序将其保存到图库,我可以恢复照片。

但是,如果我卸载该应用程序并再次安装,我将无法再读取这张保存的照片,因为我没有权限。

遇到这些情况我该怎么办?

我无法在解决方案上取得太大进展。

android android-permissions photo-picker
1个回答
0
投票

在 Android 中,从 Android 13(API 级别 33)开始,Google 引入了 Photo Picker API,作为一种隐私友好的方式来访问图像和视频,而无需请求 READ_MEDIA_IMAGES 权限。但是,当您卸载并重新安装应用程序时,您将失去对先前安装中创建的文件的访问权限,特别是因为由于删除的权限而您不再具有广泛的文件访问权限。

我认为您应该将图像保存在共享存储位置,而不是将照片保存到应用程序的内部存储中,您应该将其保存到共享目录,例如外部存储中的 Pictures 或 DCIM 文件夹。这样,即使卸载应用程序,图像也将保留,并且由于照片选择器可以访问共享存储,因此您可以在重新安装后选择图像,而不需要任何额外的权限。

你可以像这个 java 示例一样:

public void saveImageToPictures(Bitmap bitmap, String fileName) {
    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName + ".jpg");
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
    values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES);

    ContentResolver resolver = getContentResolver();
    Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

    try (OutputStream outputStream = resolver.openOutputStream(uri)) {
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

如果你在 kotlin 中做,那么像这样:

fun saveImageToPictures(bitmap: Bitmap, fileName: String) {
    val values = ContentValues().apply {
        put(MediaStore.Images.Media.DISPLAY_NAME, "$fileName.jpg")
        put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
        put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES)
    }

    val resolver = contentResolver
    val uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)

    uri?.let {
        try {
            resolver.openOutputStream(it)?.use { outputStream ->
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
            }
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
}

我认为这是最好的选择,将图像保存在共享位置,例如图片文件夹。即使卸载应用程序,这也允许图像保留下来,并且您可以使用照片选择器轻松检索它们。

© www.soinside.com 2019 - 2024. All rights reserved.