Android打开Waze和Google地图的意图

有一些类似的post,但我找不到一个确切的post。 基本上,我想以同样的意图打开Goog​​le地图和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地图打开了正确的位置。 然后我意识到谷歌地图没有在该位置放置一个引脚,因此用户很难知道它到底在哪里。 所以我环顾四周,意识到Google地图需要“?q = ..(标签)”…我将uri构造更改为:

 final String uri = String.format(Locale.ENGLISH, "geo:%f,%f?q=%f,%f (%s)", latitude, longitude, latitude, longitude, name); 

但随后Waze做了两件事:导航到正确的地方并在标签上搜索。 这要求用户单击后退按钮以关闭搜索结果屏幕并保持导航到正确的位置。

我到处寻找答案,但未能find能够实现两者的解决方案。 起初我认为这是不可能的,Waze有一个bug …但后来我注意到Facebook Messenger正在做我想要的。 当点击带有位置的消息时,它将打开两个应用程序:Google地图将有一个图钉(带有标签),Waze将直接导航到该位置而不运行搜索。

关于上述问题的几个问题:1。(当然)我怎样才能做到这一点? 2.我怎么知道Facebook Messenger的意图是如何构建的? (无论如何我都可以抓住它)3。标签只有“?q = ..”的原因是什么?

谢谢

没关系。 我能够使用下面的应用拦截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 ..

谢谢

按照Nimrod的提示,我安装了应用程序,并从whatsapp的位置function中截取了意图。 这是在地图和waze上测试的完整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); 

我打开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(); } }