有一些类似的帖子,但我找不到一个确切的帖子。基本上,我想以同样的意图打开Google地图和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做了两件事:导航到正确的地方并在标签上搜索。这要求用户单击后退按钮以关闭搜索结果屏幕并保持导航到正确的位置。
我到处寻找答案,但未能找到能够实现两者的解决方案。 起初我认为这是不可能的,Waze有一个错误...但后来我注意到Facebook的信使正在做我想要的。当点击带有位置的消息时,它将打开两个应用程序:Google地图将有一个引脚(带有标签),Waze将直接导航到该位置而不运行搜索。
关于上述问题的几个问题: 1.(当然)我怎样才能做到这一点? 2.我怎么知道Facebook信使的意图是如何构建的? (无论如何我可以抓住它) 3.标签只有"?q = .."?
背后的原因是什么?由于
答案 0 :(得分:18)
没关系。我能够通过以下应用拦截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");
由于
答案 1 :(得分:3)
按照Nimrod的提示,我已经安装了应用程序并从whatsapp的位置功能中拦截了意图。这里是在地图上测试的完整意图和waze:
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);
答案 2 :(得分:1)
我打开Waze& amp;的最终解决方案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();
}
}