내 응용 프로그램에서 표준 Google지도 응용 프로그램을 여는 방법은 무엇입니까?


140

사용자가 내 응용 프로그램에서 버튼을 누르면 표준 Google지도 응용 프로그램을 열고 특정 위치를 표시하고 싶습니다. 내가 어떻게 해? (를 사용하지 않고 com.google.android.maps.MapView)

답변:


241

Intentgeo-URI를 사용하여 객체를 만들어야합니다 .

String uri = String.format(Locale.ENGLISH, "geo:%f,%f", latitude, longitude);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
context.startActivity(intent);

주소를 지정하려면 다른 형식의 geo-URI를 사용해야합니다 geo:0,0?q=address.

참조 : https://developer.android.com/guide/components/intents-common.html#Maps


1
감사합니다, @Pixie! 위도와 경도의 형식은 무엇입니까? 통과 lat: 59.915494, lng: 30.409456하면 잘못된 위치를 반환합니다.
LA_

2
좋아, 나는 문제를 발견했다. String.format("geo:%f,%f", latitude, longitude)쉼표와 함께 문자열을 반환했습니다 : geo:59,915494,30,409456.
LA_

20
이 위치로 나를 이동하지만 거기에 풍선을 넣지 않습니다. Baloon을 좋아하여 사용자가 클릭하여 길 찾기 등을 할 수 있습니다.
Mike

5
간단한 문자열 연결을 위해 String.format ()을 엉망으로 만들지 마십시오. 이 방법은 UI 텍스트에만 사용되므로 소수점 표시가 다를 수 있습니다. "+"연산자 또는 StringBuilder를 사용하십시오. String uri = "geo :"+ lastLocation.getLatitude () + ","+ lastLocation.getLongitude ().
Agustí Sánchez

4
길 찾기의 경우 탐색 의도가 google.navigation : q = 위도, 경도로 지원됩니다. Uri gmmIntentUri = Uri.parse ( "google.navigation : q ="+ 12f "+", "+ 2f); 의도 mapIntent = 새로운 Intent (Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage ( "com.google.android.apps.maps"); startActivity (mapIntent);
David Thompson

106

단순히 http://maps.google.com/maps 를 URI로 사용할 수도 있습니다 .

String uri = "http://maps.google.com/maps?saddr=" + sourceLatitude + "," + sourceLongitude + "&daddr=" + destinationLatitude + "," + destinationLongitude;
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(intent);

또는 Google지도 앱만 사용하도록 할 수 있습니다. 이렇게하면 인 텐트 필터 (대화 상자)가 표시되지 않습니다.

intent.setPackage("com.google.android.apps.maps");

이렇게 :

String uri = "http://maps.google.com/maps?saddr=" + sourceLatitude + "," + sourceLongitude + "&daddr=" + destinationLatitude + "," + destinationLongitude;
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setPackage("com.google.android.apps.maps");
startActivity(intent);

또는 다음과 같이 각 좌표 세트 뒤에 괄호 안에 문자열을 추가하여 위치에 레이블을 추가 할 수 있습니다.

String uri = "http://maps.google.com/maps?saddr=" + sourceLatitude + "," + sourceLongitude + "(" + "Home Sweet Home" + ")&daddr=" + 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);

사용자의 현재 위치를 시작점으로 사용하려면 (불행히도 현재 위치에 레이블을 saddr지정할 방법을 찾지 못했습니다) 다음 과 같이 매개 변수를 삭제하십시오 .

String uri = "http://maps.google.com/maps?daddr=" + 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);

완전성을 위해 사용자에게 맵 앱이 설치되어 있지 않으면 @TonyQ 상태와 같이 ActivityNotFoundException을 잡는 것이 좋습니다. 그런 다음 맵 앱 제한없이 활동을 다시 시작할 수 있습니다. 인터넷 브라우저가이 URL 스킴을 시작하기에 유효한 응용 프로그램이기 때문에 결국에는 토스트에 도달하지 않습니다.

        String uri = "http://maps.google.com/maps?daddr=" + 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);
