Khởi chạy Chỉ đường trên Google Maps thông qua ý định trên Android


Câu trả lời:


630

Bạn có thể sử dụng một cái gì đó như thế này:

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

Để bắt đầu điều hướng từ vị trí hiện tại, hãy xóa saddrtham số và giá trị.

Bạn có thể sử dụng một địa chỉ đường phố thực tế thay vì vĩ độ và kinh độ. Tuy nhiên, điều này sẽ cung cấp cho người dùng một hộp thoại để chọn giữa việc mở nó thông qua trình duyệt hoặc Google Maps.

Điều này sẽ kích hoạt Google Maps trực tiếp trong chế độ điều hướng:

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

CẬP NHẬT

Vào tháng 5 năm 2017, Google đã ra mắt API mới cho các URL Google Maps đa nền tảng, phổ quát:

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

Bạn cũng có thể sử dụng Ý định với API mới.


2
Không phải là tôi biết. Tuy nhiên, sẽ không có bất kỳ hộp thoại nào nếu người dùng đã chọn ứng dụng mặc định để mở loại ý định này làm ứng dụng bản đồ.
Jan S.

111
Nếu bạn muốn thoát khỏi hộp thoại, bạn có thể đưa ra ý định gợi ý về gói bạn muốn sử dụng. Trước khi bắt đầuActivity () thêm điều này: intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
Jeremy Logan

và làm thế nào để tạm dừng để hiển thị nó trên bộ điều hướng chứ không phải trên ứng dụng googlemaps?
NullPulumException

68
Buộc người dùng vào một hoạt động cụ thể khi họ có thể có các ứng dụng khác mà họ thích dường như trái ngược với tinh thần Android cùng với tôi. Tôi sẽ bị cám dỗ để cho các bộ lọc ý định chăm sóc mọi thứ ở đây.
siêu sáng

15
Ý định điều hướng dường như được hỗ trợ chính thức ngay bây giờ: developers.google.com/maps/documentation/android/
mẹo

124

Đây là một chủ đề nhỏ vì bạn đã hỏi "chỉ đường", nhưng bạn cũng có thể sử dụng lược đồ Geo URI được mô tả trong Tài liệu Android:

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

Vấn đề khi sử dụng "địa lý: vĩ độ, kinh độ" là Google Maps chỉ tập trung vào điểm của bạn, không có bất kỳ mã pin hoặc nhãn nào.

Điều đó khá khó hiểu, đặc biệt nếu bạn cần chỉ đến một địa điểm chính xác hoặc / và hỏi đường.

Nếu bạn sử dụng tham số truy vấn "Geo: lat, lon? Q = name" để gắn nhãn cho công cụ địa lý của bạn, nó sẽ sử dụng truy vấn để tìm kiếm và loại bỏ các tham số lat / lon.

Tôi đã tìm thấy một cách để căn giữa bản đồ với lat / lon và hiển thị mã pin với nhãn tùy chỉnh, rất đẹp để hiển thị và hữu ích khi hỏi đường hoặc bất kỳ hành động nào khác:

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

LƯU Ý (bởi @TheNail): Không hoạt động trong Bản đồ v.7 (phiên bản mới nhất tại thời điểm viết). Sẽ bỏ qua tọa độ và tìm kiếm một đối tượng có tên đã cho giữa các dấu ngoặc đơn. Xem thêm Ý định cho Google Maps 7.0.0 với vị trí


3
Đẹp, địa lý mặc định: 0,0 chỉ di chuyển bản đồ ở đó. Giải pháp này ["Geo: 0,0? Q = 37.423156, -122,084917 (" + name + ")"] cho phép bạn đặt tên đánh dấu của riêng bạn. Cảm ơn.
gnac

4
Hoạt động tuyệt vời - fyi dường như không hoạt động cùng với tham số truy vấn "z" (mức thu phóng)
scol Animal

1
Có thể đặt chế độ vận chuyển mặc định trong ý định. Theo mặc định, tùy chọn xe được chọn. Tôi có thể đặt Walking làm chế độ mặc định không?
Gấu

6
Tại sao bạn không sử dụng geo:37.423156,-122.084917?q=37.423156,-122.084917 ...?
thiệu

1
Hãy chắc chắn rằng bạn urlEncode tham số nhãn. Tôi đã có vấn đề với các nhân vật đặc biệt như không gian.
Ethan

100

