Android 筛选具有权限要求的活动

Android 筛选具有权限要求的活动,android,android-permissions,Android,Android Permissions,我试图让用户选择我的应用程序应该发送特定意图的应用程序。为了获得候选列表,queryIntentActivities()主要起作用,除了一些应用程序使用权限要求定义接受活动,因此我无法真正启动它们。那么,我可以用这些方法中的任何一种过滤掉它们吗 让PackageManager为我过滤掉它们 从ResolveInfo中,检查活动(或其父应用程序)是否需要权限,以便我可以使用checkSelfPermission()进行检查 启动活动选取器(从Android 4.1开始过滤它们),以某种方式获取所

我试图让用户选择我的应用程序应该发送特定意图的应用程序。为了获得候选列表,
queryIntentActivities()
主要起作用,除了一些应用程序使用
权限
要求定义接受活动,因此我无法真正启动它们。那么,我可以用这些方法中的任何一种过滤掉它们吗

  • PackageManager
    为我过滤掉它们
  • ResolveInfo
    中,检查活动(或其父应用程序)是否需要权限,以便我可以使用
    checkSelfPermission()
    进行检查
  • 启动活动选取器(从Android 4.1开始过滤它们),以某种方式获取所选取的活动

API Level 22有一个版本,允许您使用系统活动选择器并在广播中接收所选活动

在旧版本中,以下方法有效:

List<ResolveInfo> candidates = pm.queryIntentActivities(intent, 0);
for (int i = candidates.size() - 1; i >= 0; --i) {
    ResolveInfo resolveInfo = candidates.get(i);
    String permission = resolveInfo.activityInfo.permission;
    if (permission == null)
        permission = resolveInfo.activityInfo.applicationInfo.permission;
    if (permission != null && ContextCompat.checkSelfPermission(this, permission)
            != PackageManager.PERMISSION_GRANTED)
        candidates.remove(i);
}
List候选者=pm.querytentActivities(intent,0);
对于(int i=candidates.size()-1;i>=0;--i){
ResolveInfo ResolveInfo=candidates.get(i);
字符串权限=resolveInfo.activityInfo.permission;
if(权限==null)
权限=resolveInfo.activityInfo.applicationInfo.permission;
if(permission!=null&&ContextCompat.checkSelfPermission(this,permission)
!=PackageManager.权限(已授予)
候选人。删除(i);
}

这是这些应用程序中的一个缺陷。绝不允许导出的活动具有同样受权限保护的
PackageManager
不会帮你过滤掉它们——我曾经认为应该过滤掉,但我被谷歌工程师否决了。您的第二种方法可能有效,但
checkCallingOrSelfPermission()
不是正确答案。使用
checkSelfPermission()
。调用方的权限将不会帮助您调用受保护的活动。@Commonware值得注意的是,这些有缺陷的应用程序来自Google,请参阅。顺便提一下,这个问题说活动选取器不显示需要权限的应用程序,所以对我来说,一个折衷的选择可能是启动选取器并以某种方式获得它解析为的活动。另外,感谢您指出
checkSelfPermission()
,我将编辑这个问题。“这个问题说活动选择器不显示需要权限的应用程序”--如果是这样,这是一个相对较新的更改,因为它从来没有这样做过。@Commonware我做了一些测试:是的,它会过滤它们,也许他们听了我的话。“因此,对我来说,一个折衷的选择可能是启动选择器并以某种方式获得它解析为的活动”——然而,这仅在API级别21左右时可用。