通过Android上的意图启动Google Maps Directions


Answers:


630

您可以使用如下形式:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW, 
    Uri.parse("http://maps.google.com/maps?saddr=20.344,34.34&daddr=20.5666,45.345"));
startActivity(intent);

要从当前位置开始导航,请删除saddr参数和值。

您可以使用实际的街道地址代替经纬度。但是,这将为用户提供一个对话框,供您选择是通过浏览器还是Google Maps打开它。

这将直接在导航模式下启动Google地图:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
    Uri.parse("google.navigation:q=an+address+city"));

更新

2017年5月,Google启动了适用于通用,跨平台Google Maps URL的新API:

https://developers.google.com/maps/documentation/urls/guide

您也可以将Intent与新API结合使用。


2
不是我知道的。但是,如果用户已经选择了默认应用程序以将这种类型的意图打开为地图应用程序,则不会出现任何对话框。
1

111
如果您想摆脱该对话框,则可以提示您要使用哪个软件包。在startActivity()之前添加以下内容: intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
Jeremy Logan

以及如何伪装在导航器而不是googlemaps应用程序上显示?
NullPointerException

68
当用户可能会喜欢他们喜欢的其他应用时,强迫用户进行特定的活动似乎与将Android精神捆绑在一起对我而言是相反的。我很想让意图过滤器来处理这里的事情。
superluminary 2012年

15
导航意图似乎现在可以正式支持:developers.google.com/maps/documentation/android/...
Sanketh凯塔

124

这有点离题,因为您询问了“路线”,但您也可以使用Android文档中描述的Geo URI方案:

http://developer.android.com/guide/appendix/g-app-intents.html

使用“ geo:latitude,longitude”的问题是Google地图仅以您的位置为中心,没有任何图钉或标签。

这非常令人困惑,尤其是当您需要指向一个精确的位置或/和询问方向时。

如果您使用查询参数“ geo:lat,lon?q = name”来标记您的地理位置,它将使用查询进行搜索并关闭纬度/经度参数。

我找到了一种以纬度/经度为中心的地图,并显示带有自定义标签的图钉的方法,该图非常易于显示,并且在询问方向或其他任何操作时非常有用:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW, 
Uri.parse("geo:0,0?q=37.423156,-122.084917 (" + name + ")"));
startActivity(intent);

注意(@TheNail提供):在Maps v.7(撰写本文时为最新版本)中不起作用。将忽略坐标并搜索括号之间具有给定名称的对象。另请参阅包含位置的Google Maps 7.0.0的意图


3
好的,默认的geo:0,0只是将地图移到了那里。此解决方案[“ geo:0,0?q = 37.423156,-122.084917(” +名称+“)”]允许您输入自己的标记名称。谢谢。
gnac

4
效果很好-fyi似乎无法与“ z”查询参数(缩放级别)结合使用
scolestock 2012年

1
是否可以在意图中设置默认的运输模式。默认情况下,选择汽车选项。我可以将步行设置为默认模式吗?
2013年

6
你为什么不使用geo:37.423156,-122.084917?q=37.423156,-122.084917 ...
13年

1
确保您对标签参数进行urlEncode。我遇到空格等特殊字符的问题。
伊桑(Ethan)'18年

100

尽管当前答案很不错,但没有一个可以满足我的要求,我只想打开地图应用,为每个源位置和目的地添加一个名称,使用geo URI方案对我来说不起作用根本上,并且地图Web链接没有标签,因此我想出了这个解决方案,该解决方案实质上是此处其他解决方案和评论的结合,希望这对其他查看此问题的人有所帮助。

String uri = String.format(Locale.ENGLISH, "http://maps.google.com/maps?saddr=%f,%f(%s)&daddr=%f,%f (%s)", sourceLatitude, sourceLongitude, "Home Sweet Home", destinationLatitude, destinationLongitude, "Where the party is at");
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setPackage("com.google.android.apps.maps");
startActivity(intent);

要将您当前的位置用作起点(很遗憾,我还没有找到标记当前位置的方法),请使用以下命令

String uri = String.format(Locale.ENGLISH, "http://maps.google.com/maps?daddr=%f,%f (%s)", destinationLatitude, destinationLongitude, "Where the party is at");
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setPackage("com.google.android.apps.maps");
startActivity(intent);

