Meluncurkan Google Maps Directions melalui niat di Android

399

Aplikasi saya perlu menunjukkan arah Google Maps dari A ke B, tetapi saya tidak ingin memasukkan Google Maps ke dalam aplikasi saya - sebagai gantinya, saya ingin meluncurkannya menggunakan Intent. Apakah ini mungkin? Jika ya, bagaimana?

Lars D
sumber

Jawaban:

630

Anda dapat menggunakan sesuatu seperti ini:

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

Untuk memulai navigasi dari lokasi saat ini, hapus saddrparameter dan nilai.

Anda dapat menggunakan alamat jalan yang sebenarnya, bukan lintang dan bujur. Namun ini akan memberikan pengguna dialog untuk memilih antara membukanya melalui browser atau Google Maps.

Ini akan menjalankan Google Maps dalam mode navigasi langsung:

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

MEMPERBARUI

Pada Mei 2017 Google meluncurkan API baru untuk URL Google Maps lintas platform universal:

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

Anda dapat menggunakan Intents dengan API baru juga.

Jan S.
sumber
2
Bukannya aku sadar. Namun, tidak akan ada dialog apa pun jika pengguna telah memilih aplikasi default untuk membuka jenis niat ini untuk menjadi aplikasi peta.
Jan S.
111
Jika Anda ingin menyingkirkan dialog, Anda dapat memberi maksud petunjuk tentang paket mana yang ingin Anda gunakan. Sebelum startActivity () tambahkan ini: intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
Jeremy Logan
dan bagaimana cara memamerkannya pada navigator dan bukan pada aplikasi googlemaps?
NullPointerException
68
Memaksa pengguna ke aktivitas tertentu ketika mereka mungkin memiliki aplikasi lain yang mereka sukai tampaknya bertentangan dengan baut itu bersama-sama semangat Android bagi saya. Saya akan tergoda untuk membiarkan filter niat mengurus semuanya di sini.
superluminary
15
Maksud navigasi tampaknya didukung secara resmi sekarang: developers.google.com/maps/documentation/android/…
Sanketh Katta
124

Ini sedikit di luar topik karena Anda meminta "arah", tetapi Anda juga dapat menggunakan skema Geo URI yang dijelaskan dalam Dokumentasi Android:

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

Masalah menggunakan "geo: latitude, longitude" adalah bahwa Google Maps hanya terpusat pada titik Anda, tanpa pin atau label.

Itu cukup membingungkan, terutama jika Anda perlu menunjuk ke tempat yang tepat atau / dan menanyakan arah.

Jika Anda menggunakan parameter kueri "geo: lat, lon? Q = name" untuk memberi label geopoint Anda, ia menggunakan kueri untuk pencarian dan mengabaikan parameter lat / lon.

Saya menemukan cara untuk memusatkan peta dengan lat / lon dan menampilkan pin dengan label khusus, sangat bagus untuk ditampilkan dan berguna ketika menanyakan arah atau tindakan lain:

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

CATATAN (oleh @TheNail): Tidak berfungsi di Maps v.7 (versi terbaru saat penulisan). Akan mengabaikan koordinat dan mencari objek dengan nama yang diberikan di antara tanda kurung. Lihat juga Intent untuk Google Maps 7.0.0 dengan lokasi

Murphy
sumber
3
Bagus, default geo: 0,0 hanya memindahkan peta ke sana. Solusi ini ["geo: 0,0? Q = 37.423156, -122.084917 (" + name + ")"] memungkinkan Anda untuk memasukkan nama marker Anda sendiri. Terima kasih.
gnac
4
Berfungsi bagus - fyi tampaknya tidak berfungsi bersama dengan parameter kueri "z" (tingkat zoom)
scolestock
1
Apakah mungkin untuk mengatur mode transit default di maksud. Secara default, opsi mobil dipilih. Bisakah saya menetapkan Berjalan sebagai mode default?
Beruang
6
Kenapa tidak kamu gunakan geo:37.423156,-122.084917?q=37.423156,-122.084917 ...?
rekire
1
Pastikan Anda urlEncode kode parameter. Saya memiliki masalah dengan karakter khusus seperti ruang.
Ethan
100

