Android의 의도를 통해 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 년 5 월 Google은 범용 크로스 플랫폼 Google지도 URL을위한 새로운 API를 출시했습니다.

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

새로운 API에서도 인 텐트를 사용할 수 있습니다.


2
내가 아는 것은 아닙니다. 그러나 사용자가이 유형의 인 텐트를 맵 앱으로 열기 위해 기본 앱을 이미 선택한 경우 대화 상자가 없습니다.
Jan S.

111
대화 상자를 제거하려면 사용하려는 패키지에 대한 힌트를 제공 할 수 있습니다. startActivity () 전에 다음을 추가하십시오. intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
Jeremy Logan

googlemaps 애플리케이션이 아닌 네비게이터에 표시하는 방법은 무엇입니까?
NullPointerException

68
사용자가 선호하는 다른 앱이있을 때 특정 활동으로 사용자를 강요하면 안드로이드 정신을 결합시키는 데 반하는 것 같습니다. 인 텐트 필터가 여기서 처리하도록 유혹하고 싶습니다.
superluminary 2018 년

15
탐색 의도는 공식적으로 지금 지원하는 것 : developers.google.com/maps/documentation/android/...
Sanketh Katta

124

이것은 "길 찾기"를 요청했기 때문에 약간의 주제가 아니지만 Android 설명서에 설명 된 Geo URI 체계를 사용할 수도 있습니다.

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

"geo : latitude, longitude"를 사용할 때의 문제는 Google지도가 핀이나 레이블없이 특정 지점에만 중심을두고 있다는 것입니다.

특히 정확한 장소를 가리 키거나 지시를해야하는 경우에는 매우 혼란 스러울 수 있습니다.

지오 포인트에 레이블을 지정하기 위해 "geo : lat, lon? q = name"쿼리 매개 변수를 사용하는 경우 검색을 위해 쿼리를 사용하고 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
기본 geo : 0,0은지도를 거기로 이동시킵니다. 이 솔루션 [ "geo : 0,0? q = 37.423156, -122.084917 ("+ name + ")"]을 사용하면 고유 한 마커 이름을 입력 할 수 있습니다. 감사.
gnac

4
훌륭하게 작동
-fyi

1
의도에서 기본 대중 교통 모드를 설정할 수 있습니까? 자동차 옵션은 기본적으로 선택되어 있습니다. 걷기를 기본 모드로 설정할 수 있습니까?
Bear

6
왜 사용하지 geo:37.423156,-122.084917?q=37.423156,-122.084917 ...않습니까?
rekire

1
label 매개 변수를 urlEncode해야합니다. 공간과 같은 특수 문자에 문제가있었습니다.
Ethan

100

현재 답변은 훌륭하지만 그중 어느 것도 내가 찾고있는 것을 전혀하지 않았지만 geos 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);

완전성을 위해 사용자에게지도 앱이 설치되어 있지 않으면 ActivityNotFoundException을 잡는 것이 좋습니다. 그러면지도 앱 제한없이 활동을 다시 시작할 수 있습니다. 인터넷 브라우저가이 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
이것은 훌륭한 답변입니다 David! 또한 내비게이션 앱 내부에서 실제로 내비게이션을 시작하는 방법을 알고 있습니까? 현재 상태에서 사용자는 마지막으로 '탐색 시작'을 클릭해야합니다. 전달할 매개 변수를 Google에서 검색했지만 찾을 수 없습니다.
Nirmal

지도 앱에서 뒤로 버튼을 누르면 검은 색 화면이 표시되고 기본 활동이 다시 생성됩니다.
Jas

@Jas intent.setclassname 메소드 제거
Ameen Maheen

안녕, 위의 코드는 안드로이드 버전 4.4.2, 4.4.4 및 5.0.2에서 기본 맵 앱을 시작하는 데 시간이 오래 걸립니다. 5.1 및 마시멜로 버전에서 잘 시작됩니다. 이 문제를 해결하는 데 도움을 주시겠습니까?
OnePunchMan

이제 intent.setClassName ( "com.google.android.apps.maps", "com.google.android.maps.MapsActivity") 대신 intent.SetPackage를 사용하는 것이 좋습니다. 이를 반영하여 답변을 업데이트하겠습니다.
David Thompson

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)

여기서 "mode = b"는 자전거입니다.

다음을 사용하여 운전, 걷기 및 자전거 모드를 설정할 수 있습니다.

  • 운전을위한 d
  • 걷기위한 w
  • 자전거를 타기위한 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 docs 에 따르면 23 웨이 포인트의 한계는 분명히 있습니다 . 그것이 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);

또는 location을 통해 표시하려면 다음을 사용하십시오.

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

자세한 내용은 이 답변을 참조하십시오

참고 :이 예에서는 (mar13 기준) 여전히 온라인 상태 인 샘플 파일을 사용합니다. 오프라인 상태 인 경우 온라인에서 kml 파일을 찾고 URL을 변경하십시오.


1
지도 앱에서 뒤로 버튼을 누르면 검은 색 화면이 표시되고 기본 활동이 다시 생성됩니다.
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를 사용하면 <scheme>://<authority><absolute path>?<query>#<fragment>불투명 URI가 아닌 : 형식으로 절대 URI에 대해서만 작동합니다 <scheme>:<opaque part>#<fragment>. 위의 코드는 다음 URI를 생성합니다. geo:/0%2C0?Eiffel%20Tower이로 인해 Google지도 앱이 중단됩니다. 공식 문서 조차도 이러한 이유로 원시 / 불투명 URI를 사용합니다. 올바른 코드는 다음과 같습니다.Uri.parse("geo:0,0?q=" + Uri.encode("Eiffel Tower"))
bitek

: 또한 당신의 대답은 작동하지 않는 이유에 대한 설명이 답을 stackoverflow.com/a/12035226/313113
bitek

0

lakshman sai가 언급 한 최신 크로스 플랫폼 답변을 사용하는 멋진 kotlin 솔루션 ...

불필요한 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

이 방법으로 Android의 의도를 통해 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);
            }
        }

    });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.