通过Android上的意图启动Google地图路线

Lar*_*s D 382 java android google-maps android-intent

我的应用需要显示从A到B的Google地图路线,但我不想将Google地图放入我的应用程序 - 相反,我想使用Intent启动它.这可能吗?如果有,怎么样?

Jan*_* S. 609

你可以使用这样的东西:

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);
Run Code Online (Sandbox Code Playgroud)

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

您可以使用实际的街道地址而不是纬度和经度.但是,这将为用户提供一个对话框,可以选择通过浏览器还是谷歌地图打开它.

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

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

UPDATE

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

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

您也可以将Intent与新API一起使用.

  • 如果你想摆脱对话框,你可以给意图一个关于你想要使用哪个包的提示.在startActivity()之前添加:`intent.setClassName("com.google.android.apps.maps","com.google.android.maps.MapsActivity");` (111认同)
  • 当用户可能拥有他们喜欢的其他应用程序时,强制用户进入特定活动,这似乎与Android的灵魂相悖.我很想让意图过滤器来处理这里的事情. (67认同)
  • 导航意图现在似乎得到官方支持:https://developers.google.com/maps/documentation/android/intents#launch_turn-by-turn_navigation (15认同)
  • 反正有没有删除对话框??? 让它只是地图应用程序 (9认同)
  • 不是我知道的.但是,如果用户已选择默认应用程序打开此类意图作为地图应用程序,则不会有任何对话框. (2认同)

Mur*_*phy 122

这有点偏离主题,因为您要求"方向",但您也可以使用Android文档中描述的Geo URI方案:

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

使用"geo:latitude,longitude"的问题在于Google地图仅在您的位置居中,没有任何引脚或标签.

这非常令人困惑,特别是如果你需要指向一个精确的地方或/并询问方向.

如果使用查询参数"geo:lat,lon?q = name"来标记地理位置,它将使用查询进行搜索并关闭lat/lon参数.

我找到了一种用lat/lon中心地图的方法,并显示一个带有自定义标签的图钉,在询问路线或任何其他动作时显示非常好并且非常有用:

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

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

  • 你为什么不用`geo:37.423156,-122.084917?q = 37.423156,-122.084917 ...`? (6认同)
  • 效果很好 - fyi似乎不能与"z"查询参数(缩放级别)一起使用 (4认同)
  • 很好,默认地理位置:0,0只是将地图移动到那里.此解决方案["geo:0,0?q = 37.423156,-122.084917("+ name +")"]允许您输入自己的标记名称.谢谢. (3认同)

Dav*_*son 99

虽然目前的答案很棒,但没有一个能达到我想要的效果,我只想打开地图应用程序,为每个源位置和目的地添加一个名称,使用geo URI方案对我来说不起作用在所有和地图网站链接没有标签所以我想出了这个解决方案,这基本上是这里的其他解决方案和评论的合并,希望它有助于其他人查看这个问题.

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);
Run Code Online (Sandbox Code Playgroud)

要使用当前位置作为起点(遗憾的是我还没有找到标记当前位置的方法),请使用以下内容

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);
Run Code Online (Sandbox Code Playgroud)

为了完整性,如果用户没有安装地图应用程序,那么捕获ActivityNotFoundException将是一个好主意,然后我们可以在没有地图应用程序限制的情况下再次启动活动,我们可以肯定我们永远不会得到因为互联网浏览器也是启动此网址方案的有效应用程序,所以最后到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();
            }
        }
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

  • 大卫,这是一个很好的答案!你也知道如何在导航应用程序内真正开始导航?在目前状态下,用户必须最后一次点击"开始导航".我搜索了Google要传递的任何参数,但找不到任何参数. (2认同)

小智 19

使用最新的跨平台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);
Run Code Online (Sandbox Code Playgroud)


小智 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);
Run Code Online (Sandbox Code Playgroud)


SAN*_*NAT 8

在不同模式下使用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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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


Min*_*rid 7

打开包含HMS的华为设备中的地图应用程序:

const val GOOGLE_MAPS_APP = "com.google.android.apps.maps"
const val HUAWEI_MAPS_APP = "com.huawei.maps.app"

    fun openMap(lat:Double,lon:Double) {
    val packName = if (isHmsOnly(context)) {
        HUAWEI_MAPS_APP
    } else {
        GOOGLE_MAPS_APP
    }

        val uri = Uri.parse("geo:$lat,$lon?q=$lat,$lon")
        val intent = Intent(Intent.ACTION_VIEW, uri)
        intent.setPackage(packName);
        if (intent.resolveActivity(context.packageManager) != null) {
            context.startActivity(intent)
        } else {
            openMapOptions(lat, lon)
        }
}

private fun openMapOptions(lat: Double, lon: Double) {
    val intent = Intent(
        Intent.ACTION_VIEW,
        Uri.parse("geo:$lat,$lon?q=$lat,$lon")
    )
    context.startActivity(intent)
}
Run Code Online (Sandbox Code Playgroud)

HMS 检查:

private fun isHmsAvailable(context: Context?): Boolean {
var isAvailable = false
if (null != context) {
    val result =
        HuaweiApiAvailability.getInstance().isHuaweiMobileServicesAvailable(context)
    isAvailable = ConnectionResult.SUCCESS == result
}
return isAvailable}

private fun isGmsAvailable(context: Context?): Boolean {
    var isAvailable = false
    if (null != context) {
        val result: Int = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context)
        isAvailable = com.google.android.gms.common.ConnectionResult.SUCCESS == result
    }
    return isAvailable }

fun isHmsOnly(context: Context?) = isHmsAvailable(context) && !isGmsAvailable(context)
Run Code Online (Sandbox Code Playgroud)


Ade*_*riq 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);
Run Code Online (Sandbox Code Playgroud)

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

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


Wan*_*eek 6

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

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

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

google.navigation:q=latitude,longitude
Run Code Online (Sandbox Code Playgroud)

使用上面作为:

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);
Run Code Online (Sandbox Code Playgroud)

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

google.navigation:q=a+street+address
Run Code Online (Sandbox Code Playgroud)

此处的更多信息: Android 版 Google Maps Intents


Jed*_*ate 5

这对我有用:

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);
}
Run Code Online (Sandbox Code Playgroud)


Vin*_*man 5

一个不错的 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
 })
Run Code Online (Sandbox Code Playgroud)