Android'de bir niyetle Google Haritalar Yol Tariflerini başlatma


Yanıtlar:


630

Bunun gibi bir şey kullanabilirsiniz:

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

Navigasyonu geçerli konumdan başlatmak için saddrparametreyi ve değeri kaldırın .

Enlem ve boylam yerine gerçek bir sokak adresi kullanabilirsiniz. Ancak bu, kullanıcıya tarayıcı veya Google Haritalar üzerinden açma arasında seçim yapması için bir iletişim kutusu sunar.

Bu, Google Haritalar'ı doğrudan navigasyon modunda tetikleyecektir:

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

GÜNCELLEME

Mayıs 2017'de Google, evrensel, platformlar arası Google Haritalar URL'leri için yeni API'yı başlattı:

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

Intents'i yeni API ile de kullanabilirsiniz.


2
Bildiğim kadarıyla ... değil. Ancak, kullanıcı bu tür niyetleri harita uygulaması olarak açmak için varsayılan uygulamayı zaten seçmişse herhangi bir iletişim kutusu olmaz.
Jan S.

111
İletişim kutusundan kurtulmak istiyorsanız, hangi paketi kullanmak istediğinize dair bir ipucu verebilirsiniz. StartActivity () bunu ekleyin: intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
Jeremy Logan

ve googlemaps uygulamasında değil, navigasyon cihazında göstermeyi nasıl engelleyebilirim?
NullPointerException

68
Kullanıcıları tercih ettikleri diğer uygulamalara sahip olduklarında belirli bir etkinliğe zorlamak, Android ruhunu birbirine bağlıyor gibi görünüyor. Ben niyet filtreleri burada şeyleri halletmek için cazip olurdu.
superluminary

15
Gezinme hedefleri şu anda resmi olarak destekleniyor gibi görünüyor: developers.google.com/maps/documentation/android/…
Sanketh Katta

124

Bu biraz konu dışı çünkü "yol tariflerini" istediniz, ancak Android Dokümantasyonunda açıklanan Coğrafi URI şemasını da kullanabilirsiniz:

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

"Geo: enlem, boylam" kullanılan sorun, Google Haritalar'ın herhangi bir raptiye veya etiket olmadan yalnızca kendi noktanıza odaklanmasıdır.

Özellikle kesin bir yere işaret etmeniz ve / veya yönlendirme istemeniz gerekiyorsa bu oldukça kafa karıştırıcıdır.

Coğrafi noktanızı etiketlemek için "geo: lat, lon? Q = name" sorgu parametresini kullanırsanız, arama sorgusunu kullanır ve lat / lon parametrelerini kapatır.

Haritayı lat / lon ile ortalamanın ve özel bir etikete sahip bir pim göstermenin, görüntülemek için çok güzel ve yön veya başka bir işlem isterken kullanışlı bir yol buldum:

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

NOT (@TheNail tarafından): Maps v.7'de (yazma sırasındaki en son sürüm) çalışmıyor. Koordinatları yok sayar ve parantezler arasında belirtilen ada sahip bir nesne arar. Ayrıca bkz Google Maps 7.0.0 konumu ile için Niyet


3
Güzel, varsayılan coğrafi: 0,0 sadece haritayı oraya taşır. Bu çözüm ["geo: 0,0? Q = 37.423156, -122.084917 (" + ad + ")"] kendi işaretçi adınızı girmenize olanak tanır. Teşekkürler.
gnac

4
Harika çalışıyor
fyi

1
Niyette varsayılan geçiş modunu ayarlamak mümkün mü? Varsayılan olarak araba seçeneği seçilidir. Walking'i varsayılan mod olarak ayarlayabilir miyim?
Ayı

6
Neden kullanmıyorsun geo:37.423156,-122.084917?q=37.423156,-122.084917 ...?
Ocak'ta rekor

1
Label parametresini urlEncode ettiğinizden emin olun. Boşluk gibi özel karakterlerle sorunlarım vardı.
Ethan

100

