เปิดตัว Google Maps Directions ผ่าน Android


399

แอพของฉันต้องแสดงเส้นทาง Google Maps จาก A ถึง B แต่ฉันไม่ต้องการใส่ Google Maps ไว้ในแอปพลิเคชันของฉัน - แทนฉันต้องการเปิดใช้งานด้วยเจตนา เป็นไปได้ไหม ถ้าใช่เป็นอย่างไร


คำตอบ:


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 Maps

สิ่งนี้จะทำให้ Google แผนที่สว่างขึ้นในโหมดนำทางโดยตรง:

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

UPDATE

ในเดือนพฤษภาคม 2560 Google เปิดตัว API ใหม่สำหรับ URL ของ Google แผนที่ข้ามแพลตฟอร์มที่เป็นสากล:

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

คุณสามารถใช้ Intents กับ API ใหม่ได้เช่นกัน


2
ไม่ใช่ว่าฉันรู้ อย่างไรก็ตามจะไม่มีการโต้ตอบใด ๆ หากผู้ใช้เลือกแอปเริ่มต้นเพื่อเปิดการแสดงประเภทนี้เป็นแอพแผนที่
ม.ค. S.

111
หากคุณต้องการกำจัดกล่องโต้ตอบคุณสามารถให้คำแนะนำเกี่ยวกับแพ็คเกจที่คุณต้องการใช้ ก่อนที่ startActivity () เพิ่มสิ่งนี้: intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
Jeremy Logan

และวิธีการตรึงแสดงบนเนวิเกเตอร์และไม่ได้อยู่ในแอปพลิเคชัน googlemaps?
NullPointerException

68
บังคับให้ผู้ใช้เข้าสู่กิจกรรมเฉพาะเมื่อพวกเขาอาจมีแอพอื่น ๆ ที่พวกเขาต้องการดูเหมือนจะขัดกับจิตวิญญาณของ Android ด้วยกันกับฉัน ฉันจะถูกล่อลวงให้ตัวกรองความตั้งใจดูแลสิ่งต่าง ๆ ที่นี่
superluminary

15
ตอนนี้ดูเหมือนว่าจะมีการสนับสนุนการใช้งานการนำทางอย่างเป็นทางการแล้ว: developers.google.com/maps/documentation/android/
......

124

นี่เป็นเรื่องเล็กน้อยเนื่องจากคุณขอคำแนะนำ "" แต่คุณยังสามารถใช้รูปแบบ Geo URI ที่อธิบายไว้ในเอกสาร Android:

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

ปัญหาในการใช้ "geo: ละติจูด, ลองจิจูด" ก็คือ Google แผนที่จะอยู่ตรงจุดที่คุณอยู่

ค่อนข้างจะสับสนโดยเฉพาะถ้าคุณต้องการชี้ไปยังสถานที่ที่แน่นอนหรือขอเส้นทาง

หากคุณใช้พารามิเตอร์การสืบค้น "geo: lat, lon? q = name" เพื่อติดป้ายกำกับ geopoint ของคุณจะใช้การสืบค้นเพื่อค้นหาและยกเลิกพารามิเตอร์ 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 Maps 7.0.0 พร้อมตำแหน่ง


3
ดีค่าเริ่มต้นทางภูมิศาสตร์: 0,0 เพียงเลื่อนแผนที่ไปที่นั่น วิธีแก้ปัญหานี้ ["ตำแหน่งทางภูมิศาสตร์: 0,0? q = 37.423156, -122.084917 (" + ชื่อ + ")"] ช่วยให้คุณใส่ชื่อเครื่องหมายของคุณเอง ขอบคุณ
gnac

4
ใช้งานได้ดี - fyi ไม่ทำงานร่วมกับพารามิเตอร์การค้นหา "z" (ระดับการซูม)
scolestock

1
เป็นไปได้ไหมที่จะตั้งค่าโหมดการขนส่งเริ่มต้นในเจตนา โดยค่าเริ่มต้นตัวเลือกรถยนต์จะถูกเลือก ฉันสามารถตั้งค่า Walking เป็นโหมดเริ่มต้นได้หรือไม่
Bear

6
ทำไมคุณไม่ใช้geo:37.423156,-122.084917?q=37.423156,-122.084917 ...?
rekire

1
ตรวจสอบให้แน่ใจว่าคุณ urlEncode พารามิเตอร์ label ฉันมีปัญหากับตัวละครพิเศษเช่นอวกาศ
Ethan

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

