Android打算打开Waze和谷歌地图



有一些类似的帖子,但我找不到确切的。基本上,我想打开谷歌地图和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直接导航到正确的位置,谷歌地图打开了正确的位置。然后我意识到谷歌地图上没有一个位置,所以用户很难知道它到底在哪里。所以我环顾四周,意识到谷歌地图需要"?q=..(标签)"。。。我将uri结构更改为:

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

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

我到处寻找答案,但没能找到一个同时实现这两个目标的解决方案。起初我认为这是不可能的,Waze有一个bug。。。但后来我注意到Facebook信使正在做我想做的事。当点击带有位置的消息时,它将打开两个应用程序:谷歌地图将有一个别针(带标签),Waze将直接导航到该位置,而不进行搜索。

关于以上内容,有几个问题:1.(当然)我怎样才能做到这一点?2.我怎么知道Facebook信使的意图是如何构建的?(不管怎样,我能赶上吗?)3.只有"?q=.."标签的原因是什么?

感谢

没关系。我能够用下面的应用程序拦截Facebook信使,并认为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=W251bGwsMSwyLDEsInVrLmNvLmFzaHRvbmJyc2MuYW5kcm9pZC5pbnRlbnRlcmNlcHQiXQ。。

感谢

根据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);

我也遇到了同样的问题——希望导航应用程序(无论是什么)显示一个pin(最好是带有自定义标签),并准备好在那里导航用户。然而,在查询中有标签会导致一些应用程序运行搜索,或者(更糟的是)假设最接近标签的地址匹配,并将其显示为目的地(忽略坐标)。因此,为了实现可靠的行为,我不得不忘记有一个命名标签,最终得到了以下内容:

final String geoIntentData = "geo:" + latitude + "," + longitude + "?q=" + latitude + "," + longitude;
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(geoIntentData));

到目前为止,它适用于我测试的所有应用程序(谷歌地图、Waze、Sygic、Moovit,甚至Komot和Windy地图)。如果您尝试此解决方案,但在其他应用程序中不起作用,请告诉我!

我打开Waze&谷歌地图应用程序获取方向(工作起来很有魅力):

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

最新更新