एंड्रॉइड पर एक इरादे के माध्यम से Google मैप्स दिशाओं को लॉन्च करना


399

मेरे ऐप को ए से बी तक Google मैप्स दिशा-निर्देश दिखाने की आवश्यकता है, लेकिन मैं 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 ने सार्वभौमिक, क्रॉस-प्लेटफ़ॉर्म Google मानचित्र URL के लिए नया API लॉन्च किया:

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

आप नए API के साथ Intents का भी उपयोग कर सकते हैं।


2
ऐसा नहीं कि मुझे पता नहीं। हालाँकि, कोई भी संवाद नहीं होगा यदि उपयोगकर्ता ने पहले से ही इस प्रकार के मानचित्र ऐप को खोलने के लिए डिफ़ॉल्ट ऐप चुना है।
Jan S.

111
यदि आप संवाद से छुटकारा पाना चाहते हैं तो आप इस आशय का संकेत दे सकते हैं कि आप किस पैकेज का उपयोग करना चाहते हैं। प्रारंभ से पहले () इसे जोड़ें: intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
जेरेमी लोगन

और कैसे इसे नेविगेटर पर दिखाने के लिए और googlemaps एप्लिकेशन पर नहीं देखना है?
NullPointerException

68
उपयोगकर्ता को एक विशिष्ट गतिविधि में मजबूर करना जब उनके पास अन्य एप्लिकेशन हो सकते हैं, जो उन्हें पसंद करते हैं, यह मेरे लिए एंड्रॉइड स्प्रिट के साथ बोल्ट के विपरीत लगता है। मुझे यह आशय होगा कि मंशा फ़िल्टर यहाँ चीजों का ध्यान रखें।
सुपरलाइनरी

15
नेविगेशन के इरादे अब आधिकारिक तौर पर समर्थित प्रतीत होते हैं: Developers.google.com/maps/documentation/android/…
Sanketh Katta

124

यह थोड़ा ऑफ-टॉपिक है क्योंकि आपने "निर्देश" मांगा था, लेकिन आप Android दस्तावेज़ों में वर्णित जियो यूआरआई योजना का भी उपयोग कर सकते हैं:

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

"जियो: अक्षांश, देशांतर" का उपयोग करने में समस्या यह है कि Google मैप्स केवल किसी बिंदु पर, बिना किसी पिन या लेबल के केंद्र में हैं।

यह काफी भ्रामक है, खासकर अगर आपको किसी सटीक जगह की ओर इशारा करने की जरूरत है और / या दिशा-निर्देश मांगना है।

यदि आप क्वेरी पैरामीटर "जियो: लाट, लोन; क्यू = नेम" का उपयोग करते हैं, तो अपने भूगोल को लेबल करने के लिए, यह खोज और लाट / लोन मापदंडों को खारिज करने के लिए क्वेरी का उपयोग करता है।

मैंने लेट / लोन के साथ मानचित्र को केंद्र में रखने का एक तरीका पाया और कस्टम लेबल के साथ एक पिन प्रदर्शित किया, जो दिशाओं या किसी अन्य कार्रवाई के लिए पूछते समय प्रदर्शित करने और उपयोगी होने के लिए बहुत अच्छा था:

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

नोट (@ TheNail द्वारा): मैप्स v.7 में काम नहीं कर रहा है (लेखन के समय नवीनतम संस्करण)। निर्देशांक की उपेक्षा करेंगे और कोष्ठक के बीच दिए गए नाम के साथ एक वस्तु की खोज करेंगे। स्थान के साथ Google मैप्स 7.0.0 के लिए इरादा भी देखें


3
अच्छा, डिफ़ॉल्ट जियो: 0,0 बस वहां के नक्शे को स्थानांतरित करता है। यह समाधान ["जियो: 0,0? Q = 37.423156, -122.084917 (" + नाम + ")"] आपको अपने स्वयं के मार्कर नाम में डालने की अनुमति देता है। धन्यवाद।
gnac

