PackageManager queryIntentActivities查询deeplink返回空列表问题排查
根本原因
- 包可见性声明匹配规则不兼容厂商ROM
你当前在AndroidManifest.xml的标签中仅声明了 BROWSABLE类别,但绝大多数可接收https隐式Intent的应用(包括浏览器、支持深层链接的App如WhatsApp),其注册的intent filter都会同时声明android.intent.category.DEFAULT才能正常接收隐式调用。三星ROM的intent匹配规则比原生Android更严格,你当前的查询条件无法匹配到这些应用的filter,因此系统会按照包可见性规则过滤所有结果,返回空列表。 - 查询逻辑存在版本适配漏洞
你构造的跳转Intent没有添加CATEGORY_DEFAULT类别,部分系统会直接过滤掉缺少该类别的隐式Intent;同时PackageManager.MATCH_ALL标识在Android 11及以上版本和包可见性规则结合时,在定制ROM中会出现异常过滤的问题,原生Android的宽松校验能返回结果,但厂商ROM会严格执行限制。
修复方案
1. 调整AndroidManifest的queries声明
补充DEFAULT类别声明,覆盖所有可处理https链接的应用匹配规则:
<queries> <intent> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="https" /> </intent> </queries>
2. 优化查询函数逻辑
补充Intent类别,调整查询flag适配不同系统版本:
private fun hasAppToHandleIntent(context: Context, intent: Intent): Boolean { // 补充默认类别,适配普通隐式Intent的匹配规则 intent.addCategory(Intent.CATEGORY_DEFAULT) val packageManager = context.packageManager val queryFlag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 用MATCH_DEFAULT_ONLY替代MATCH_ALL,更符合隐式跳转的匹配逻辑 PackageManager.MATCH_DEFAULT_ONLY } else { 0 } val matchedApps = packageManager.queryIntentActivities(intent, queryFlag) return matchedApps.isNotEmpty() }
内容的提问来源于stack exchange,提问作者TreyWurm
相关产品推荐
相关产品推荐

