【问题标题】:How to get all granted permissions of a app如何获得应用程序的所有授予权限
【发布时间】:2016-10-21 18:04:50
【问题描述】:

我想获得所有授予的权限。我知道我可以通过packageinfo.requestedPermissions 获得所有请求的权限,但我想知道授予权限的列表,并且授予的权限可能比在 android M 的情况下请求的要少。所以我只想知道有没有办法获得列表所有授予的权限?

我从请求的权限列表中知道,我可以检查是否已授予该权限,但我想知道所有已授予权限的列表。不想检查每个请求的权限。

【问题讨论】:

  • 我不明白编写一个循环遍历requestedPermissions 并检查相应的requestedPermissionsFlags 元素是否包含REQUESTED_PERMISSION_GRANTED 的问题是什么。这就是旗帜的用途。如果您需要多次执行此操作,请为其创建一个函数。
  • 谢谢,没问题,我只是想有办法获取所有授予权限的列表,但现在我认为它不会按照你的建议去做。您也可以为此写答案,这比其他答案更好。

标签: android


【解决方案1】:

返回给定包已请求和授予的所有权限的简单函数如下所示:

List<String> getGrantedPermissions(final String appPackage) {
    List<String> granted = new ArrayList<String>();
    try {
        PackageInfo pi = getPackageManager().getPackageInfo(appPackage, PackageManager.GET_PERMISSIONS);
        for (int i = 0; i < pi.requestedPermissions.length; i++) {
            if ((pi.requestedPermissionsFlags[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0) {
                granted.add(pi.requestedPermissions[i]);
            }
        }
    } catch (Exception e) {
    }
    return granted;
}

请注意,这需要 API 级别 16 或更高,但希望这在现在不是问题。

【讨论】:

  • 有没有办法获得授予应用程序的所有权限组?
  • @Michael : 你能解释一下这个语句实际上做了什么吗 (pi.requestedPermissionsFlags[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0
  • requestedPermissionsFlags 是包含在&lt;manifest&gt; 下的所有&lt;uses-permission&gt; 标签的标志数组。而REQUESTED_PERMISSION_GRANTEDrequestedPermissionsFlags 中条目的位掩码,用于检查请求的权限当前是否已授予应用程序。
  • 为了安全起见,“标志”测试应该是if ((pi.requestedPermissionsFlags[i] &amp; PackageInfo.REQUESTED_PERMISSION_GRANTED) == PackageInfo.REQUESTED_PERMISSION_GRANTED)
  • 我不知道为什么,但是这个函数没有返回某些应用程序的权限!
【解决方案2】:

您可以一一查看权限并添加到列表中:

// 我们应该给出解释吗?

        List<String> listPermissionsNeeded = new ArrayList<>();
        // No explanation needed, we can request the permission.
        if((ContextCompat.checkSelfPermission(context,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED))
        {
            listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
        if((ContextCompat.checkSelfPermission(context,
                Manifest.permission.GET_ACCOUNTS)
                != PackageManager.PERMISSION_GRANTED))
        {
            listPermissionsNeeded.add(Manifest.permission.GET_ACCOUNTS);
        }
        if((ContextCompat.checkSelfPermission(context,
                Manifest.permission.ACCESS_COARSE_LOCATION)
                != PackageManager.PERMISSION_GRANTED))
        {
            listPermissionsNeeded.add(Manifest.permission.ACCESS_COARSE_LOCATION);
        }
        if((ContextCompat.checkSelfPermission(context,
                Manifest.permission.ACCESS_COARSE_LOCATION)
                != PackageManager.PERMISSION_GRANTED))
        {
            listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }
        if((ContextCompat.checkSelfPermission(context,
                Manifest.permission.READ_PHONE_STATE)
                != PackageManager.PERMISSION_GRANTED))
        {
            listPermissionsNeeded.add(Manifest.permission.READ_PHONE_STATE);
        }
        if (!listPermissionsNeeded.isEmpty()) {
            ActivityCompat.requestPermissions(context,
                    listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),
                    MY_PERMISSIONS_REQUEST_MULTIPLE_PERMISSION);
        }

【讨论】:

    猜你喜欢
    • 2012-04-29
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 2020-11-22
    • 1970-01-01
    相关资源
    最近更新 更多