Android 13无法打开Google Map报ActivityNotFoundException问题
Android 13下无法打开Google Map导航的解决方案
问题分析
你的代码在Android 13上触发ActivityNotFoundException,核心原因是Android 13引入了包可见性限制:应用默认无法访问其他应用的组件,除非在Manifest中明确声明允许访问目标包。另外,你通过getLaunchIntentForPackage获取Intent后修改action和data的方式,不符合Google Maps官方推荐的Intent构造逻辑,在Android 13的限制下会匹配不到正确的Activity。
解决方案
1. 添加包可见性声明
在AndroidManifest.xml的<manifest>标签内添加以下内容,允许应用访问Google Maps的包:
<queries> <package android:name="com.google.android.apps.maps" /> </queries>
2. 修改导航Intent构造逻辑
放弃getLaunchIntentForPackage的方式,直接构造符合Google Maps规范的ACTION_VIEW Intent,这种方式更可靠且适配Android 13的限制:
fun openNavigation(activity: Activity, latLng: LatLng) { try { val navigationUri = Uri.parse(String.format( activity.getString(R.string.maps_navigation_query), latLng.latitude, latLng.longitude )) val intent = Intent(Intent.ACTION_VIEW, navigationUri).apply { // 指定Google Maps包,确保打开对应应用 setPackage(StringConstants.MAPS_PACKAGE_NAME) // 添加必要的flag,避免在某些场景下的异常 addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } // 先检查是否有应用能处理这个Intent(可选,但更健壮) if (intent.resolveActivity(activity.packageManager) != null) { activity.startActivity(intent) } else { // 处理无Google Maps的情况,比如提示用户安装 // Toast.makeText(activity, "未安装Google Maps", Toast.LENGTH_SHORT).show() } } catch (e: Exception) { e.printStackTrace() } }
补充说明
- 确保
R.string.maps_navigation_query的格式是Google Maps官方支持的导航URI,比如:"google.navigation:q=%f,%f"或者包含导航模式的"google.navigation:q=%f,%f&mode=d"(d代表驾车,w步行,b骑行)。 - 添加
Intent.FLAG_ACTIVITY_NEW_TASK可以避免在非Activity上下文启动时的异常,同时让导航页面在独立任务栈中打开,提升用户体验。
内容的提问来源于stack exchange,提问作者Tehleel Mir
相关产品推荐
相关产品推荐

