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

Android 13及以上使用Intent.resolveActivity检测Waze应用存在失效

Android 13+ 检测Waze应用存在性失败的解决方案

问题原因

Android 13(API 33)及以上版本引入了包可见性限制:默认情况下,应用无法查询未明确声明的第三方应用的存在。你的检测函数返回false,是因为系统没有授予应用访问Waze包信息的权限;而谷歌地图能正常检测,大概率是因为它属于系统预装应用,被默认允许访问。

解决方案

方法1:精确声明要查询的包(推荐)

在AndroidManifest.xml中添加<queries>标签,明确声明需要访问的Waze包名,这是Google推荐的合规方式,无需申请敏感权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 其他manifest内容 -->
    <queries>
        <!-- 声明需要查询Waze应用 -->
        <package android:name="com.waze" />
    </queries>
</manifest>

方法2:使用QUERY_ALL_PACKAGES权限(仅必要时)

如果你的应用需要查询大量第三方应用且无法提前明确包名,可以申请QUERY_ALL_PACKAGES敏感权限。注意:该权限属于敏感权限,可能影响应用上架审核,需确保有合理使用场景:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
        android:maxSdkVersion="33" /> <!-- 可选:限制仅在Android 13+使用 -->
    <!-- 其他manifest内容 -->
</manifest>

代码优化(可选)

可以简化检测函数的写法,使用PackageManager.MATCH_DEFAULT_ONLY标志确保匹配结果更准确:

fun isWazeExist(context: Context): Boolean {
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://waze.com/ul?q=Hawaii"))
        .setPackage("com.waze")
    return context.packageManager.resolveActivity(
        intent,
        PackageManager.MATCH_DEFAULT_ONLY
    ) != null
}

内容的提问来源于stack exchange,提问作者Phoebe Huang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:58:20