Android 11中packageManager.resolveActivity返回null如何解决?
问题根因
Android 11 引入了包可见性过滤机制,你之前的 <queries> 配置不符合规则,导致无法查询到可处理目标Intent的应用:
scheme="*"通配符不适用于<data>标签的scheme属性,包可见性规则要求scheme必须显式声明具体值- 注释掉
<data>标签后,规则无法匹配你实际使用的https协议场景,查询结果自然为空
可行解决方案
方案1:修正Manifest的queries配置
根据你实际使用的协议,显式声明对应的scheme:
<queries> <!-- 匹配https链接的VIEW action --> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="https" /> </intent> <!-- 如果需要支持http链接可额外添加 --> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="http" /> </intent> </queries>
配置完成后重新构建安装,原有resolveActivity逻辑即可正常返回结果。
方案2:直接跳转加异常捕获(更稳妥)
如果你的最终目的是跳转对应页面,不需要提前判断是否有可处理应用,可以直接调用startActivity并捕获异常,兼容性更强,不需要额外配置包可见性:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.yahoo.com")); try { startActivity(intent); // 跳转成功的后续逻辑 } catch (ActivityNotFoundException e) { // 无可用处理应用,自行实现提示逻辑 }
方案3:使用queryIntentActivities替代
如果确实需要提前校验是否有可处理应用,也可以用queryIntentActivities方法配合修正后的queries配置使用:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.yahoo.com")); List<ResolveInfo> resolveList = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); boolean hasValidHandler = !resolveList.isEmpty();
内容的提问来源于stack exchange,提问作者lannyf
相关产品推荐
相关产品推荐