4
महान काम करता है
fyi

1
क्या इरादे में डिफ़ॉल्ट पारगमन मोड सेट करना संभव है। डिफ़ॉल्ट रूप से कार विकल्प चुना जाता है। क्या मैं वॉकिंग को डिफ़ॉल्ट मोड के रूप में सेट कर सकता हूं?
भालू

6
आप उपयोग क्यों नहीं करते geo:37.423156,-122.084917?q=37.423156,-122.084917 ...?
rekire

1
सुनिश्चित करें कि आप लेबल पैरामीटर urlEncode करते हैं। मेरे पास अंतरिक्ष जैसे विशेष पात्रों के साथ मुद्दे थे।
ईथन

100

यद्यपि वर्तमान उत्तर महान हैं, उनमें से कोई भी काफी नहीं था जो मैं देख रहा था, मैं केवल मैप्स ऐप खोलना चाहता था, प्रत्येक स्रोत स्थान और गंतव्य के लिए एक नाम जोड़ें, भू यूआरआई योजना का उपयोग करना मेरे लिए काम नहीं करेगा। सभी और मैप्स वेब लिंक में लेबल नहीं थे, इसलिए मैं इस समाधान के साथ आया, जो अनिवार्य रूप से यहां किए गए अन्य समाधानों और टिप्पणियों का एक समामेलन है, उम्मीद है कि यह इस सवाल को देखने वाले अन्य लोगों के लिए उपयोगी है।

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

पूर्णता के लिए, यदि उपयोगकर्ता के पास मैप्स ऐप इंस्टॉल नहीं है, तो एक्टिविटीनॉटफ़ाउंड एक्सेप्शन को पकड़ने के लिए यह एक अच्छा विचार है, तो हम मैप्स ऐप प्रतिबंध के बिना फिर से गतिविधि शुरू कर सकते हैं, हमें पूरा यकीन है कि हम कभी नहीं मिलेंगे अंत में टोस्ट के बाद से एक इंटरनेट ब्राउज़र इस 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();
            }
        }

पीएस मेरे उदाहरण में उपयोग किए गए कोई भी अक्षांश या देशांतर मेरे स्थान के प्रतिनिधि नहीं हैं, किसी भी स्थान की सत्यता की तुलना शुद्ध संयोग है, उर्फ ​​मैं अफ्रीका से नहीं हूं: पी

संपादित करें:

निर्देशों के लिए, अब एक नेविगेशन आशय 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 की खोज की, लेकिन कोई भी नहीं खोज सका।
निर्मल

मैप्स ऐप से बैक बटन दबाते समय, एक काली स्क्रीन दिखाई देती है और अंतर्निहित गतिविधि को फिर से बनाया जाता है। यह कैसे तय किया जाए?
जस

@ जस ने इरादे को हटा दिया ।setclassname विधि
अमीन

नमस्ते, उपरोक्त कोड एंड्रॉइड वर्जन 4.4.2, 4.4.4, और 5.0.2 में डिफ़ॉल्ट मैप ऐप लॉन्च करने में लंबा समय ले रहा है। 5.1 और मार्शमैलो संस्करण में इसकी लॉन्चिंग ठीक है। क्या आप इस समस्या को हल करने में मदद कर सकते हैं।
वनपंचमन

अब मैं आशय का उपयोग करने का सुझाव दूंगा। आशय के बजाय। सीटपैक करें। इसके बजाय आशय ।setClassName ("com.google.android.apps.maps", "com.google.android.maps.MapsActivity"); मैं इसे प्रतिबिंबित करने के लिए उत्तर को अपडेट करूंगा।
डेविड थॉम्पसन

22

नवीनतम क्रॉस-प्लेटफ़ॉर्म Google मैप्स URL का उपयोग करना : भले ही 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);

10

अलग-अलग मोड के साथ इरादे का उपयोग करके Google मानचित्र खोलें:

