Запуск інструкцій Google Maps через наміри на Android


399

У моєму додатку потрібно відображати вказівки Google Maps від А до Б, але я не хочу вносити Карти Google у свою програму - натомість я хочу запустити його за допомогою наміру. Чи можливо це? Якщо так, то як?


Відповіді:


630

Ви можете використовувати щось подібне:

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.

Це призведе безпосередньо до запуску Карт Google у режимі навігації:

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

ОНОВЛЕННЯ

У травні 2017 року Google запустив новий API для універсальних, багатоплатформних URL-адрес Карт Google:

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

Ви також можете використовувати Intents з новим API.


2
Не те, що мені відомо. Однак діалогового вікна не буде, якщо користувач вже обрав додаток за замовчуванням, щоб відкрити цей тип намірів, який буде програмою карти.
Січ С.

111
Якщо ви хочете позбутися діалогового вікна, ви можете дати нам підказці, який саме пакет ви хочете використовувати. Перед початком активності () додайте це: intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
Джеремі Логан

і як змусити показувати це на навігаторі, а не на додатку googlemaps?
NullPointerException

68
Примушування користувача до певної активності, коли вони можуть мати інші додатки, які вони віддають перевагу, здається, суперечить тому, що це спіткає Android дух для мене. Мені б сподобалося, щоб фільтри намірів піклувалися про речі тут.
надсвітні

15
Зараз, мабуть, офіційно підтримуються наміри навігації: developers.google.com/maps/documentation/android/…
Sanketh Katta

124

Це трохи поза темою, оскільки ви запитували "вказівки", але ви також можете використовувати схему Geo URI, описану в Документації на Android:

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

Проблема використання "гео: широти, довготи" полягає в тому, що Карти 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);

ПРИМІТКА (від @TheNail): Не працює в Maps v.7 (остання версія на момент написання). Ігнорує координати та шукатиме об’єкт із вказаним іменем між дужками. Див. Також Намір для Карт Google 7.0.0 з розташуванням


3
Приємно, гео за замовчуванням: 0,0 просто переміщує карту туди. Це рішення ["гео: 0,0? Q = 37.423156, -122.084917 (" + ім'я + ")"] дозволяє ввести власне ім'я маркера. Дякую.
гнак

4
Чудово працює - здається, фій не працює в поєднанні з параметром "z" (рівень масштабування)
scolestock

1
Чи можливо встановити режим транзиту за замовчуванням у намірі. За замовчуванням вибраний варіант автомобіля. Чи можна встановити режим Ходіння як режим за замовчуванням?
Ведмідь

6
Чому ви не використовуєте geo:37.423156,-122.084917?q=37.423156,-122.084917 ...?
rekire

1
Переконайтеся, що ви urlEncode параметр мітки. У мене виникли проблеми зі спеціальними символами, такими як простір.
Етан

100

Хоча нинішні відповіді чудові, жоден з них не робив зовсім того, що я шукав, я хотів відкрити лише додаток карт, додати ім’я для кожного вихідного місця та місця призначення, використовуючи схему гео 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);

Щоб використовувати ваше поточне місцеположення як вихідну точку (на жаль, я не знайшов способу позначити поточне місцеположення), тоді використовуйте наступне

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, тоді ми зможемо знову розпочати діяльність без обмеження програми Maps, ми можемо бути впевнені, що ми ніколи не отримаємо в тост наприкінці, оскільки Інтернет-браузер є дійсною програмою для запуску цієї 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();
            }
        }

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

2
Це чудова відповідь Девід! Ви також знаєте, як реально запустити навігацію, перебуваючи всередині навігаційного додатка? У теперішньому стані користувачеві потрібно остаточно натиснути кнопку «Почати навігацію». Я шукав у Google будь-який параметр, який потрібно передати, але не зміг його знайти.
Nirmal

При натисканні кнопки "назад" у додатку "Карти" відображається чорний екран і відтворена основна діяльність. Будь-яка ідея, як це виправити?
Жас

