我的应用程序通过java.lang.SecurityException
收到了几个崩溃报告。当app尝试获取对其图像中选择的图像URI用户的持久权限时,会发生这种情况。
选择图像的方法是通过意图:
public static Intent openGalleryToSelectImages(Activity a)
{
Intent intent = new Intent();
// Set action
if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
}
else {
intent.setAction(Intent.ACTION_GET_CONTENT);
}
// Set MIME type and allow multiple selection
intent.setType("image/*");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
}
a.startActivityForResult(Intent.createChooser(intent,"Select Picture"), Communication.REQUEST_SELECT_IMAGES_FROM_GALLERY);
return intent;
}
然后我在收到的URI数组上执行一些操作。 当对于每个URI,我尝试获得持久的读取权限时发生崩溃:
activity.grantUriPermission(activity.getPackageName(), uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
activity.getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
但是我无法弄清楚那是什么问题。 除此之外,该应用程序在多个智能手机上运行良好,因此它似乎与特定供应商绑定。
编辑: 我无法对设备进行深度分析导致崩溃。 在我的开发设备上,图像的URI类似于:
content://com.android.providers.media.documents/document/image%3A796
答案 0 :(得分:0)
您无法向自己授予权限。
您要求其他应用程序(例如图库)向您提供资源的Uri,如果该应用程序写得很好,它会在您返回时授予您的应用程序对该Uri的读取权限。
不幸的是,一些图库应用程序(包括一个着名的Android手机制造商的应用程序)不会给你任何东西。
这就是我们最终必须请求READ_EXTERNAL_STORAGE
权限的方式。这也意味着您需要在适当的时候在Android 6+上请求运行时权限。
当我绝对需要时,我最终抓住了SecurityException
并请求运行时权限。
课程学到了很多方法:当你在onRequestPermissionsResult
取回正面结果时,你的活动处于停止状态。如果您立即离开(例如在回调中调用startActivity
),则无法保存状态并且会丢失对成员变量的任何更改。现在将您需要的内容放入成员变量中,但将startActivity
推迟到onResume
。