Uygulamamdan standart Google Harita uygulamasını nasıl açabilirim?


140

Kullanıcı uygulamamda düğmeye bastığında, standart Google Harita uygulamasını açmak ve belirli bir konumu göstermek istiyorum. Nasıl yapabilirim? (kullanmadan com.google.android.maps.MapView)

Yanıtlar:


241

IntentCoğrafi URI ile bir nesne oluşturmalısınız :

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

Bir adres belirtmek istiyorsanız, başka bir coğrafi-URI biçimi kullanmalısınız geo:0,0?q=address.

başvuru: https://developer.android.com/guide/components/intents-common.html#Maps


1
Teşekkürler, @Pixie! Enlem ve boylam biçimi nedir? Eğer lat: 59.915494, lng: 30.409456geçersem yanlış pozisyona döner.
LA_

2
Tamam, sorunu buldum. String.format("geo:%f,%f", latitude, longitude)virgül ile dize döndürdü: geo:59,915494,30,409456.
LA_

20
Beni bu yere götürüyor ama oraya bir balon koymuyor. Kullanıcı bir yön vb almak için tıklayabilirsiniz böylece bir balon isterdim
Mike

5
Basit String birleşimi için String.format () ile uğraşmayın. Bu yöntem yalnızca kullanıcı arayüzü metni içindir, bu nedenle ondalık nokta gösterimi değişebilir. "+" Operatörünü veya StringBuilder: String uri = "geo:" + lastLocation.getLatitude () + "," + lastLocation.getLongitude () kullanın.
Agustí Sánchez

4
Yol tarifleri için artık google.navigation ile bir gezinme amacı desteklenmektedir: q = enlem, boylam: Uri gmmIntentUri = Uri.parse ("google.navigation: q =" + 12f "+", "+ 2f); Amaç haritasıIntent = yeni Niyet (Niyet.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage ("com.google.android.apps.maps"); startActivity (mapIntent);
David Thompson

106

Ayrıca URI'niz olarak http://maps.google.com/maps 'yi .

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

veya yalnızca Google Haritalar uygulamasının kullanıldığından emin olabilirsiniz, bu, amaç filtresinin (iletişim kutusunun)

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

şöyle:

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

veya her koordinat kümesinden sonra parantez içine bir dize ekleyerek konumlara etiket ekleyebilirsiniz:

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

Kullanıcıların geçerli konumunu başlangıç ​​noktası olarak kullanmak için (ne yazık ki geçerli konumu etiketlemek için bir yol bulamadım) sonra saddr parametreyi aşağıdaki gibi :

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

Tamlık için, kullanıcının haritalar uygulaması yüklü değilse, @TonyQ'nun belirttiği gibi ActivityNotFoundException'ı yakalamak iyi bir fikir olacaktır, o zaman aktiviteyi haritalar uygulaması kısıtlaması olmadan tekrar başlatabiliriz, oldukça emin olabiliriz bir internet tarayıcısı bu url şemasını başlatmak için geçerli bir uygulama olduğu için sonunda hiç Tost'a ulaşmayacağımızı.

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

DÜZENLE:

Yol tarifleri için artık google.navigation ile bir gezinme amacı desteklenmektedir

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 argüman istisnalarını biçimlendiremiyor
Amitsharma

Eğer bir float olmalıdır parametrelerden biri olarak bir dize var gibi [Dize uri = String.Format ile başlayan çizgi] ile kodunun ilk satırı yerini ne gönderilmesi için lütfen görünüyor
David Thompson

Enlem ve boylam ile google haritalarına etiket geçerken, harita uygulaması etiketi adreslere dönüştürür. Lütfen bu sorunun nasıl çözüleceğini söyleyebilir misiniz?
Rohan Sharma

41

Dize biçimini kullanmak yardımcı olacaktır, ancak yerel ayarlarla tam olarak ilgilenmeniz gerekir. Almanya'da şamandıra bir nokta yerine virgülle ayrılacaktır.

Kullanılması String.format("geo:%f,%f",5.1,2.1);yerel ingilizce sonuca olacak "geo:5.1,2.1"ama Alman yerel ayarıyla alacak"geo:5,1,2,1"

Bu davranışı önlemek için İngilizce yerel ayarını kullanmalısınız.

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

Coğrafi noktaya bir etiket ayarlamak için geo uri'nizi aşağıdakileri kullanarak genişletebilirsiniz:

!!! ancak buna dikkat edin, geo-uri hala geliştirilme aşamasındadır 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);

uydu veya harita katmanı ekranında arama yapmak için "& t = h" yerine "& t = m" tuşlarını da kullanabilirsiniz.
tony gil

1
Ben bir balon almak böylece koordinatları ile bir sorgu eklemek dışında benzer bir şey deniyorum. Kodum tam olarak ilk örneğinize benziyor. URI'yi İngilizce yerel ayarıyla biçimlendiriyorum, ancak Alman yerel ayarına ayarlanmış cihazımda kullandığımda, Google Haritalar yine de sorgularımın çalışmaması için noktaları virgülle değiştiriyor. Cihazın yerel ayarını İngilizce olarak ayarladığımda ABD mükemmel çalışıyor. Ne yapabilirim? Google Haritalar'ın sorgu dizesini tekrar neyin değiştirdiği önemli değil.
kaolick


6

Bazen geo: protocal ile ilişkili herhangi bir uygulama yoksa, işlemek için ActivityNotFoundException almak için try-catch kullanabilirsiniz.

Varsayılan olarak google map yüklü olmayan androVM gibi bir emülatör kullandığınızda olur.


6

Aşağıdaki kod snippet'ini de kullanabilirsiniz, bu şekilde google haritaların varlığı, amaç başlamadan önce kontrol edilir.

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

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


1

Üzerinde PIN OLAN konuma gitmek için şunu kullanın:

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

pim olmadan, bunu uri'de kullanın:

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

0

Niyeti hazırladığım ve sonunda CITY_NAME kullanarak Geocoder tarafından boylam ve enlemi hesaplayan harita işaretleyici etkinliğine CITY_NAME aktardığımda örnek bir uygulamam var.

Aşağıda, harita işaretleyici etkinliğini ve eksiksiz MapsMarkerActivity'yi başlatmanın kod snippet'i bulunmaktadır.

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

Bağlantılar yüzden yukarıda tam kodu yapıştırdıysanız sürenin sona ermesi ancak her ihtimale karşı en sonra da mevcut komple kodunu görmek istiyorsanız: https://github.com/gosaliajigar/CSC519/tree/master/CSC519_HW4_89753


0

Bu Kotlin'de yazılmıştır, bulunursa haritalar uygulamasını açar ve noktayı yerleştirir ve yolculuğa başlamanıza izin verir:

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

Değiştir requireActivity()inizle Context.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.