@ Jas remove intent.setclassname метод
Ameen Maheen

привіт, вищезазначений код потребує тривалого часу, щоб запустити програму карти за замовчуванням у версії Android 4.4.2, 4.4.4 та 5.0.2. Його запуск штрафу у версії 5.1 та Marshmallow. Чи можете ви допомогти у вирішенні цього питання.
OnePunchMan

Тепер я б запропонував використовувати intent.SetPackage замість intent.setClassName ("com.google.android.apps.maps", "com.google.android.maps.MapsActivity"); Я оновлю відповідь, щоб це відобразити.
Девід Томпсон

22

Використання останніх крос-платформних URL-адрес Карт Google : Навіть якщо програма 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);

10

Відкрийте Карти Google за допомогою намірів із різними режимами:

Ми можемо відкрити додаток 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)

Тут "режим = b" призначений для велосипеда.

Ми можемо встановити режим водіння, ходьби та їзди на велосипеді, використовуючи:

  • d для водіння
  • w для прогулянок
  • b для велосипеда

Ви можете дізнатися більше про наміри з Google Maps тут .

Примітка. Якщо для велосипеда / автомобіля / пішки немає маршруту, це покаже вам "Не можете знайти шлях"

Ви можете перевірити мою оригінальну відповідь тут .


8

Ну ви можете спробувати відкрити вбудований додаток Android Maps за допомогою 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);

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

Перший набір координат - це ваше початкове місце розташування. Усі наступні - це шляхові точки, прокладений намічений маршрут.

Просто продовжуйте додавати крапкові точки, визначаючи "/ широту, довготу" в кінці. Згідно з документами google, очевидно, існує обмеження на 23 точки . Не впевнений, чи це стосується і Android.


Що не працює? Що ви бачите під час виконання цього точного коду?
Адель Тарік

Насправді не використовуйте точні координати, які я ставлю тут. Вони знаходяться посеред ні там, де десь немає дороги навколо, щоб це не спрацювало.
Адель Тарік

4

Якщо вам цікаво показати широту та довготу з поточного напрямку, ви можете скористатися цим:

Вказівки завжди надаються від поточного місцезнаходження користувачів.

Наступний запит допоможе вам виконати це. Ви можете пройти широту та довготу пункту призначення тут:

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 для Android


про вказівки до роботи, мені потрібно було додатиmapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Хтось десь

4

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рядку змінна зміна його змінюється у міру необхідності.


3

спробуйте це

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

3

Це для мене працювало:

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

1

якщо ви знаєте точку А, точку В (і будь-які функції або треки між ними), ви можете використовувати файл 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-адресу


1
При натисканні кнопки "назад" у додатку "Карти" відображається чорний екран і відтворена основна діяльність. Будь-яка ідея, як це виправити?
Жас

@Jas, Google змінив багато своїх API, і ця поведінка, можливо, також змінилася. я використовую відкриті карти вулиць виключно вже досить давно, тому я зможу вам допомогти. :)
tony gil

0

Спочатку вам потрібно зараз, коли ви можете використовувати неявний намір, а документація на 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);
    }

1
Використання Uri.Builder працює лише для абсолютних URI, у вигляді:, а <scheme>://<authority><absolute path>?<query>#<fragment>не непрозорих URI <scheme>:<opaque part>#<fragment>. Вищевказаний код дає такий URI: geo:/0%2C0?Eiffel%20Towerце призводить до збоїв програми Google Maps. Навіть офіційна документація саме з цієї причини використовує необроблені / непрозорі URI. Правильним кодом було б:Uri.parse("geo:0,0?q=" + Uri.encode("Eiffel Tower"))
bitek

Також дивіться відповідь для пояснення того , чому ваша відповідь не працює: stackoverflow.com/a/12035226/313113
Бітек

0

Приємне рішення kotlin, використовуючи останню відповідь між платформами, про яку згадував Лакшман Сай ...

Немає зайвих 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
 })

0

Ви можете запускати вказівки Google Maps через наміри на Android таким чином

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

    });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.