为了完整起见,如果用户未安装地图应用程序,那么捕获ActivityNotFoundException是一个好主意,那么我们可以在没有地图应用程序限制的情况下再次启动活动,我们可以确定我们永远不会最后,因为Internet浏览器也是启动此url方案的有效应用程序,所以最终还是要加入Toast。

        String uri = String.format(Locale.ENGLISH, "http://maps.google.com/maps?daddr=%f,%f (%s)", 12f, 2f, "Where the party is at");
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
        intent.setPackage("com.google.android.apps.maps");
        try
        {
            startActivity(intent);
        }
        catch(ActivityNotFoundException ex)
        {
            try
            {
                Intent unrestrictedIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
                startActivity(unrestrictedIntent);
            }
            catch(ActivityNotFoundException innerEx)
            {
                Toast.makeText(this, "Please install a maps application", Toast.LENGTH_LONG).show();
            }
        }

PS在我的示例中使用的任何纬度或经度均不能代表我的位置,与真实位置的任何相似之处纯属巧合,也就是我不是来自非洲:P

编辑:

对于路线,google.navigation现在支持导航意图

Uri navigationIntentUri = Uri.parse("google.navigation:q=" + 12f +"," + 2f);//creating intent with latlng
Intent mapIntent = new Intent(Intent.ACTION_VIEW, navigationIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

2
大卫,这是一个很好的答案!您还知道如何在导航应用程序中真正启动导航吗?在当前状态下,用户必须最后一次单击“开始导航”。我在Google上搜索了要传递的任何参数,但找不到任何参数。
Nirmal

从地图应用程序按返回按钮时,显示黑屏,并重新创建了基础活动。您知道如何解决此问题吗?
2015年

@Jas删除了intent.setclassname方法
Ameen Maheen 2015年

嗨,上面的代码花了很长时间才能在Android版本4.4.2、4.4.4和5.0.2中启动默认地图应用。它在5.1和棉花糖版本中的启动效果很好。您能帮忙解决这个问题吗?
OnePunchMan

我现在建议使用intent.SetPackage代替intent.setClassName(“ com.google.android.apps.maps”,“ com.google.android.maps.MapsActivity”); 我将更新答案以反映这一点。
David Thompson

22

使用最新的跨平台Google Maps URL:即使缺少Google Maps应用程序,它也会在浏览器中打开

范例https://www.google.com/maps/dir/?api=1&origin=81.23444,67.0000&destination=80.252059,13.060604

Uri.Builder builder = new Uri.Builder();
builder.scheme("https")
    .authority("www.google.com")
    .appendPath("maps")
    .appendPath("dir")
    .appendPath("")
    .appendQueryParameter("api", "1")
    .appendQueryParameter("destination", 80.00023 + "," + 13.0783);
String url = builder.build().toString();
Log.d("Directions", url);
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);

10

在不同模式下使用Intent打开Goog​​le Maps:

我们可以使用以下意图打开Goog​​le Maps应用程序:

val gmmIntentUri = Uri.parse("google.navigation:q="+destintationLatitude+","+destintationLongitude + "&mode=b")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

在此,“ mode = b”是自行车。

我们可以通过以下方式设置行车,步行和骑车模式:

  • d驾驶
  • w走路
  • b用于骑车

您可以在此处找到有关Google地图意图的更多信息。

注意:如果没有自行车/汽车/人行道的路线,则会显示“找不到路线”

您可以在这里查看我的原始答案。


8

好了,您可以尝试使用Intent.setClassName方法打开内置的应用程序Android Maps 。

Intent i = new Intent(Intent.ACTION_VIEW,Uri.parse("geo:37.827500,-122.481670"));
i.setClassName("com.google.android.apps.maps",
    "com.google.android.maps.MapsActivity");
startActivity(i);

6

对于多路点,也可以使用跟随。

Intent intent = new Intent(android.content.Intent.ACTION_VIEW, 
    Uri.parse("https://www.google.com/maps/dir/48.8276261,2.3350114/48.8476794,2.340595/48.8550395,2.300022/48.8417122,2.3028844"));
startActivity(intent);

第一组坐标是您的起始位置。所有下一个都是路点,绘制的路线将经过。

只需在结尾处加上“ /纬度,经度”即可继续添加航路点。根据google docs,显然有23个航点的限制。不知道这是否也适用于Android。


什么不起作用?您在执行此确切代码时看到了什么?
阿德·塔里克

实际上,请不要使用我在此处输入的确切坐标。他们处在无路可走的地方,因此无法正常工作。
Adeel Tariq

4

如果您有兴趣从当前方向显示纬度和经度,则可以使用以下方法:

路线总是从用户当前位置给出。

以下查询将帮助您执行此操作。您可以在此处传递目标纬度和经度:

google.navigation:q=latitude,longitude

用作上方:

