You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 01:52:37