Mặc dù các câu trả lời hiện tại rất hay, nhưng không có câu trả lời nào phù hợp với những gì tôi đang tìm kiếm, tôi chỉ muốn mở ứng dụng bản đồ, thêm tên cho từng vị trí nguồn và đích, sử dụng lược đồ URI địa lý sẽ không hiệu quả với tôi tất cả và liên kết web bản đồ không có nhãn vì vậy tôi đã đưa ra giải pháp này, về cơ bản là sự kết hợp của các giải pháp và nhận xét khác được đưa ra ở đây, hy vọng nó hữu ích cho những người khác xem câu hỏi này.

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

Để sử dụng vị trí hiện tại của bạn làm điểm bắt đầu (tiếc là tôi chưa tìm được cách gắn nhãn vị trí hiện tại), sau đó sử dụng cách sau

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

Để hoàn thiện, nếu người dùng không cài đặt ứng dụng bản đồ thì bạn nên bắt đầu ActivityNotFoundException, sau đó chúng tôi có thể bắt đầu lại hoạt động mà không bị hạn chế ứng dụng bản đồ, chúng tôi có thể chắc chắn rằng chúng tôi sẽ không bao giờ nhận được đến Toast ở cuối vì trình duyệt internet là một ứng dụng hợp lệ để khởi chạy lược đồ url này.

        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 Bất kỳ vĩ độ hoặc kinh độ nào được sử dụng trong ví dụ của tôi không đại diện cho vị trí của tôi, bất kỳ sự tương đồng nào với một vị trí thực sự là sự trùng hợp thuần túy, còn gọi là tôi không đến từ Châu Phi: P

BIÊN TẬP:

Đối với chỉ đường, mục đích điều hướng hiện được hỗ trợ với google.navulation

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
Đây là một câu trả lời tuyệt vời David! Ngoài ra, bạn có biết làm thế nào để thực sự bắt đầu điều hướng trong khi bên trong ứng dụng điều hướng? Ở trạng thái hiện tại, người dùng phải nhấp vào 'Bắt ​​đầu Điều hướng' một lần cuối cùng. Tôi đã tìm kiếm Google cho bất kỳ tham số nào để vượt qua, nhưng không thể tìm thấy bất kỳ tham số nào.
Nirmal

Khi nhấn nút quay lại từ ứng dụng bản đồ, sẽ hiển thị màn hình đen và hoạt động bên dưới được tạo lại. Bạn có biết cách khắc phục vấn đề này không?
Jas

@Jas xóa phương thức aim.set classname
Ameen Maheen

xin chào, đoạn mã trên đang mất nhiều thời gian để khởi chạy ứng dụng bản đồ mặc định trong phiên bản Android 4.4.2, 4.4.4 và 5.0.2. Nó ra mắt tốt trong phiên bản 5.1 và Marshmallow. Bạn có thể vui lòng giúp đỡ trong việc giải quyết vấn đề này.
OnePunchMan

Bây giờ tôi sẽ đề xuất sử dụng aim.SetPackage thay vì aim.setClassName ("com.google.android.apps.maps", "com.google.android.maps.MapsActivity"); Tôi sẽ cập nhật câu trả lời để phản ánh điều này.
David Thompson

22

Sử dụng URL Google Maps đa nền tảng mới nhất : Ngay cả khi ứng dụng google maps bị thiếu, nó sẽ mở trong trình duyệt

Ví dụ 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

Mở Google Maps bằng Intent với các chế độ khác nhau:

Chúng tôi có thể mở ứng dụng Google Maps bằng ý định:

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)

Ở đây, "mode = b" dành cho xe đạp.

Chúng ta có thể cài đặt chế độ lái xe, đi bộ và đi xe đạp bằng cách sử dụng:

  • d để lái xe
  • w đi bộ
  • b cho xe đạp

Bạn có thể tìm thêm về ý định với google maps ở đây .

Lưu ý: Nếu không có lộ trình cho xe đạp / ô tô / đi bộ thì nó sẽ hiển thị cho bạn "Không thể tìm đường đến đó"

Bạn có thể kiểm tra câu trả lời ban đầu của tôi ở đây .


8

Bạn có thể thử mở ứng dụng Android Maps tích hợp bằng Intent.setClassNamephương pháp này.

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

Đối với nhiều điểm, cách sau cũng có thể được sử dụng.

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

Tập hợp tọa độ đầu tiên là vị trí bắt đầu của bạn. Tất cả tiếp theo là điểm cách, tuyến đường âm mưu đi qua.

