根据 Google 的建议,我从我的应用程序中删除了使用 PhotoPicker 的 READ_MEDIA_IMAGES 权限,并且现在在应用程序保持安装状态时可以正常工作。该应用程序将其保存到图库,我可以恢复照片。
但是,如果我卸载该应用程序并再次安装,我将无法再读取这张保存的照片,因为我没有权限。
遇到这些情况我该怎么办?
我无法在解决方案上取得太大进展。
在 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()
}
}
}
我认为这是最好的选择,将图像保存在共享位置,例如图片文件夹。即使卸载应用程序,这也允许图像保留下来,并且您可以使用照片选择器轻松检索它们。