Запуск Google Maps Directions через намерение на Android

мое приложение должно показывать направления Google Maps от A до B, но я не хочу помещать Карты Google в свое приложение - вместо этого я хочу запустить его с помощью намерения. Возможно ли это? Если да, то как?

13 ответов


вы можете использовать что-то вроде этого:

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 Maps в навигационном режиме напрямую:

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

обновление

In Май 2017 Google запустил новый API для универсальных, кросс-платформенных Google Maps URLs:

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

вы также можете использовать Intents с новым API.


Это немного не по теме, потому что вы попросили "направления", но вы также можете использовать схему GEO URI, описанную в документации Android:

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

проблема с использованием "geo: широта, долгота" заключается в том, что Google Maps только центры в вашей точке, без каких-либо pin-кода или метки.

Это довольно запутанно, особенно если вам нужно указать точное место или / и попросить направление.

Если вы используете параметр запроса " geo: lat,lon?q=name" чтобы пометить вашу геопоинт, он использует запрос для поиска и отклоняет параметры lat/lon.

Я нашел способ центрировать карту с помощью lat / lon и отображать pin-код с пользовательской меткой, очень приятно отображать и полезно при запросе направлений или любого другого действия:

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

примечание (к @TheNail): не работает в карты В. 7 (последняя версия на момент написания). Будет игнорировать координирует и поиск объекта с заданным именем в скобках. См. также намерение для Google Maps 7.0.0 с местоположением


хотя текущие ответы велики, ни один из них не сделал то, что я искал, я хотел открыть только приложение maps, добавить имя для каждого исходного местоположения и назначения, используя схему GEO URI, не будет работать для меня вообще, и веб-ссылка maps не имела ярлыков, поэтому я придумал это решение, которое по существу является объединением других решений и комментариев, сделанных здесь, Надеюсь, это полезно для других, просматривающих этот вопрос.

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, то мы можем начать деятельность снова без ограничения карты приложение, мы можем быть уверены, что мы никогда не доберемся до тоста в конце, так как интернет-браузер является допустимым приложением для запуска эта схема url тоже.

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

С. П. Любые широты или долготы, используемые в моем примере, не представляют моего местоположения, любое сходство с истинным местоположением-чистое совпадение, ака я не из Африки :P

EDIT:

для направления, намерение навигации теперь поддерживается с google.навигация

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

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

используя новейшие кросс-платформенные Google Maps URLs: Даже если приложение 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);

Ну вы можете попробовать открыть встроенное приложение Android карты с помощью Intent.setClassName метод.

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

первый набор координат-это ваше начальное местоположение. Все последующие точки пути, проложенный маршрут проходит через.

просто продолжайте добавлять точки по concating "/широта,долгота" в конце. Существует, по-видимому, предел 23 путевых точек в соответствии с Google Документы. Не уверен, что это относится и к Android.


Это то, что сработало для меня:

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

Если вы заинтересованы в показе широты и долготы от текущего направления, вы можете использовать это:

направления всегда даются из текущего местоположения пользователей.

следующий запрос поможет вам выполнить это . Вы можете передать широту и долготу назначения здесь:

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

подробнее здесь: Google Maps намерения для 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 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, измененной по мере необходимости.


сначала вам нужно теперь, когда вы можете использовать неявное намерение, документация android предоставляет нам очень подробную общие намерения для реализации намерения карты необходимо создать новое намерение с двумя параметрами

  • действие
  • Uri

для действий, мы можем использовать 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);
    }