过滤具有权限要求的活动
Filter activities with permission requirements
我正在尝试让用户选择我的应用程序应向其发送特定意图的应用程序。要获得候选人名单,queryIntentActivities()
大部分都有效,除了一些应用程序定义接受 activity 和 permission
要求,所以我无法真正启动它们。那么,我可以通过以下任何一种方式过滤掉它们吗?
- 让
PackageManager
帮我过滤掉它们。
- 从
ResolveInfo
,检查 activity(或其父应用程序)是否需要许可,以便我可以使用 checkSelfPermission()
进行检查。
- 启动 activity 选择器(自 Android 4.1 起过滤它们)并以某种方式获得被选择的 activity。
API 22 级有一个 createChooser() 版本,让您可以使用系统 activity 选择器并在广播中接收选择的 activity。
在旧版本中,以下方法有效:
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);
}
我正在尝试让用户选择我的应用程序应向其发送特定意图的应用程序。要获得候选人名单,queryIntentActivities()
大部分都有效,除了一些应用程序定义接受 activity 和 permission
要求,所以我无法真正启动它们。那么,我可以通过以下任何一种方式过滤掉它们吗?
- 让
PackageManager
帮我过滤掉它们。 - 从
ResolveInfo
,检查 activity(或其父应用程序)是否需要许可,以便我可以使用checkSelfPermission()
进行检查。 - 启动 activity 选择器(自 Android 4.1 起过滤它们)并以某种方式获得被选择的 activity。
API 22 级有一个 createChooser() 版本,让您可以使用系统 activity 选择器并在广播中接收选择的 activity。
在旧版本中,以下方法有效:
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);
}