Meskipun jawaban saat ini sangat bagus, tidak ada yang melakukan apa yang saya cari, saya ingin membuka aplikasi peta saja, menambahkan nama untuk setiap lokasi sumber dan tujuan, menggunakan skema geo URI tidak akan bekerja untuk saya sama sekali dan tautan web peta tidak memiliki label, jadi saya datang dengan solusi ini, yang pada dasarnya merupakan gabungan dari solusi dan komentar lain yang dibuat di sini, semoga bermanfaat bagi orang lain yang melihat pertanyaan ini.

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

Untuk menggunakan lokasi Anda saat ini sebagai titik awal (sayangnya saya belum menemukan cara untuk memberi label lokasi saat ini) kemudian gunakan yang berikut ini

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

Untuk kelengkapan, jika pengguna tidak memiliki aplikasi peta yang diinstal maka itu akan menjadi ide yang bagus untuk menangkap ActivityNotFoundException, maka kita dapat memulai aktivitas lagi tanpa pembatasan aplikasi peta, kita dapat cukup yakin bahwa kita tidak akan pernah mendapatkan ke Toast pada akhirnya karena browser internet adalah aplikasi yang valid untuk meluncurkan skema url ini juga.

        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 Setiap lintang atau bujur yang digunakan dalam contoh saya tidak mewakili lokasi saya, kemiripan dengan lokasi sebenarnya adalah kebetulan murni, alias saya bukan dari Afrika: P

EDIT:

Untuk petunjuk arah, maksud navigasi sekarang didukung dengan 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);
David Thompson
sumber
2
Ini jawaban yang bagus, David! Anda juga tahu cara memulai navigasi saat berada di dalam aplikasi navigasi? Pada kondisi saat ini, pengguna harus mengklik 'Mulai Navigasi' untuk terakhir kalinya. Saya mencari Google untuk parameter apa pun untuk lulus, tetapi tidak dapat menemukannya.
Nirmal
Saat menekan tombol kembali dari aplikasi peta, di sana ditampilkan layar hitam dan aktivitas yang mendasarinya diciptakan kembali. Ada ide bagaimana cara memperbaikinya?
Jas
@Menghapus metode intent.setclassname
Ameen Maheen
hai, kode di atas membutuhkan waktu lama untuk meluncurkan aplikasi peta default di versi android 4.4.2, 4.4.4, dan 5.0.2. Peluncurannya baik dalam versi 5.1 dan Marshmallow. Bisakah Anda membantu menyelesaikan masalah ini?
OnePunchMan
Sekarang saya akan menyarankan menggunakan intent.SetPackage alih-alih intent.setClassName ("com.google.android.apps.maps", "com.google.android.maps.MapsActivity"); Saya akan memperbarui jawaban untuk mencerminkan ini.
David Thompson
22

Menggunakan URL Google Maps lintas-platform terbaru : Bahkan jika aplikasi google maps tidak ada, itu akan terbuka di browser

Contoh 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);
lakshman sai
sumber
10

Buka Google Maps menggunakan Intent dengan Mode yang berbeda:

Kami dapat membuka aplikasi Google Maps menggunakan niat:

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)

Di sini, "mode = b" adalah untuk sepeda.

Kita dapat mengatur mode mengemudi, berjalan, dan bersepeda dengan menggunakan:

  • d untuk mengemudi
  • untuk berjalan
  • b untuk bersepeda

Anda dapat menemukan lebih banyak tentang niat dengan peta google di sini .

Catatan: Jika tidak ada rute untuk sepeda / mobil / berjalan maka itu akan menunjukkan kepada Anda "Tidak dapat menemukan jalan ke sana"

Anda dapat memeriksa jawaban asli saya di sini .

SANAT
sumber
8

Nah Anda bisa mencoba membuka aplikasi bawaan Android Maps dengan menggunakan Intent.setClassNamemetode tersebut.

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);
Jonathan Caceres Romero
sumber
6

Untuk beberapa titik jalan, berikut ini dapat digunakan juga.

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

Set koordinat pertama adalah lokasi awal Anda. Semua berikutnya adalah titik jalan, rute yang direncanakan melewati.

Terus tambahkan titik jalan dengan menyimpulkan "/ lintang, bujur" di akhir. Tampaknya ada batas 23 titik jalan menurut google docs . Tidak yakin apakah itu berlaku untuk Android juga.

