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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:00:01