【问题标题】:How to check if items in "getPersistedUriPermissions" are the ones you need如何检查“getPersistedUriPermissions”中的项目是否是您需要的项目
【发布时间】:2015-12-17 17:12:26
【问题描述】:

当使用getPersistedUriPermissions()时,假设它已经包含一些UriPermissions,你怎么知道它们是否是你想要做的事情的正确权限?

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

以前我只是检查我是否至少有一个权限,但是当他们使用多个 SD 卡等时,这不再有效。但是我看不到一种方法来判断列表中的 UriPermission 是否是一个我需要的。示例一是:

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

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 我也偶然发现了这个。从 PersistedUriPermissions 返回的 Uris 与通过 TakePersistableUriPermission 发送的 Uris 不完全匹配。
    • @joe 确实如此。这正是 Anthony 的解决方案有效的原因 - DocumentsContract.getTreeDocumentId 返回的 Id 是名义上的,可以适当地比较是否相等(或者在他的情况下,测试“亲子关系”)
    【解决方案2】:

    您应该使用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

    【讨论】:

    • 不应该比较list.get(i).getUri().equals(myUri)吗?
    【解决方案3】:

    这是我对 checkStoragePermission 的重写

    //how to call.
    //1. save a granted perm as a string so you can pass it back in
    // example: String alreadyHavePermsString="content://com.android.externalstorage.documents/tree/3337-6133%3ASEE";
    //
    //2.create a Uri by parsing and decoding
    // example: Uri treeUri = Uri.parse(Uri.decode(alreadyHavePermsString));
    //
    //3. return a bool so you know if the permission has been granted
    // example boolean bcp = checkStoragePermissions(treeUri);
    //
    // now the function 
    private boolean checkStoragePermissions(Uri myUri) //myUri already decoded. see "how to call" #1
    {
        String sMyUri            = myUri.toString(); //%3A already decoded into a ':'
        List<UriPermission> list = getContentResolver().getPersistedUriPermissions(); //get the list
        for (int i = 0; i        < list.size(); i++)
        {
            UriPermission p = list.get(i);    //dereference to isolate the permission and make readable
            String strP     = Uri.decode(p.getUri().toString()); //decode and stringify for the equals test
            if(strP.equals    (sMyUri))
            {
                Log.d("checkstorage","found "+sMyUri); //show status
                if(p.isWritePermission()) //now i can reuse the dereferenced permission p
                {
                    return true;
                }
            }
        }
        return false;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 2013-02-04
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      相关资源
      最近更新 更多