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

使用ACTION_VIEW+queryIntentActivities查询YouTube链接未返回YouTube应用

问题分析与解决方案

可能原因1:包可见性权限配置不完整

Android 11(API 30)及以上引入了包可见性限制,即便你在AndroidManifest.xml中声明了<intent>类型的<queries>,如果未限定该Intent对应的data规则,系统会默认隐藏处理特定URL的第三方应用(比如YouTube)。你当前的<queries>仅声明了ACTION_VIEW动作,没有匹配YouTube链接的具体格式,导致系统判定你的应用无需访问这类应用,因此不会返回YouTube的ResolveInfo。

可能原因2:Intent缺少必要的Category

部分应用的Intent Filter会要求Intent携带CATEGORY_BROWSABLE(用于标识可处理浏览器链接的应用),如果你的Intent未添加这个Category,可能无法匹配到YouTube的Intent Filter。


对应的解决方法

1. 完善包可见性配置

修改AndroidManifest.xml中的<queries>,添加匹配YouTube链接的data规则,确保系统允许你的应用发现处理这类链接的应用:

<queries>
    <intent>
        <action android:name="android.intent.action.VIEW" />
        <data 
            android:scheme="https"
            android:host="youtube.com"
            android:pathPrefix="/watch" />
        <data 
            android:scheme="https"
            android:host="www.youtube.com"
            android:pathPrefix="/watch" />
    </intent>
</queries>

配置后,系统会识别到你的应用需要访问能处理https://youtube.com/watch或https://www.youtube.com/watch链接的应用,进而返回YouTube的ResolveInfo。

2. 为Intent添加CATEGORY_BROWSABLE

修改Kotlin函数,构建Intent时添加CATEGORY_BROWSABLE:

private fun findAppsToOpenLinks(context: Context, url: String): List<ResolveInfo> {
    val intent = Intent(Intent.ACTION_VIEW).apply {
        data = url.toUri()
        addCategory(Intent.CATEGORY_BROWSABLE) // 添加该Category
    }
    val list = if (Build.VERSION.SDK_INT >= 33) {
        context.packageManager.queryIntentActivities(
            intent,
            PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_ALL.toLong())
        )
    } else {
        context.packageManager.queryIntentActivities(intent, 0)
    }
    return list
}

3. 验证Uri的正确性

确保传入的url格式无误,无多余转义字符。可以用Uri.parse(url)替代url.toUri(),前者处理标准URL时更稳妥:

data = Uri.parse(url)

内容的提问来源于stack exchange,提问作者prom85

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:43:24