使用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
相关产品推荐
相关产品推荐

