关键词: queries、QUERY_ALL_PACKAGES 、getLaunchIntentForPackage
需求:通过一个app包名,可以打开包名对应的app
一、实现方案:
Android 11 以下(kotlin):
Android 11以上(包含11)(kotlin):
- AndroidManifest中注册清单,声明包可见性: 不过这种方式只能申请过定的包名,如果我们想打开的包名是不确定的就没有办法解决了,不慌,还有一种办法,那就是申请所有软件包的可见性,不过这个是权限比较大的,一般是应用宝或者googleplay之类的APP有这个权限,普通的应用包加上这个权限,会导致在应用市场审核不通过。
- 已经声明了软件包可见性需求,就可以拉起app了。原因是:Android11及以上,谷歌权限收紧,调用
getLaunchIntentForPackage
时候,内部实现无法根据包名查询到对应activity名称了,所以获取的intent是null,也就是拉不起来了,声明后就可以查看了。
二、以下是谷歌文档参考:
1、根据包名打开App的调用Api:
2、官方文档对于声明软件包可见性需求:
在创建应用时,请务必考虑您的应用打算访问的已在设备上安装的一组其他应用。如果您的应用以 Android 11(API 级别 30)或更高版本为目标平台,在默认情况下,系统会自动让部分应用对您的应用可见,但会过滤掉其他应用。本指南将介绍如何让上述其他应用对您的应用可见。
如果您的应用以 Android 11 或更高版本为目标平台,并且需要与应用(自动可见的应用除外)交互,请在您应用的清单文件中添加 <queries>
元素。在 <queries>
元素中,按软件包名称、按 intent 签名或按 Provider 授权指定其他应用,如以下部分所述。
## 注意:如果您在应用的清单中声明了
<package>
元素,则与该软件包名称关联的应用会出现在对PackageManager
进行的任何与该应用的组件匹配的查询的结果中。
3、所有应用(不推荐)可见性声明
在极少数情况下,您的应用可能需要查询设备上的所有已安装应用或与之交互,不管这些应用包含哪些组件。为了允许您的应用看到其他所有已安装应用,系统会提供 QUERY_ALL_PACKAGES
权限。
下面列出了适合添加 QUERY_ALL_PACKAGES
权限的用例的一些示例:
- 无障碍应用
- 浏览器
- 设备管理应用
- 安全应用
- 防病毒应用
不过,在绝大多数情况下,可以通过以下方式实现您应用的用例:与一组自动可见的应用交互,并在您的清单文件中声明您的应用需要访问的其他应用。为了尊重用户隐私,您的应用应请求应用正常工作所需的最小软件包可见性。
这项来自 Google Play 的政策更新为需要 QUERY_ALL_PACKAGES
权限的应用提供了相关准则。
4、了解自动可见的软件包
系统会自动让部分应用对您的应用可见,以便您的应用可与其交互,而无需声明 <queries>
元素。此行为有助于支持基本功能和常见用例。
注意:如果您的应用以 Android 10(API 级别 29)或更低版本为目标平台,那么全部应用均会自动对您的应用可见。
4.1 自动可见的应用类型
尤其要注意,即使您的应用以 Android 11(API 级别 30)或更高版本为目标平台,以下类型的应用也始终对您的应用可见:
- 您自己的应用。
- 实现 Android 核心功能的某些系统软件包,例如媒体提供程序。
- 安装了您应用的应用。
- 使用
startActivityForResult()
方法在您的应用中启动 activity 的任何应用,正如如何获取 activity 的结果这一指南中所述。 - 启动或绑定到您应用中的某项服务的任何应用。
- 访问您应用中的 Content Provider 的任何应用。
- 具有 Content Provider 的任何应用,其中您的应用已被授予 URI 权限来访问该 Content Provider。
- 接收您应用的输入的任何应用。这种情况仅适用于您的应用作为输入法应用提供输入。
此外,您可以使用隐式或显式 intent 来启动另一应用的 activity,无论这个应用是否对您的应用可见。
4.2自动可见的系统软件包
实现 Android 核心功能的某些系统软件包会自动对您的应用可见,即使您的应用以 Android 11 或更高版本为目标平台也是如此。这组特定的软件包取决于运行您应用的设备。
如需查看特定设备的完整软件包列表,请在开发机器上的终端中运行以下命令:
在命令输出中,找到 forceQueryable
部分。本部分包含设备上自动对您的应用可见的软件包列表。