it-swarm.com.de

Wie kann ich die Standardanwendung "Google Map" von meiner Anwendung aus öffnen?

Sobald der Benutzer die Schaltfläche in meiner Anwendung drückt, möchte ich die Standardanwendung von Google Map öffnen und einen bestimmten Standort anzeigen. Wie kann ich es tun? (ohne com.google.Android.maps.MapView)

118
LA_

Sie sollten ein Intent-Objekt mit einem Geo-URI erstellen:

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

Wenn Sie eine Adresse angeben möchten, sollten Sie eine andere Form von geo-URI verwenden: geo:0,0?q=address.

referenz: https://developer.Android.com/guide/components/intents-common.html#Maps

207
Michael

Sie können auch einfach http://maps.google.com/maps als URI verwenden

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

sie können auch sicherstellen, dass nur die Google Maps-App verwendet wird. Dadurch wird verhindert, dass der Intent-Filter (Dialog) angezeigt wird 

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

wie so:

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

oder Sie können den Positionen Beschriftungen hinzufügen, indem Sie nach jedem Koordinatensatz eine Zeichenfolge in Klammern einfügen:

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

Um den aktuellen Standort des Benutzers als Ausgangspunkt zu verwenden (leider habe ich keinen Weg gefunden, den aktuellen Standort zu kennzeichnen), lassen Sie den Parameter saddr wie folgt ab:

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

Der Vollständigkeit halber, wenn der Benutzer die Karten-App nicht installiert hat, ist es eine gute Idee, die ActivityNotFoundException abzufangen, wie @TonyQ angibt. Dann können wir die Aktivität ohne Einschränkung der Karten-App erneut starten. Wir können uns ziemlich sicher sein dass wir am Ende nie zum Toast gelangen, da ein Internet-Browser eine gültige Anwendung ist, um auch dieses URL-Schema zu starten.

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

EDIT:

Für Wegbeschreibungen wird jetzt eine Navigationsabsicht mit google.navigation unterstützt

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);
86
David Thompson

Die Verwendung des String-Formats hilft, aber Sie müssen sich mit dem Gebietsschema voll auskennen. In Deutschland wird der Float mit einem Komma getrennt. 

Bei Verwendung von String.format("geo:%f,%f",5.1,2.1); auf locale english ist das Ergebnis "geo:5.1,2.1", aber bei locale german wird "geo:5,1,2,1" angezeigt. 

Sie sollten das englische Gebietsschema verwenden, um dieses Verhalten zu verhindern. 

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

Um ein Label für den Geo-Punkt festzulegen, können Sie Ihren Geo-URI erweitern, indem Sie Folgendes verwenden:

!!! aber seien Sie vorsichtig damit, der Geo-Uri befindet sich noch in der Entwicklunghttp://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);
39
David Boho

Überprüfen Sie diese Seite von Google:

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

Sie können einen URI des Formulars verwenden 

geo:latitude,longitude

um den Google Map Viewer zu öffnen und auf einen Ort zu zeigen.

8
Snicolas

Wenn keine Anwendung mit geo: protocal, Verbunden ist, können Sie try-catch verwenden, um die ActivityNotFoundException für die Verarbeitung zu erhalten.

Dies geschieht, wenn Sie einen Emulator wie androVM verwenden, der standardmäßig nicht auf Google Maps installiert ist.

6
TonyQ

Sie können auch den folgenden Code-Snippet verwenden. Auf diese Weise wird das Vorhandensein von Google Maps überprüft, bevor die Absicht gestartet wird. 

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

Referenz: https://developers.google.com/maps/documentation/Android-api/intents

6

Ich habe eine Beispiel-App, in der ich die Absicht vorbereite und einfach CITY_NAME in der Absicht an die Map-Marker-Aktivität weitergebe, die schließlich Längengrad und Breitengrad nach Geocoder mithilfe von CITY_NAME berechnet.

Nachfolgend finden Sie den Code-Ausschnitt des Startens der Kartenmarkierungsaktivität und der vollständigen 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);
        }
    }
}

Links verfallen, so dass ich den vollständigen Code oben eingefügt habe. Falls Sie jedoch den vollständigen Code sehen möchten, ist er verfügbar unter: https://github.com/gosaliajigar/CSC519/tree/master/CSC519_HW4_89753

0
JRG