通过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()));