Chỉ cần tiếp tục thêm điểm cách bằng cách kết hợp "/ vĩ độ, kinh độ" ở cuối. Rõ ràng là có giới hạn 23 điểm theo tài liệu google . Không chắc chắn nếu điều đó áp dụng cho Android quá.


Điều gì không làm việc? Bạn đang thấy gì khi thực thi mã chính xác này?
Adeel Tariq

Trên thực tế không sử dụng tọa độ chính xác tôi đặt ở đây. Họ đang ở giữa nơi không có nơi nào không có đường xung quanh nên sẽ không hoạt động.
Adeel Tariq

4

Nếu bạn muốn hiển thị Vĩ độ và Kinh độ từ hướng hiện tại, bạn có thể sử dụng điều này:

Hướng dẫn luôn được đưa ra từ vị trí hiện tại của người dùng.

Các truy vấn sau đây sẽ giúp bạn thực hiện điều đó. Bạn có thể vượt qua vĩ độ và kinh độ đích ở đây:

google.navigation:q=latitude,longitude

Sử dụng ở trên như:

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

Hoặc nếu bạn muốn hiển thị qua vị trí, hãy sử dụng:

google.navigation:q=a+street+address

Thông tin thêm tại đây: Ý định của Google Maps dành cho Android


để biết hướng dẫn để làm việc, tôi cần thêmmapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Ai đó ở đâu đó vào

4

Google DirectionsViewvới vị trí nguồn là vị trí hiện tại và vị trí đích như được cung cấp dưới dạng chuỗi

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

Trong phần trên destinationCityNamelà một chuỗi biến đổi được sửa đổi theo yêu cầu.


3

thử cái này

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

Đây là những gì làm việc cho tôi:

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

nếu bạn biết điểm A, điểm B (và bất kỳ tính năng hoặc dấu vết nào ở giữa), bạn có thể sử dụng tệp KML cùng với ý định của mình.

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

để biết thêm thông tin, hãy xem câu trả lời SO này

LƯU Ý: ví dụ này sử dụng tệp mẫu mà (kể từ mar13) vẫn trực tuyến. nếu nó đã ngoại tuyến, hãy tìm tệp kml trực tuyến và thay đổi url của bạn


1
Khi nhấn nút quay lại từ ứng dụng bản đồ, sẽ hiển thị màn hình đen và hoạt động bên dưới được tạo lại. Bạn có biết cách khắc phục vấn đề này không?
Jas

@Jas, google đã thay đổi rất nhiều API và hành vi này cũng có thể đã thay đổi. Tôi đã sử dụng bản đồ đường phố mở khá lâu rồi, vì vậy tôi sẽ có thể giúp bạn. :)
tony gil

0

Trước tiên, bạn cần phải sử dụng mục đích ngầm, tài liệu Android cung cấp cho chúng tôi rất chi tiết ý định chung để thực hiện ý định bản đồ mà bạn cần để tạo ý định mới với hai tham số

  • Hoạt động
  • Uri

Đối với hành động chúng ta có thể sử dụng Intent.ACTION_VIEW và đối với Uri, chúng ta nên Xây dựng nó, bên dưới tôi đã đính kèm một mã mẫu để tạo, xây dựng, bắt đầu hoạt động.

 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
Sử dụng Uri.Builder chỉ hoạt động đối với các URI tuyệt đối, ở dạng : <scheme>://<authority><absolute path>?<query>#<fragment>, không phải là URI mờ <scheme>:<opaque part>#<fragment>. Đoạn mã trên mang lại URI sau: geo:/0%2C0?Eiffel%20Towerkhiến ứng dụng Google Maps bị sập. Ngay cả tài liệu chính thức cũng sử dụng URI thô / mờ vì lý do này. Mã chính xác sau đó sẽ là:Uri.parse("geo:0,0?q=" + Uri.encode("Eiffel Tower"))
cắn

Ngoài ra, hãy xem câu trả lời này để biết giải thích tại sao câu trả lời của bạn không hoạt động: stackoverflow.com/a/12035226/313113
cắn

0

Một giải pháp kotlin hay, sử dụng câu trả lời đa nền tảng mới nhất được đề cập bởi lakshman sai ...

Mặc dù không có Uri.toString và Uri.parse không cần thiết, câu trả lời này rõ ràng và tối thiểu:

 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

Bạn có thể Khởi chạy Google Maps Chỉ thông qua ý định trên Android thông qua cách này

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

    });
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.