Intent mapIntent = new Intent(Intent.ACTION_VIEW, navigationIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

java.util.IllegalFormatConversionException : % f는 java.lang.String 인수 예외를 형식화 할 수 없습니다.
Amitsharma

당신이 부동해야 하나의 매개 변수로 문자열을 가지고있는 것처럼 당신은 [문자열 URI = 및 String.format로 시작하는 줄]와 코드의 첫 번째 라인을 교체 한 내용을 게시하시기 바랍니다 보인다
데이비드 톰슨

위도와 경도가있는 Google지도에 레이블을 전달하면지도 응용 프로그램이 레이블을 주소로 변환합니다. 이 문제를 해결하는 방법을 알려주시겠습니까?
Rohan Sharma

41

문자열 형식을 사용하면 도움이되지만 로케일을 충분히주의해야합니다. 독일에서는 float 대신 점이 쉼표로 구분됩니다.

사용 String.format("geo:%f,%f",5.1,2.1);로케일 영어 결과에하는 것입니다 "geo:5.1,2.1"하지만, 독일어 로케일 당신은 얻을 것이다"geo:5,1,2,1"

이 동작을 방지하려면 영어 로캘을 사용해야합니다.

String uri = String.format(Locale.ENGLISH, "geo:%f,%f", latitude, longitude);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
context.startActivity(intent);

라벨을 지리적 위치로 설정하려면 다음을 사용하여 지리적 위치를 확장 할 수 있습니다.

!!! 그러나이 점에주의해야합니다. 지리적 위치는 아직 개발 중입니다 http://tools.ietf.org/html/draft-mayrhofer-geo-uri-00

String uri = String.format(Locale.ENGLISH, "geo:%f,%f?z=%d&q=%f,%f (%s)", 
                           latitude, longitude, zoom, latitude, longitude, label);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
context.startActivity(intent);

위성 또는 맵 레이어 표시에서 호출 할 때 "& t = h"대 "& t = m"을 사용할 수도 있습니다.
tony gil

1
풍선을 얻을 수 있도록 좌표로 쿼리를 추가한다는 점을 제외하고 비슷한 것을 시도하고 있습니다. 내 코드는 첫 번째 예제와 똑같습니다. 영어 로캘로 URI 형식을 지정하지만 독일어 로캘로 설정된 기기에서 URI를 사용하는 경우 Google지도는 여전히 쿼리가 작동하지 않도록 점을 쉼표로 바꿉니다. 장치의 로캘을 영어 미국 fe로 설정하면 완벽하게 작동합니다. 어떡해? Google지도가 검색어 문자열을 다시 변경하더라도 상관 없습니다.
kaolick


6

geo : protocal과 관련된 응용 프로그램이없는 경우 try-catch를 사용하여 ActivityNotFoundException이 처리하도록 할 수 있습니다.

Google 맵이 기본적으로 설치되지 않은 androVM과 같은 에뮬레이터를 사용할 때 발생합니다.


6

아래 코드 스 니펫을 사용할 수도 있습니다.이 방법으로 의도가 시작되기 전에 Google지도가 있는지 확인합니다.

Uri gmmIntentUri = Uri.parse(String.format(Locale.ENGLISH,"geo:%f,%f", latitude, longitude));
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
if (mapIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(mapIntent);
}

참조 : https://developers.google.com/maps/documentation/android-api/intents


1

PIN이있는 위치로 이동하려면 다음을 사용하십시오.

String uri = "http://maps.google.com/maps?q=loc:" + destinationLatitude + "," + destinationLongitude;
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setPackage("com.google.android.apps.maps");
startActivity(intent);

핀이 없으면 URI에서 이것을 사용하십시오.

 String uri = "geo:" + destinationLatitude + "," + destinationLongitude;

0

의도를 준비하고 의도적으로 CITY_NAME을 (를) 지오 코더가 CITY_NAME을 사용하여 경도와 위도를 계산하는지도 마커 활동으로 전달하는 샘플 앱이 있습니다.

아래는지도 마커 활동 및 전체 MapsMarkerActivity를 시작하는 코드 스 니펫입니다.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    } else if (id == R.id.action_refresh) {
        Log.d(APP_TAG, "onOptionsItemSelected Refresh selected");
        new MainActivityFragment.FetchWeatherTask().execute(CITY, FORECAS_DAYS);
        return true;
    } else if (id == R.id.action_map) {
        Log.d(APP_TAG, "onOptionsItemSelected Map selected");
        Intent intent = new Intent(this, MapsMarkerActivity.class);
        intent.putExtra("CITY_NAME", CITY);
        startActivity(intent);
        return true;
    }

    return super.onOptionsItemSelected(item);
}

