我有一个工作设置,可以将应用程序跳转(
context.startActivty(intent)
)到其他应用程序。如果应用程序未安装,这将失败,因此我们使用下面的代码来检查它。但是,在 Google TV 上,当可以使用“AMATI_EXPERIENCE
”安装应用程序时,此代码将失败!
有谁知道如何在代码中检测应用程序是否未像 Google TV 上那样安装?
fun isPackageInstalled(context: Context, packageName: String): Boolean =
packageInfo(context, packageName) != null
fun packageInfo(context: Context, packageName: String): PackageInfo? {
return try {
context.packageManager.getPackageInfo(packageName, 0)
} catch (e: PackageManager.NameNotFoundException) {
null
}
}
启动 Viaplay 活动时抛出异常
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=https://viaplay.no/... flg=0x10000000 pkg=com.viaplay.android }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2239)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1878)
at android.app.ContextImpl.startActivity(ContextImpl.java:1132)
at android.app.ContextImpl.startActivity(ContextImpl.java:1103)
at android.content.ContextWrapper.startActivity(ContextWrapper.java:436)
...
我在
PackageManager
上找到了一个替代调用,它触发了应用程序下载,所以它至少不会崩溃:
context.packageManager.getLaunchIntentForPackage(packageName)
结合支票,会是这样的
fun isPackageInstalled(context: Context, packageName: String): Boolean =
packageInfo(context, packageName) != null &&
context.packageManager.getLaunchIntentForPackage(packageName) != null
注意:在 Amazon Prime 上测试该功能不起作用,但使用
getLeanbackLaunchIntentForPackage("com.amazon.amazonvideo.livingroom")
却可以。