用于打开 Waze 和 Google 地图的 Android 意图
Posted
技术标签:
【中文标题】用于打开 Waze 和 Google 地图的 Android 意图【英文标题】:Android intent for opening both Waze and Google maps 【发布时间】:2014-10-29 01:09:18 【问题描述】:有一些类似的帖子,但我找不到确切的帖子。基本上,我想以相同的意图打开谷歌地图和 Waze。一开始我试过这个:
final String uri = String.format(Locale.ENGLISH, "geo:%f,%f", latitude, longitude);
final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(intent);
Waze 直接导航到正确的位置,Google 地图打开了正确的位置。然后我意识到谷歌地图并没有在位置上放置图钉,所以用户很难知道它的确切位置。所以我环顾四周,意识到谷歌地图需要“?q = ..(标签)”......我将uri结构更改为:
final String uri = String.format(Locale.ENGLISH, "geo:%f,%f?q=%f,%f (%s)", latitude, longitude, latitude, longitude, name);
但是 Waze 做了两件事:导航到正确的位置并在标签上运行搜索。这要求用户单击返回按钮以关闭搜索结果屏幕并保持导航到正确的位置。
我到处寻找答案,但未能找到同时实现两者的解决方案。 起初我认为这是不可能的,而且 Waze 有一个错误……但后来我注意到 Facebook Messenger 正在做我想做的事。单击带有位置的消息时,它将打开两个应用程序:Google 地图将有一个图钉(带有标签),而 Waze 将直接导航到该位置而无需运行搜索。
关于上述的几个问题: 1.(当然)我怎样才能做到这一点? 2. 我如何知道 Facebook Messenger 的意图是如何构建的? (无论如何我可以抓住它) 3. 标签只有“?q=..”的原因是什么?
谢谢
【问题讨论】:
您能否发布要求用户在 Waze 和 Google 地图之间进行选择的代码? 【参考方案1】:没关系。我能够使用以下应用拦截 Facebook Messenger,并认为 URI 应如下所示:
String.format(Locale.ENGLISH, "geo:0,0?q=") + android.net.Uri.encode(String.format("%s@%f,%f", label, latitude, longitude), "UTF-8");
应用程序: https://play.google.com/store/apps/details?id=uk.co.ashtonbrsc.android.intentintercept&feature=search_result#?t=W251bGwsMSwyLDEsInVrLmNvLmFzaHRvbmJyc2MuYW5kcm9pZC5pbnRlbnRpbnRlcmNlcHQiXQ..
谢谢
【讨论】:
谢谢 - 帮我解决了这个问题! 这仅在标签包含地址时有效:(仅当您删除标签时,Waze 才会导航,并且只有当您拥有标签时,谷歌地图才会导航【参考方案2】:按照 Nimrod 的提示,我安装了应用程序并从 whatsapp 的位置功能中截获了意图。以下是在地图和位智上测试的完整 Intent:
String uri = "http://maps.google.com/maps?q=loc:"+latitude+","+longitude+" ("+label+")";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
intent.setFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
intent.setData(Uri.parse(uri));
startActivity(intent);
【讨论】:
【参考方案3】:我打开 Waze 和 GoogleMap 应用程序以获取方向的最终解决方案(就像魅力一样):
String uri = "";
Intent intent;
try
uri = String.format(Locale.ENGLISH,"geo:" + location.getLat() + "," +location.getLng() + "?q=" + location.getLat()+","+location.getLng()+" ("+location.getName()+")");
intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
catch (ActivityNotFoundException ex)
try
Intent unrestrictedIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(unrestrictedIntent);
catch (ActivityNotFoundException innerEx)
getSnackbar(getResources().getString(R.string.map_install_application), Snackbar.LENGTH_LONG).show();
【讨论】:
【参考方案4】:我遇到了同样的问题 - 希望导航应用程序(无论它是什么)显示一个图钉(最好带有自定义标签)并准备在那里导航用户。但是,在查询中有标签会导致某些应用程序运行搜索,或者(更糟糕的是)假设最近的地址与标签匹配并将其显示为目的地(忽略坐标)。因此,为了实现可靠的行为,我不得不忘记使用命名标签并最终得到以下结果:
final String geoIntentData = "geo:" + latitude + "," + longitude + "?q=" + latitude + "," + longitude;
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(geoIntentData));
到目前为止,它适用于我测试过的所有应用程序(Google Maps、Waze、Sygic、Moovit 甚至 Komoot 和 Windy Maps)。如果您尝试此解决方案但它在其他应用中不起作用,请告诉我!
【讨论】:
以上是关于用于打开 Waze 和 Google 地图的 Android 意图的主要内容,如果未能解决你的问题,请参考以下文章
使用 Intent.createChooser 使用 Waze 和 Google Maps 进行导航显示 Waze 图标两次