重新启动后,图库中的图像权限丢失
Permission for an image from Gallery is lost after re-launch
我的应用程序允许用户查看从图库或其他位置选择的一些图像。我通过以下方式请求图片的 Uri:
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, PickerFragment.PICK_PHOTO);
然后在 onActivityResult(int requestCode、int resultCode、Intent 数据)中获取 Uri,并通过以下方式访问这些图像以将它们放入我的应用程序视图中:
Uri imageUri= data.getData();
应用程序完成后,我通过以下方式将数据库中的所有 Uri 保存为字符串:
String imageUriString = imageUri.toString();
saveToDB (imageUriString);
然而,当我重新启动应用程序并通过以下方式从我的数据库中恢复所有 Uri 时:
String imageUriString = restoreFromDB ();
imageUri = Uri.parse (imageUriString);
在 Android 7.1 中,该应用不再具有对这些 Uri 的权限。
我通过以下方式访问图像:
ContentResolver cr = mContext.getContentResolver();
InputStream is = cr.openInputStream(imageUri);
BitmapFactory.decodeStream(is, null, o);
但是收到这个异常:
java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.contentprovider.impl.MediaContentProvider from ProcessRecord
是否有一种优雅而合法的方式来保留该权限?
我试图阅读所有关于权限的文档,但感到很困惑。
如果您能给我一个正确的学习方向,将不胜感激。
PS 在 Uri 的许可持续期间将图像复制到应用程序内存中是一种选择,但我想避免这种情况。至少看看有没有可能。
PPS 我已授予所有权限,例如相机和外部存储写入和读取。
参考答案
使用以下代码打开对话框:
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
1);
得到Activity结果如下:
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case 1: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
更多信息:https://developer.android.com/training/permissions/requesting.html
所以,在@greenapps 的大力帮助下,在模拟器和真实设备上进行测试后,解决方案是这样的:
使用另一个意图:
Intent photoPickerIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
在 onActivityResult() 中确保 Uri 的持久权限,该权限在应用重新启动后将保持不变:
Uri selectedImage = data.getData();
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) {
getContentResolver().takePersistableUriPermission (selectedImage, Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
我的应用程序允许用户查看从图库或其他位置选择的一些图像。我通过以下方式请求图片的 Uri:
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, PickerFragment.PICK_PHOTO);
然后在 onActivityResult(int requestCode、int resultCode、Intent 数据)中获取 Uri,并通过以下方式访问这些图像以将它们放入我的应用程序视图中:
Uri imageUri= data.getData();
应用程序完成后,我通过以下方式将数据库中的所有 Uri 保存为字符串:
String imageUriString = imageUri.toString();
saveToDB (imageUriString);
然而,当我重新启动应用程序并通过以下方式从我的数据库中恢复所有 Uri 时:
String imageUriString = restoreFromDB ();
imageUri = Uri.parse (imageUriString);
在 Android 7.1 中,该应用不再具有对这些 Uri 的权限。 我通过以下方式访问图像:
ContentResolver cr = mContext.getContentResolver();
InputStream is = cr.openInputStream(imageUri);
BitmapFactory.decodeStream(is, null, o);
但是收到这个异常:
java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.contentprovider.impl.MediaContentProvider from ProcessRecord
是否有一种优雅而合法的方式来保留该权限? 我试图阅读所有关于权限的文档,但感到很困惑。
如果您能给我一个正确的学习方向,将不胜感激。
PS 在 Uri 的许可持续期间将图像复制到应用程序内存中是一种选择,但我想避免这种情况。至少看看有没有可能。
PPS 我已授予所有权限,例如相机和外部存储写入和读取。
参考答案
使用以下代码打开对话框:
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
1);
得到Activity结果如下:
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case 1: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
更多信息:https://developer.android.com/training/permissions/requesting.html
所以,在@greenapps 的大力帮助下,在模拟器和真实设备上进行测试后,解决方案是这样的:
使用另一个意图:
Intent photoPickerIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
在 onActivityResult() 中确保 Uri 的持久权限,该权限在应用重新启动后将保持不变:
Uri selectedImage = data.getData();
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) { getContentResolver().takePersistableUriPermission (selectedImage, Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION); }