targetSdkVersion升级到30后Android11设备Intent打开地图、拨号功能失效
Android 11 包可见性导致Intent跳转失败解决方案
问题根因
当应用targetSdkVersion升级到30及以上时,Android 11及更高版本系统默认开启包可见性过滤机制:应用默认只能查询到系统预装应用和少量公开匹配的第三方应用信息,你代码中调用intent.resolveActivity(packageManager)时会返回null,导致拨号、打开地图、跳转应用商店的逻辑被拦截。
修复方案
无需修改原有业务代码,只需在AndroidManifest.xml中新增和<application>节点同级的<queries>声明,配置你需要用到的Intent匹配规则即可:
<manifest ...> <!-- 包可见性声明,和application节点同级 --> <queries> <!-- 匹配拨号盘跳转逻辑 --> <intent> <action android:name="android.intent.action.DIAL" /> <data android:scheme="tel" /> </intent> <!-- 匹配地图跳转逻辑 --> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="geo" /> </intent> <!-- 匹配应用商店market协议跳转逻辑 --> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="market" /> </intent> <!-- 匹配网页版应用商店跳转的备用逻辑 --> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="https" /> </intent> </queries> <application ...> <!-- 原有配置保持不变 --> </application> </manifest>
注意事项
- 如果你需要适配的场景较多不想逐个声明,可以申请
QUERY_ALL_PACKAGES权限,但该权限属于Google Play敏感权限,上架时需要提交明确的使用场景说明进行审核,非特殊需求不推荐使用。 - 上述配置添加完成后原有业务代码无需修改,即可正常运行。
内容的提问来源于stack exchange,提问作者Hamza Khan
相关产品推荐
相关产品推荐

