Android createChooser调用地图异常:Nougat无选择器仅打开谷歌地图
解决Android Nougat+中
Intent.createChooser不显示地图应用选择器的问题 我之前也碰到过完全一样的问题,核心原因是你用的是谷歌地图专属的URI链接,Android 7.0(Nougat)之后的系统Intent匹配逻辑做了调整,导致系统直接精准匹配到谷歌地图,跳过了选择器环节。
问题根源
你当前使用的http://maps.google.com/maps?q=loc:...是谷歌地图特有的链接,它的Intent Filter会被系统优先识别匹配。在Android 6.0及以下版本,系统仍会弹出选择器,但7.0+的系统会直接拉起匹配度最高的应用(也就是谷歌地图),哪怕你没有设置默认地图应用。
解决方案1:使用标准geo:协议(推荐)
最简洁且兼容性最好的方法是改用Android标准的地理位置URI协议geo:,所有主流地图应用(Waze、Sygic、谷歌地图等)都会注册这个协议的Intent Filter,这样createChooser就能正常显示所有可选应用了。
修改后的代码如下:
// 用标准geo协议构建位置URI String uri = "geo:" + 24.871560 + "," + 67.129752; Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); // 先检查是否有应用能处理该Intent,避免崩溃 if (intent.resolveActivity(getPackageManager()) != null) { Intent chooser = Intent.createChooser(intent, "Open with"); startActivity(chooser); }
解决方案2:手动构建选择器(针对谷歌地图专属URI)
如果你因为业务需求必须使用谷歌地图的专属URI,可以通过PackageManager查询所有能处理该Intent的应用,手动构建选择器,强制系统显示所有可选应用:
String uri = "http://maps.google.com/maps?q=loc:" + 24.871560 + "," + 67.129752; Intent baseIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); PackageManager pm = getPackageManager(); // 查询所有可处理该Intent的应用信息 List<ResolveInfo> resolveInfos = pm.queryIntentActivities(baseIntent, 0); if (!resolveInfos.isEmpty()) { List<Intent> intentList = new ArrayList<>(); for (ResolveInfo info : resolveInfos) { Intent appIntent = new Intent(baseIntent); // 指定每个应用的包名,确保精准唤起 appIntent.setPackage(info.activityInfo.packageName); intentList.add(appIntent); } // 创建选择器,传入第一个应用作为初始选项,其余作为额外选项 Intent chooserIntent = Intent.createChooser(intentList.remove(0), "Open with"); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentList.toArray(new Parcelable[0])); startActivity(chooserIntent); }
额外提示
- 无论哪种方案,都建议添加
resolveActivity的判断,避免因无匹配应用导致的崩溃。 geo:协议还支持添加地点标签,比如geo:24.871560,67.129752?q=Karachi,Pakistan,地图应用会直接定位到该地点并显示标签。
内容的提问来源于stack exchange,提问作者Muhammad Anas Ahmed
相关产品推荐
相关产品推荐

