我正在使用存储访问框架来获得对SD卡的写访问权限(API >= 21)。
它在大多数设备上都工作得很好,但像Galaxy S7 (Edge,API23)这样的设备在调用takePersistableUriPermission()时会抛出SecurityException。
Caused by: java.lang.SecurityException: No persistable permission grants found for UID 10150 and Uri 0 @ content://com.android.externalstorage.documents/tree/70CD-6B92代码:
//call the SAF
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, Config.REQUEST_SAF);
//Persist permissions
int flags = resultData.getFlags();
flags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
this.getContentResolver().takePersistableUriPermission(treeUri, flags); //throws exception并不是所有的S7设备都会出现这种异常。我已经在两台设备上成功地测试了代码,但这一台抛出了SecurityException。
我可以在SAF的呼叫中添加一些标志吗?
intent.addFlags(
Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION |
Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);任何帮助都是非常感谢的。
发布于 2018-03-27 16:36:25
我尝试在takePersistableUriPermission之前添加grantUriPermission,这是唯一能避免系统SecurityException抛出的错误的方法
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
try {
getContext().grantUriPermission(getContext().getPackageName(), uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
} catch (IllegalArgumentException e) {
// on Kitkat api only 0x3 is allowed (FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION)
getContext().grantUriPermission(getContext().getPackageName(), uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
} catch (SecurityException e) {
Log.e("", e.toString());
}
try {
int takeFlags = intent.getFlags();
takeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
getContext().getContentResolver().takePersistableUriPermission(uri, takeFlags);
} catch (SecurityException e) {
Log.e("", e.toString());
}
}发布于 2016-06-24 00:53:09
尝试添加此flag
intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);https://stackoverflow.com/questions/37993762
复制相似问题