public class MapsMarkerActivity extends AppCompatActivity
        implements OnMapReadyCallback {

    private String cityName = "";

    private double longitude;

    private double latitude;

    static final int numberOptions = 10;

    String [] optionArray = new String[numberOptions];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Retrieve the content view that renders the map.
        setContentView(R.layout.activity_map);
        // Get the SupportMapFragment and request notification
        // when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        // Test whether geocoder is present on platform
        if(Geocoder.isPresent()){
            cityName = getIntent().getStringExtra("CITY_NAME");
            geocodeLocation(cityName);
        } else {
            String noGoGeo = "FAILURE: No Geocoder on this platform.";
            Toast.makeText(this, noGoGeo, Toast.LENGTH_LONG).show();
            return;
        }
    }

    /**
     * Manipulates the map when it's available.
     * The API invokes this callback when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user receives a prompt to install
     * Play services inside the SupportMapFragment. The API invokes this method after the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        // Add a marker in Sydney, Australia,
        // and move the map's camera to the same location.
        LatLng sydney = new LatLng(latitude, longitude);
        // If cityName is not available then use
        // Default Location.
        String markerDisplay = "Default Location";
        if (cityName != null
                && cityName.length() > 0) {
            markerDisplay = "Marker in " + cityName;
        }
        googleMap.addMarker(new MarkerOptions().position(sydney)
                .title(markerDisplay));
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    }

    /**
     * Method to geocode location passed as string (e.g., "Pentagon"), which
     * places the corresponding latitude and longitude in the variables lat and lon.
     *
     * @param placeName
     */
    private void geocodeLocation(String placeName){

        // Following adapted from Conder and Darcey, pp.321 ff.
        Geocoder gcoder = new Geocoder(this);

        // Note that the Geocoder uses synchronous network access, so in a serious application
        // it would be best to put it on a background thread to prevent blocking the main UI if network
        // access is slow. Here we are just giving an example of how to use it so, for simplicity, we
        // don't put it on a separate thread.  See the class RouteMapper in this package for an example
        // of making a network access on a background thread. Geocoding is implemented by a backend
        // that is not part of the core Android framework, so we use the static method
        // Geocoder.isPresent() to test for presence of the required backend on the given platform.

        try{
            List<Address> results = null;
            if(Geocoder.isPresent()){
                results = gcoder.getFromLocationName(placeName, numberOptions);
            } else {
                Log.i(MainActivity.APP_TAG, "No Geocoder found");
                return;
            }
            Iterator<Address> locations = results.iterator();
            String raw = "\nRaw String:\n";
            String country;
            int opCount = 0;
            while(locations.hasNext()){
                Address location = locations.next();
                if(opCount == 0 && location != null){
                    latitude = location.getLatitude();
                    longitude = location.getLongitude();
                }
                country = location.getCountryName();
                if(country == null) {
                    country = "";
                } else {
                    country =  ", " + country;
                }
                raw += location+"\n";
                optionArray[opCount] = location.getAddressLine(0)+", "
                        +location.getAddressLine(1)+country+"\n";
                opCount ++;
            }
            // Log the returned data
            Log.d(MainActivity.APP_TAG, raw);
            Log.d(MainActivity.APP_TAG, "\nOptions:\n");
            for(int i=0; i<opCount; i++){
                Log.i(MainActivity.APP_TAG, "("+(i+1)+") "+optionArray[i]);
            }
            Log.d(MainActivity.APP_TAG, "latitude=" + latitude + ";longitude=" + longitude);
        } catch (Exception e){
            Log.d(MainActivity.APP_TAG, "I/O Failure; do you have a network connection?",e);
        }
    }
}

링크가 만료되어 위의 완전한 코드를 붙여 넣었지만 완전한 코드를 보려면 https://github.com/gosaliajigar/CSC519/tree/master/CSC519_HW4_89753 에서 사용할 수 있습니다.


0

이것은 코 틀린 (Kotlin)으로 작성되었으며, 발견되면지도 앱을 열고 포인트를 놓고 여행을 시작할 수 있도록합니다.

  val gmmIntentUri = Uri.parse("http://maps.google.com/maps?daddr=" + adapter.getItemAt(position).latitud + "," + adapter.getItemAt(position).longitud)
        val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
        mapIntent.setPackage("com.google.android.apps.maps")
        if (mapIntent.resolveActivity(requireActivity().packageManager) != null) {
            startActivity(mapIntent)
        }

로 교체 requireActivity()하십시오 Context.

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