我正在使用Storage Access Framework来获取SD卡上的写访问权限(API> = 21)。
它在大多数设备上都可以正常工作,但是像Galaxy S7(Edge,API 23)这样的设备在调用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设备上都出现此异常。我已经在2台设备上成功测试了代码,但是此设备引发了SecurityException。
我可以在SAF的呼叫中添加一些标志吗?
intent.addFlags(
Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION |
Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
任何帮助表示赞赏。
最佳答案
我尝试在grantUriPermission
之前添加takePersistableUriPermission
,这对我来说是唯一可以避免系统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());
}
}