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

How to run Android app or install on PlayStore if unavailable for API30?

我有一个 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> 元素添加到您的清单中,将您希望查找的 third-party 应用列入白名单,或者
  • 请求 MANAGE_ALL_APPS 权限(以及 运行 您的应用程序被 Play 商店禁止的风险)

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