Her ne kadar mevcut cevaplar harika olsa da, hiçbiri aradığım şeyi yapamadı, sadece haritalar uygulamasını açmak, kaynak konum ve hedefin her biri için bir ad eklemek istedim, coğrafi URI şemasını kullanarak benim için işe yaramaz ve haritalar web bağlantısının etiketleri yoktu, bu yüzden burada yapılan diğer çözümlerin ve yorumların bir birleşimi olan bu çözümü buldum, umarım bu soruyu görüntüleyen diğer kişiler için yararlıdır.

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

Geçerli konumunuzu başlangıç ​​noktası olarak kullanmak için (ne yazık ki geçerli konumu etiketlemenin bir yolunu bulamadım) sonra aşağıdakileri kullanın

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

Tamlık için, kullanıcının haritalar uygulaması yüklü değilse, ActivityNotFoundException'ı yakalamak iyi bir fikir olacaktır, o zaman aktiviteyi haritalar uygulaması kısıtlaması olmadan tekrar başlatabiliriz, asla alamayacağımızdan emin olabiliriz bir internet tarayıcısı da bu url şemasını başlatmak için geçerli bir uygulama olduğundan Tost sonunda.

        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 Örneğimde kullanılan herhangi bir enlem veya boylam benim konumumu temsil etmiyor, gerçek bir konuma benzerlik saf tesadüf, yani Afrika'dan değilim: P

DÜZENLE:

Yol tarifleri için artık google.navigation ile bir gezinme amacı desteklenmektedir

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
Bu harika bir cevap David! Ayrıca navigasyon uygulamasının içindeyken navigasyonu nasıl başlatacağınızı biliyor musunuz? Mevcut durumunda, kullanıcı 'Navigasyonu Başlat'ı son bir kez tıklatmalıdır. Google'da herhangi bir parametreyi aramak için arama yaptım, ancak bulamadım.
Nirmal

Haritalar uygulamasından geri düğmesine basıldığında, siyah bir ekran var ve altta yatan etkinlik yeniden yaratılıyor.
Jas

@Jas intent.setclassname yöntemini kaldırın
Ameen Maheen

Merhaba, yukarıdaki kod android 4.4.2, 4.4.4 ve 5.0.2 sürümünde varsayılan harita uygulamasını başlatmak için uzun zaman alıyor. 5.1 ve Marshmallow versiyonlarında piyasaya sunuldu. Lütfen bu sorunun çözümünde yardımcı olabilir misiniz?
OnePunchMan

Şimdi intent.setClassName ("com.google.android.apps.maps", "com.google.android.maps.MapsActivity") yerine intent.SetPackage kullanmanızı öneririm; Cevabı bunu yansıtacak şekilde güncelleyeceğim.
David Thompson

22

En yeni platformlar arası Google Haritalar URL'lerini kullanma : Google Haritalar uygulaması eksik olsa bile tarayıcıda açılır

Örnek 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

Farklı Modlarda Niyet kullanarak Google Haritalar'ı açın:

Google Haritalar uygulamasını niyet kullanarak açabiliriz:

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)

Burada "mode = b" bisiklet içindir.

Sürüş, yürüyüş ve bisiklet modunu aşağıdakileri kullanarak ayarlayabiliriz:

  • sürüş için d
  • yürümek için w
  • bisiklet için b

Google haritaları ile niyet hakkında daha fazla bilgiyi burada bulabilirsiniz .

Not: Bisiklet / araba / yürüyüş için rota yoksa, o zaman "Orada yol bulamıyorum"

Orijinal cevabımı buradan kontrol edebilirsiniz .


8

Bu Intent.setClassNameyöntemi kullanarak yerleşik Android Haritalar uygulamasını açmayı deneyebilirsiniz .

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

Çok yönlü noktalar için aşağıdakiler de kullanılabilir.

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

İlk koordinat kümesi başlangıç ​​noktanızdır. Bir sonraki tüm yol noktaları, çizilen rota geçiyor.

