如果API30不可用,如何运行Android应用或在PlayStore上安装?

问题描述

我有一个要运行其他应用程序的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 11PackageManager上的方法,例如getApplicationInfo()在默认情况下不再起作用。您需要:

  • 不给他们打电话,或者
  • 在清单中添加<queries>元素,将您要查找的第三方应用列入白名单,或者
  • 请求获得MANAGE_ALL_APPS权限(并有可能导致您的应用被Play商店禁止)

对于您来说,the <queries> element可能是一个安全的选择,假设您要查找的应用程序ID列表在编译时是已知的。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...