问题描述
我有一个要运行其他应用程序的Android应用程序。如果尚未安装这些应用程序,我想打开PlayStore让用户安装它们:
var info : ApplicationInfo? = null
try {
info = pm.getApplicationInfo(packageName,0) as ApplicationInfo
} catch (e: PackageManager.NameNotFoundException){
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("market://details?id=$packageName")
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent)
}
if (info != null) {
val intent = pm.getintentForPackage(packageName) as Intent
context.startActivity(intent)
}
例如,此代码段到目前为止对API 26(Android 8)都有效。但是对于API 30(Android 11),getApplicationInfo()
总是抛出NameNotFoundException
,即使我已经安装了该应用程序。
这是怎么了?
解决方法
On Android 11,PackageManager
上的方法,例如getApplicationInfo()
在默认情况下不再起作用。您需要:
- 不给他们打电话,或者
- 在清单中添加
<queries>
元素,将您要查找的第三方应用列入白名单,或者 - 请求获得
MANAGE_ALL_APPS
权限(并有可能导致您的应用被Play商店禁止)
对于您来说,the <queries>
element可能是一个安全的选择,假设您要查找的应用程序ID列表在编译时是已知的。