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
相关产品推荐
相关产品推荐

