获取经纬度跳转Google地图调用startActivity崩溃问题排查
解决调用Google Maps时的ActivityNotFoundException问题
看起来你遇到的核心问题是强制指定了Google Maps的具体Activity类名,以及URI格式存在小问题,导致系统找不到对应的Activity进而引发崩溃。咱们一步步来修复:
错误原因分析
- 过时的Activity类名:你使用的
com.google.android.maps.MapsActivity是旧版Google Maps的类名,新版Google Maps的Activity类已经更新,强制指定这个旧类名会导致系统无法找到目标Activity。 - URI格式错误:你的URI里
loc:后面多了一个空格,这会导致地图应用无法正确解析经纬度信息。 - 兼容性缺失:强制绑定Google Maps的包名,会让没有安装Google Maps的设备直接崩溃,而无法引导用户选择其他可用的地图应用(比如高德、百度地图)。
修复步骤
1. 移除强制指定Activity类名的代码
删掉intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");这一行,让系统自动匹配能处理ACTION_VIEW Intent的应用,既兼容新版Google Maps,也支持其他第三方地图APP。
2. 修正URI格式
去掉loc:后面的空格,正确格式应为loc:纬度,经度,确保地图应用能准确识别经纬度位置。
3. 可选:添加Intent可用性检查(避免无地图应用时崩溃)
在启动Intent前,先检查是否有应用能处理该Intent,给用户友好提示而非直接崩溃。
修改后的完整代码
public void routReq(View view) { if(saloon.getEntity_address() != null) { // 修正URI格式,移除loc:后的空格 String uri = "http://maps.google.com/maps?q=loc:" + saloon.getEntity_address().getLatitude() + "," + saloon.getEntity_address().getLongitude() + "&mode=d"; Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(uri)); // 移除强制指定className的代码 // 可选:检查是否有可用应用处理该Intent if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } else { Snackbar.make(view, "没有可用的地图应用!", Snackbar.LENGTH_LONG).show(); } } else { Snackbar.make(view, "there's no map for this place!", Snackbar.LENGTH_LONG).show(); } }
补充说明
- 关于
InvocationTargetException:这个异常是因为startActivity抛出了ActivityNotFoundException,而你的方法是通过View点击事件反射调用的,所以被包装成了InvocationTargetException,解决根源问题后该异常会自动消失。 - 无需在你的
AndroidManifest.xml中声明Google Maps的Activity,那是Google Maps应用自身Manifest的内容。如果你的应用还没添加网络权限,记得在Manifest中补充:<uses-permission android:name="android.permission.INTERNET" />
内容的提问来源于stack exchange,提问作者Arash
相关产品推荐
相关产品推荐