Sonunda "/ enlem, boylam" sonucunu ekleyerek yol noktaları eklemeye devam edin. Google dokümanlarına göre görünüşe göre 23 yol noktası sınırı var . Bunun Android için de geçerli olup olmadığından emin değilim.


Neler çalışmıyor? Bu tam kodu yürütürken ne görüyorsunuz?
Adeel Tarık

Aslında buraya koyduğum koordinatları tam olarak kullanmayın. Onlar hiçbir yerde ortasında hiçbir yerde etrafında yollar ile böylece işe yaramaz.
Adeel Tarık

4

Enlem ve Boylam'ı geçerli yönden göstermek istiyorsanız, bunu kullanabilirsiniz:

Yol tarifleri her zaman kullanıcıların geçerli konumundan verilir.

Aşağıdaki sorgu bunu gerçekleştirmenize yardımcı olacaktır. Hedef enlem ve boylamı buradan iletebilirsiniz:

google.navigation:q=latitude,longitude

Yukarıdaki gibi kullanın:

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

Veya konum üzerinden göstermek istiyorsanız şunu kullanın:

google.navigation:q=a+street+address

Daha fazla bilgi burada: Android için Google Haritalar Hedefleri


yol tarifi çalışmak için eklemek gerekiyormapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Someone Somewhere

4

DirectionsViewGeçerli konum olarak kaynak konumu ve dize olarak verildiği hedef konumu olan Google

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

Yukarıda destinationCityNamegerektiği gibi değiştirilmiş bir dizge değişkenidir.


3

bunu dene

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

Benim için işe yarayan buydu:

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

A noktasını, B noktasını (ve aradaki her hangi bir özellik veya parça) biliyorsanız, niyetinizle birlikte bir KML dosyası kullanabilirsiniz.

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

daha fazla bilgi için bu SO cevabına bakınız

NOT: Bu örnekte (mar13 itibarıyla) hala çevrimiçi olan bir örnek dosya kullanılmaktadır. çevrimdışı olmuşsa, çevrimiçi bir kml dosyası bulun ve URL'nizi değiştirin


1
Haritalar uygulamasından geri düğmesine basıldığında, siyah bir ekran var ve altta yatan etkinlik yeniden yaratılıyor.
Jas

@Jas, google API'larının çoğunu değiştirdi ve bu davranış da değişti. Açık sokak haritalarını sadece bir süredir kullanıyorum, bu yüzden size yardımcı olabilirim. :)
tony gil

0

Öncelikle, örtük amacı kullanabileceğinizi bilmeniz gerekir, android dokümantasyon bize iki parametreli yeni bir amaç oluşturmak için ihtiyacınız olan harita amacını uygulamak için çok ayrıntılı bir ortak amaç sağlar

  • Aksiyon
  • Uri

Eylem Intent.ACTION_VIEW için kullanabiliriz ve Uri için biz inşa etmeliyim, aşağıda etkinliği oluşturmak, oluşturmak, başlatmak için bir örnek kod ekledim.

 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 kullanımı, yalnızca mutlak URI'ler için çalışır: <scheme>://<authority><absolute path>?<query>#<fragment>opak URI'ler için değil <scheme>:<opaque part>#<fragment>. Yukarıdaki kod şu URI'yi verir: geo:/0%2C0?Eiffel%20TowerGoogle Haritalar uygulamasının kilitlenmesine neden olur. Resmi belgeler bile bu nedenle ham / opak URI'ler kullanıyor. Doğru kod daha sonra şöyle olur:Uri.parse("geo:0,0?q=" + Uri.encode("Eiffel Tower"))
bitek

Ayrıca cevabınızın neden işe yaramadığına dair bir açıklama için şu cevaba bakınız: stackoverflow.com/a/12035226/313113
bitek

0

Lakhman Sai tarafından bahsedilen en son platformlar arası cevabı kullanan güzel bir kotlin çözümü ...

Gereksiz Uri.toString ve Uri.parse yok, bu cevap temiz ve 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
 })

0

Google Haritalar Yol Tariflerini bu şekilde Android'deki bir niyetle başlatabilirsiniz

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

    });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.