使用getPersistedUriPermissions()
时,假设它已包含一些UriPermission
,您如何知道它们是否是您正在尝试执行的操作的正确权限?
例如,如果您获得SD卡(或SD卡区域)的写入权限,并且用户将SD卡交换到另一个SD卡,则这些权限不再有效。如何检查从函数返回的列表中的权限是否可用(因此要求您再次请求权限)?
以前我只是检查我是否至少有一个权限,但是当他们使用多张SD卡等时它们不再有效。但是我没有办法知道UriPermission
是否在列表是我需要的。例子是:
UriPermission {uri=content://com.android.externalstorage.documents/tree/abcdef, modeFlags=3, persistedTime=abcdef}
答案 0 :(得分:1)
尚未经过严格测试。我还在处理Document API的复杂问题(阅读:大量设计漏洞)。
/**
* Returns the permissible root uri if one exists, null if not.
*
* @return The tree URI.
*/
public Uri getPermissibleRoot(Uri uri)
{
if (uri == null)
return null;
for (UriPermission permission : mRootPermissions)
{
// TODO: This will not work with file schemes, there might not be a way to do so...
String permissionTreeId = DocumentsContract.getTreeDocumentId(permission.getUri());
String uriTreeId = DocumentsContract.getTreeDocumentId(uri);
if (uriTreeId.startsWith(permissionTreeId))
{
return permission.getUri();
}
}
return null;
}
这是我正在处理的Android库的一部分。它还远未准备好迎接黄金时段,但我希望能够更轻松地使用Document API:
答案 1 :(得分:0)
您应该使用getPersistedUriPermissions()
来检查这样的权限:
private boolean checkStoragePermissions(){
List<UriPermission> list = getContentResolver().getPersistedUriPermissions();
for (int i = 0; i < list.size(); i++){
if(list.get(i).getUri() == myUri && list.get(i).isWritePermission()){
return true;
}
}
return false;
}
作为示例,其中myUri
可以是当前安装的SD卡上的uri。
请注意,getUri()
会返回Uri但附加content://com.android.externalstorage.documents/tree/
,并且还符合RFC 2396。
示例:我在SD卡上选择了一个名为'xyz'的文件夹,因此getUri()将返回如下内容:content://com.android.externalstorage.documents/tree/3142-4535%3Axyz