Google TV中检测AMATI_EXPERIENCE类待安装应用的技术咨询
问题描述
我有一套能实现应用跳转(context.startActivity(intent))的运行环境,原本用以下代码检测应用是否安装,避免跳转未安装应用失败。但在Google TV上,针对可通过“AMATI_EXPERIENCE”安装的应用,这套检测代码失效,跳转Viaplay应用时抛出异常,请问怎么通过代码检测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 } }
跳转时抛出的异常
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) ...
解决方案
Google TV的AMATI_EXPERIENCE机制允许应用无需完整安装即可启动,这类应用不会出现在常规已安装包列表中,所以原有的getPackageInfo检测方法失效。可以通过以下两种方式处理:
1. 直接捕获跳转异常并引导安装
既然无法提前检测,直接在跳转时捕获ActivityNotFoundException,然后引导用户到应用商店安装目标应用:
fun launchViaplay(context: Context, url: String) { val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply { package = "com.viaplay.android" flags = Intent.FLAG_ACTIVITY_NEW_TASK } try { context.startActivity(intent) } catch (e: ActivityNotFoundException) { // 跳转至Google TV应用商店页面 val marketIntent = Intent(Intent.ACTION_VIEW).apply { data = Uri.parse("market://details?id=com.viaplay.android") flags = Intent.FLAG_ACTIVITY_NEW_TASK } if (marketIntent.resolveActivity(context.packageManager) != null) { context.startActivity(marketIntent) } } }
2. 检测跳转Intent的可处理性
比起检测包是否存在,直接验证你的跳转Intent能否被系统处理,能覆盖Google TV的特殊场景:
fun isIntentResolvable(context: Context, intent: Intent): Boolean { return intent.resolveActivity(context.packageManager) != null } // 使用示例 val viaplayIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://viaplay.no/...")).apply { package = "com.viaplay.android" } if (isIntentResolvable(context, viaplayIntent)) { context.startActivity(viaplayIntent) } else { // 处理无法跳转的情况,比如引导安装 }
内容的提问来源于stack exchange,提问作者Friesgaard
相关产品推荐
相关产品推荐

