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

我的应用程序需要显示从A到B的Google地图指示,但我不想将Google地图放入我的应用程序中,而是使用Intent启动它。 这可能吗? 如果是的话,怎么样?

你可以使用这样的东西:

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参数和值。

您可以使用实际街道地址而不是经度和纬度。 但是,这会给用户一个对话框来select通过浏览器还是Google地图来打开它。

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

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

UPDATE

2017年5月,Google推出了用于通用,跨平台的Google地图url的新API:

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

你也可以用新的API来使用Intents。

由于您要求提供“路线”,因此这有点偏离主题,但您也可以使用Android文档中描述的地理URIscheme:

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

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

这是相当混乱的,特别是如果你需要指出一个确切的地方或/并要求方向。

如果您使用查询参数“geo:lat,lon?q = name”来标记您的地址,它将使用查询进行search并closures纬度/经度参数。

我find了一种以lat / lon为中心的方式,并显示一个自定义标签的图钉,非常好的显示和有用的时候要求的方向或任何其他行动:

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

注意(by @TheNail):不适用于Maps v.7(撰写本文时的最新版本)。 将忽略坐标并在圆括号之间search具有给定名称的对象。 请参阅具有位置的Google地图7.0.0的意图

虽然目前的答案很好,但是他们没有做我想要的东西,我只想打开地图应用程序,为每个源地址和目的地添加一个名称,使用地理URIscheme对我不起作用根本没有地图的网页链接没有标签,所以我想出了这个解决scheme,这本质上是其他解决scheme和在这里提出的意见的融合,希望对其他人看这个问题是有帮助的。

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

要使用您当前的位置作为起点(不幸的是,我还没有find一个方法来标记当前的位置),然后使用以下内容

 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将是一个好主意,那么我们可以在没有地图应用程序限制的情况下再次启动该活动,我们可以肯定地说我们将永远不会到最后的吐司,因为互联网浏览器也是一个有效的应用程序来启动这个urlscheme。

  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地图url :即使Google地图应用程序丢失,也会在浏览器中打开

示例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); 

那么你可以尝试使用Intent.setClassName方法打开内置的应用程序Android地图。

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

尝试这个

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

这对我来说是有效的:

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

首先你需要现在你可以使用隐含的意图,android文档为我们提供了一个非常详细的共同意图 ,实现这个意图你需要用两个参数创build一个新的intent

  • 行动
  • 乌里

对于行动,我们可以使用Intent.ACTION_VIEW和Uri我们应该build立它,下面我附上一个示例代码来创build,build立,启动活动。

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

对于多路点,也可以使用以下几点。

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

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

只需在最后加上“/纬度,经度”来添加路线点。 根据谷歌的文档,显然有23个方面的限制。 不知道这是否也适用于Android。

如果您知道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文件并更改您的url

如果您有兴趣从当前的方向显示纬度和经度,可以使用这个:

方向总是从用户当前位置给出。

以下查询将帮助您执行该操作。 你可以在这里传递目标的经度和纬度:

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

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

 google.navigation:q=a+street+address 

更多信息: Android版Google地图

 Uri.Builder directionsBuilder = new Uri.Builder() .scheme("https") .authority("www.google.com") .appendPath("maps") .appendPath("dir") .appendPath("") .appendQueryParameter("api", "1") .appendQueryParameter("destination", lat + "," + lon); startActivity(new Intent(Intent.ACTION_VIEW, directionsBuilder.build()));