Android 如何检查“中的项目”;GetPersistedUserPermissions";是你需要的吗

Android 如何检查“中的项目”;GetPersistedUserPermissions";是你需要的吗,android,android-5.0-lollipop,android-sdcard,android-external-storage,Android,Android 5.0 Lollipop,Android Sdcard,Android External Storage,使用getPersistedUriPermissions()时,假设它已经包含一些UriPermissions,您如何知道它们是否是您尝试执行的操作的正确权限 例如,如果您获得SD卡(或SD卡的某个区域)的写入权限,并且用户将SD卡交换到另一个SD卡,则这些权限不再有效。如何检查从函数返回的列表中的权限是否可用(因此需要再次请求权限) 以前我只是检查我是否至少有一个权限,但当他们使用多个SD卡等时,这就不起作用了。。但是,我没有办法判断列表中的UriPermission是否是我需要的权限。例如:

使用
getPersistedUriPermissions()
时,假设它已经包含一些
UriPermission
s,您如何知道它们是否是您尝试执行的操作的正确权限

例如,如果您获得SD卡(或SD卡的某个区域)的写入权限,并且用户将SD卡交换到另一个SD卡,则这些权限不再有效。如何检查从函数返回的列表中的权限是否可用(因此需要再次请求权限)

以前我只是检查我是否至少有一个权限,但当他们使用多个SD卡等时,这就不起作用了。。但是,我没有办法判断列表中的
UriPermission
是否是我需要的权限。例如:

UriPermission {uri=content://com.android.externalstorage.documents/tree/abcdef, modeFlags=3, persistedTime=abcdef}

这还没有经过严格的测试。我仍然在研究文档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库的一部分。它还远没有准备好进入黄金时段,但我希望能够更轻松地使用文档API:


您应该使用
getPersistedUripmissions()
检查如下权限:

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;
    }
private boolean checkStoragePermissions(){
List List=getContentResolver().GetPersistedUserPermissions();
对于(int i=0;i
例如,
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

比较不应该是
list.get(i).getUri().equals(myUri)
?我也偶然发现了这一点。从PersistedUriPermission返回的URI与通过TakePersistableUriPermission发送的URI不完全匹配。@joe确实如此。这正是Anthony的解决方案起作用的原因—
DocumentsContract.getTreeDocumentId
返回的ID是名义上的,可以进行适当的平等比较(或者在他的情况下,测试“亲子关系”)