如何检查" getPersistedUriPermissions"是你需要的

时间:2015-12-17 17:12:26

标签: android android-5.0-lollipop android-sdcard android-external-storage

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

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

以前我只是检查我是否至少有一个权限,但是当他们使用多张SD卡等时它们不再有效。但是我没有办法知道UriPermission是否在列表是我需要的。例子是:

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

2 个答案:

答案 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:

https://github.com/rcketscientist/DocumentActivity

答案 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