हम आशय का उपयोग करके Google मैप्स ऐप खोल सकते हैं:

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)

यहां, "मोड = बी" साइकिल के लिए है।

हम उपयोग करके ड्राइविंग, चलना और साइकिल चलाना मोड सेट कर सकते हैं:

  • d ड्राइविंग के लिए
  • चलने के लिए डब्ल्यू
  • b साइकिल चलाने के लिए

आप यहाँ Google मानचित्र के साथ आशय के बारे में अधिक जानकारी प्राप्त कर सकते हैं ।

नोट: यदि साइकिल / कार / चलने के लिए कोई मार्ग नहीं है, तो यह आपको दिखाएगा "वहाँ रास्ता नहीं खोज सकता"

आप यहां मेरे मूल उत्तर की जांच कर सकते हैं


8

वैसे आप बिल्ट-इन एप्लिकेशन एंड्रॉइड मैप्स को 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

यहाँ अधिक जानकारी: Android के लिए Google मैप्स इरादे


काम करने के निर्देशों के लिए, मुझे जोड़ना होगाmapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
कोई व्यक्ति

4

DirectionsViewएक स्ट्रिंग के रूप में दिए गए वर्तमान स्थान और गंतव्य स्थान के रूप में स्रोत स्थान के साथ 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);
}

उपरोक्त 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

यदि आप बिंदु 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);

अधिक जानकारी के लिए, यह SO उत्तर देखें

नोट: यह उदाहरण एक नमूना फ़ाइल का उपयोग करता है जो (मार्च 13 के अनुसार) अभी भी ऑनलाइन है। अगर यह ऑफ़लाइन हो गया है, तो ऑनलाइन एक kml फ़ाइल ढूंढें और अपना url बदलें


1
मैप्स ऐप से बैक बटन दबाते समय, एक काली स्क्रीन दिखाई देती है और अंतर्निहित गतिविधि को फिर से बनाया जाता है। यह कैसे तय किया जाए?
जस

@ जज, गूगल ने अपने बहुत सारे एपीआई बदले और यह व्यवहार शायद बदल गया है। मैं पिछले कुछ समय से विशेष रूप से खुले सड़क के नक्शे का उपयोग कर रहा हूं, इसलिए मैं आपकी मदद कर सकूंगा। :)
टोनी गिल

0

पहले आपको यह बताने की आवश्यकता है कि आप निहित इरादे का उपयोग कर सकते हैं, एंड्रॉइड प्रलेखन हमें मैप के कार्यान्वयन के लिए एक बहुत विस्तृत सामान्य इरादों के साथ प्रदान करता है आपको दो मापदंडों के साथ एक नया इरादा बनाने की आवश्यकता है

  • कार्य
  • उरी

कार्रवाई के लिए हम उपयोग कर सकते हैं Intent.ACTION_VIEW और उरी के लिए हमें इसका निर्माण करना चाहिए, नीचे मैंने गतिविधि बनाने, बनाने, शुरू करने के लिए एक नमूना कोड संलग्न किया है।

 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 मैप्स ऐप क्रैश हो जाता है। यहां तक कि आधिकारिक दस्तावेज इस कारण से कच्चे / अपारदर्शी यूआरआई का उपयोग करता है। फिर सही कोड होगा:Uri.parse("geo:0,0?q=" + Uri.encode("Eiffel Tower"))
१ite

इस उत्तर को इस स्पष्टीकरण के लिए भी देखें कि आपका उत्तर क्यों काम नहीं करता है: stackoverflow.com/a/12035226/313113
18:11 पर bitek

0

एक अच्छा कोटलिन समाधान, नवीनतम क्रॉस-प्लेटफ़ॉर्म उत्तर का उपयोग करके लक्ष्मण साई द्वारा ...

कोई अनावश्यक 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 मैप्स दिशाओं को लॉन्च कर सकते हैं

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.