Adeel Tariq
sumber
Apa yang tidak berfungsi? Apa yang Anda lihat ketika menjalankan kode persis ini?
Adeel Tariq
Sebenarnya tidak menggunakan koordinat yang tepat yang saya taruh di sini. Mereka berada di tengah-tengah tempat di mana tidak ada jalan di sekitar sehingga tidak akan berfungsi.
Adeel Tariq
4

Jika Anda tertarik untuk menunjukkan Lintang dan Bujur dari arah saat ini, Anda dapat menggunakan ini:

Petunjuk selalu diberikan dari lokasi pengguna saat ini.

Permintaan berikut akan membantu Anda melakukan itu. Anda dapat melewati garis lintang dan bujur tujuan di sini:

google.navigation:q=latitude,longitude

Gunakan di atas sebagai:

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

Atau jika Anda ingin tampil melalui lokasi, gunakan:

google.navigation:q=a+street+address

Info lebih lanjut di sini: Google Maps Intents untuk Android

InginBeGeek
sumber
untuk petunjuk arah untuk bekerja, saya perlu menambahkanmapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Seseorang di suatu tempat
4

Google DirectionsViewdengan lokasi sumber sebagai lokasi saat ini dan lokasi tujuan sebagaimana diberikan sebagai string

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

Dalam contoh di atas destinationCityNameadalah string yang dapat dimodifikasi yang diperlukan.

Ramesh kumar
sumber
3

coba ini

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);
Solusi Web Vijay
sumber
3

Inilah yang bekerja untuk saya:

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);
}
JediCate
sumber
1

jika Anda tahu titik A, titik B (dan fitur apa pun atau jejak di antaranya) Anda dapat menggunakan file KML bersama dengan niat Anda.

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

untuk info lebih lanjut, lihat jawaban SO ini

CATATAN: contoh ini menggunakan file sampel yang (pada Maret13) masih online. jika sudah luring, cari file kml daring dan ubah url Anda

tony gil
sumber
1
Saat menekan tombol kembali dari aplikasi peta, di sana ditampilkan layar hitam dan aktivitas yang mendasarinya diciptakan kembali. Ada ide bagaimana cara memperbaikinya?
Jas
@ Ya, google mengubah banyak API-nya dan perilaku ini mungkin juga berubah. Saya telah menggunakan peta jalan terbuka secara eksklusif untuk beberapa waktu sekarang, jadi saya akan dapat membantu Anda. :)
tony gil
0

Pertama, Anda perlu sekarang bahwa Anda dapat menggunakan maksud tersirat, dokumentasi android memberi kami maksud umum yang sangat terperinci untuk mengimplementasikan maksud peta yang Anda butuhkan untuk membuat maksud baru dengan dua parameter

  • Tindakan
  • Uri

Untuk tindakan yang dapat kita gunakan Intent.ACTION_VIEW dan untuk Uri kita harus membangunnya, di bawah ini saya melampirkan kode sampel untuk membuat, membangun, memulai aktivitas.

 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);
    }
Bachiri Taoufiq Abderrahman
sumber
1
Menggunakan Uri.Builder hanya berfungsi untuk URI absolut, dalam bentuk:, <scheme>://<authority><absolute path>?<query>#<fragment>bukan URI buram <scheme>:<opaque part>#<fragment>. Kode di atas menghasilkan URI berikut: geo:/0%2C0?Eiffel%20Toweryang menyebabkan aplikasi Google Maps mogok. Bahkan dokumentasi resmi menggunakan URI mentah / buram untuk alasan ini. Kode yang benar akan menjadi:Uri.parse("geo:0,0?q=" + Uri.encode("Eiffel Tower"))
bitek
Lihat juga jawaban ini untuk penjelasan mengapa jawaban Anda tidak berfungsi: stackoverflow.com/a/12035226/313113
bitek
0

Solusi kotlin yang bagus, menggunakan jawaban lintas-platform terbaru yang disebutkan oleh ...

Tidak ada Uri.toString yang tidak perlu dan Uri.parse, jawaban ini bersih dan minimal:

 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
 })
Vin Norman
sumber
0

Anda dapat Meluncurkan Google Maps Directions melalui niat di Android melalui cara ini

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

    });
jay patoliya
sumber