เพื่อความสมบูรณ์ถ้าผู้ใช้ไม่ได้ติดตั้งแอพ Maps มันจะเป็นความคิดที่ดีที่จะจับ ActivityNotFoundException จากนั้นเราสามารถเริ่มต้นกิจกรรมอีกครั้งโดยไม่มีข้อ จำกัด ของแอพ Maps เราค่อนข้างแน่ใจว่าเราจะไม่ได้รับ to toast ในตอนท้ายเนื่องจากเบราว์เซอร์อินเทอร์เน็ตเป็นแอปพลิเคชั่นที่ถูกต้องในการเปิดใช้รูปแบบ 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

แก้ไข:

สำหรับทิศทางความตั้งใจในการนำทางได้รับการสนับสนุนด้วย 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

เมื่อกดปุ่มย้อนกลับจากแอพ Maps จะแสดงหน้าจอสีดำและมีการสร้างกิจกรรมพื้นฐานขึ้นมาคุณมีความคิดอย่างไรในการแก้ไขปัญหานี้
Jas

@Jas วิธีลบ 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"); ฉันจะอัปเดตคำตอบเพื่อสะท้อนถึงสิ่งนี้
David Thompson

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 Maps โดยใช้เจตนาด้วยโหมดที่แตกต่างกัน:

เราสามารถเปิดแอป 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)

ที่นี่ "mode = b" สำหรับรถจักรยาน

เราสามารถตั้งค่าโหมดการขับขี่การเดินและการปั่นจักรยานโดยใช้:

  • d สำหรับการขับรถ
  • w สำหรับการเดิน
  • b สำหรับปั่นจักรยาน

คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับความตั้งใจด้วยแผนที่ Google ที่นี่

หมายเหตุ: หากไม่มีเส้นทางสำหรับรถจักรยาน / รถยนต์ / เดินแล้วมันจะแสดงให้คุณเห็น "ไม่สามารถหาทางที่นั่น"

คุณสามารถตรวจสอบคำตอบเดิมของฉันที่นี่


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

พิกัดชุดแรกคือตำแหน่งเริ่มต้นของคุณ ถัดไปทั้งหมดเป็นจุดทางเส้นทางที่พล็อตผ่านไป

เพียงเพิ่มคะแนนทางโดยต่อท้าย "/ ละติจูดลองจิจูด" ในตอนท้าย นอกจากนี้เห็นได้ชัดว่าไม่เกิน 23 คะแนนตามวิธีที่Google Docs ไม่แน่ใจว่ามันใช้กับ Android ด้วยหรือไม่


อะไรไม่ทำงาน คุณเห็นอะไรขณะเรียกใช้รหัสที่แน่นอนนี้
Adeel Tariq

ที่จริงแล้วอย่าใช้พิกัดที่ฉันใส่ตรงนี้ พวกเขาอยู่ตรงกลางไม่มีที่ไหนที่ไม่มีถนนรอบ ๆ เพื่อที่จะไม่ทำงาน
Adeel Tariq

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เป็นสตริง varaiable แก้ไขได้ตามต้องการ



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 นี้

หมายเหตุ: ตัวอย่างนี้ใช้ไฟล์ตัวอย่างที่ (ณ วันที่ mar13) ยังคงออนไลน์อยู่ หากออฟไลน์หายไปหาไฟล์ kml ออนไลน์และเปลี่ยน URL ของคุณ


1
เมื่อกดปุ่มย้อนกลับจากแอพ Maps จะแสดงหน้าจอสีดำและมีการสร้างกิจกรรมพื้นฐานขึ้นมาคุณมีความคิดอย่างไรในการแก้ไขปัญหานี้
Jas

@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>, <scheme>:<opaque part>#<fragment>ยูริไม่ทึบแสง โค้ดด้านบนให้ผลตอบแทน URI ต่อไปนี้: geo:/0%2C0?Eiffel%20Towerซึ่งทำให้แอป Google Maps ขัดข้อง แม้แต่เอกสารอย่างเป็นทางการก็ใช้ URIs ดิบ / ทึบแสงด้วยเหตุผลอย่างนี้ รหัสที่ถูกต้องนั้นจะเป็น:Uri.parse("geo:0,0?q=" + Uri.encode("Eiffel Tower"))
30464 กัด

ดูคำตอบนี้สำหรับคำอธิบายว่าทำไมคำตอบของคุณไม่ทำงาน: stackoverflow.com/a/12035226/313113
bitek

0

โซลูชัน kotlin ที่ดีโดยใช้คำตอบข้ามแพลตฟอร์มล่าสุดที่กล่าวถึงโดย lakshman sai ...

ไม่มี 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 Directions ผ่านทางเจตนาบน 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);
            }
        }

    });
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.