Uri gmmIntentUri = Uri.parse("google.navigation:q=latitude,longitude");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

或者,如果您想通过location显示,请使用:

google.navigation:q=a+street+address

此处的更多信息: 适用于Android的Google Maps Intent


对于工作的方向,我需要添加mapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
某处某人

4

Google,DirectionsView其中源位置为当前位置,目标位置为字符串

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://maps.google.com/maps?f=d&daddr="+destinationCityName));
intent.setComponent(new ComponentName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity"));
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}

在上面destinationCityName是一个字符串varaiable根据需要对其进行了修改。


3

尝试这个

Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("http://maps.google.com/maps?saddr="+src_lat+","+src_ltg+"&daddr="+des_lat+","+des_ltg));
intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
startActivity(intent);

3

这对我有用:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://maps.google.co.in/maps?q=" + yourAddress));
if (intent.resolveActivity(getPackageManager()) != null) {
   startActivity(intent);
}

1

如果您知道A点,B点(以及之间的任何功能或轨迹),则可以将KML文件与您的意图一起使用。

String kmlWebAddress = "http://www.afischer-online.de/sos/AFTrack/tracks/e1/01.24.Soltau2Wietzendorf.kml";
String uri = String.format(Locale.ENGLISH, "geo:0,0?q=%s",kmlWebAddress);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(intent);

有关更多信息,请参见此答案

注意:此示例使用的示例文件(截至mar13)仍处于联机状态。如果它已脱机,请在线查找kml文件并更改您的网址


1
从地图应用程序按返回按钮时,显示黑屏,并重新创建了基础活动。您知道如何解决此问题吗?
2015年

@ Jas,google更改了许多API,并且这种行为可能也已更改。我已经使用专用开放式街道地图已有相当一段时间了,因此我将为您提供帮助。:)
托尼·吉尔

0

首先,您需要使用隐式意图,android文档为我们提供了非常详细的通用意图, 用于实现您需要创建具有两个参数的新意图的地图意图

  • 行动
  • 宇里

对于我们可以使用的操作Intent.ACTION_VIEW ,对于Uri,我们应该对其进行构建,下面我附加了一个示例代码来创建,构建和启动活动。

 String addressString = "1600 Amphitheatre Parkway, CA";

    /*
    Build the uri 
     */
    Uri.Builder builder = new Uri.Builder();
    builder.scheme("geo")
            .path("0,0")
            .query(addressString);
    Uri addressUri = builder.build();
    /*
    Intent to open the map
     */
    Intent intent = new Intent(Intent.ACTION_VIEW, addressUri);

    /*
    verify if the devise can launch the map intent
     */
    if (intent.resolveActivity(getPackageManager()) != null) {
       /*
       launch the intent
        */
        startActivity(intent);
    }

1
使用Uri.Builder仅适用于形式为:的绝对URI <scheme>://<authority><absolute path>?<query>#<fragment>,而不适用于不透明URI <scheme>:<opaque part>#<fragment>。上面的代码产生以下URI:geo:/0%2C0?Eiffel%20Tower导致Google Maps应用崩溃。出于这个原因,即使是官方文档也使用原始/不透明URI。正确的代码如下:Uri.parse("geo:0,0?q=" + Uri.encode("Eiffel Tower"))
bitek '17

另请参阅此答案以解释为什么您的答案不起作用:stackoverflow.com/a/12035226/313113
bitek

0

一个不错的kotlin解决方案,使用lakshman sai提到的最新跨平台答案...

虽然没有不必要的Uri.toString和Uri.parse,但此答案干净而最小:

 val intentUri = Uri.Builder().apply {
      scheme("https")
      authority("www.google.com")
      appendPath("maps")
      appendPath("dir")
      appendPath("")
      appendQueryParameter("api", "1")
      appendQueryParameter("destination", "${yourLocation.latitude},${yourLocation.longitude}")
 }.build()
 startActivity(Intent(Intent.ACTION_VIEW).apply {
      data = intentUri
 })

0

通过这种方式,您可以通过Android上的意图启动Google Maps Directions

btn_search_route.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String source = et_source.getText().toString();
            String destination = et_destination.getText().toString();

            if (TextUtils.isEmpty(source)) {
                et_source.setError("Enter Soruce point");
            } else if (TextUtils.isEmpty(destination)) {
                et_destination.setError("Enter Destination Point");
            } else {
                String sendstring="http://maps.google.com/maps?saddr=" +
                        source +
                        "&daddr=" +
                        destination;
                Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
                        Uri.parse(sendstring));
                startActivity(intent);
            }
        }

    });
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.