Answers:
您可以使用如下形式:
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结合使用。
intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
这有点离题,因为您询问了“路线”,但您也可以使用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的意图
geo:37.423156,-122.084917?q=37.423156,-122.084917 ...
?
尽管当前答案很不错,但没有一个可以满足我的要求,我只想打开地图应用,为每个源位置和目的地添加一个名称,使用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);
使用最新的跨平台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);
在不同模式下使用Intent打开Google Maps:
我们可以使用以下意图打开Google 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”是自行车。
我们可以通过以下方式设置行车,步行和骑车模式:
您可以在此处找到有关Google地图意图的更多信息。
注意:如果没有自行车/汽车/人行道的路线,则会显示“找不到路线”
您可以在这里查看我的原始答案。
好了,您可以尝试使用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);
对于多路点,也可以使用跟随。
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。
如果您有兴趣从当前方向显示纬度和经度,则可以使用以下方法:
路线总是从用户当前位置给出。
以下查询将帮助您执行此操作。您可以在此处传递目标纬度和经度:
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);
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根据需要对其进行了修改。
尝试这个
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);
如果您知道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文件并更改您的网址
首先,您需要使用隐式意图,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);
}
一个不错的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
})
通过这种方式,您可以通过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);
}
}
});