Bagaimana cara membuka aplikasi Google Map standar dari aplikasi saya?

140

Setelah pengguna menekan tombol di aplikasi saya, saya ingin membuka aplikasi Google Map standar dan untuk menunjukkan lokasi tertentu. Bagaimana saya bisa melakukannya? (tanpa menggunakan com.google.android.maps.MapView)

LA_
sumber

Jawaban:

241

Anda harus membuat Intentobjek dengan geo-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);

Jika Anda ingin menentukan alamat, Anda harus menggunakan bentuk lain dari geo-URI: geo:0,0?q=address.

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

Michael
sumber
1
Terima kasih, @Pixie! Apa format garis lintang dan bujur? Jika saya lulus lat: 59.915494, lng: 30.409456itu mengembalikan posisi yang salah.
LA_
2
Oke, saya sudah menemukan masalahnya. String.format("geo:%f,%f", latitude, longitude)kembali string dengan koma: geo:59,915494,30,409456.
LA_
20
Ini memindahkan saya ke lokasi tetapi tidak menempatkan balon di sana. Saya ingin sekali balon sehingga pengguna dapat mengkliknya untuk mendapatkan petunjuk arah dll.
Mike
5
Jangan main-main dengan String.format () untuk penggabungan string sederhana. Metode itu hanya dimaksudkan untuk teks UI, itu sebabnya representasi titik desimal dapat bervariasi. Cukup gunakan operator "+" atau StringBuilder: String uri = "geo:" + lastLocation.getLatitude () + "," + lastLocation.getLongitude ().
Agustí Sánchez
4
Untuk arah, maksud navigasi sekarang didukung dengan google.navigation: q = lintang, bujur: Uri gmmIntentUri = Uri.parse ("google.navigation: q =" + 12f "+", "+ 2f); Intent mapIntent = baru Intent (Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage ("com.google.android.apps.maps"); startActivity (mapIntent);
David Thompson
105

Anda juga dapat menggunakan http://maps.google.com/maps sebagai URI Anda

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

atau Anda dapat memastikan bahwa aplikasi Google Maps hanya digunakan, ini menghentikan filter maksud (dialog) agar tidak muncul, dengan menggunakan

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

seperti itu:

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

atau Anda dapat menambahkan label ke lokasi dengan menambahkan string di dalam tanda kurung setelah setiap set koordinat seperti:

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

Untuk menggunakan lokasi saat ini pengguna sebagai titik awal (sayangnya saya belum menemukan cara untuk memberi label lokasi saat ini) maka cukup turunkan saddrparameter sebagai berikut:

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

Untuk kelengkapan, jika pengguna tidak memiliki aplikasi peta yang diinstal maka itu akan menjadi ide yang baik untuk menangkap ActivityNotFoundException, seperti yang dinyatakan oleh @TonyQ, maka kita dapat memulai aktivitas lagi tanpa pembatasan aplikasi peta, kita bisa yakin bahwa kita tidak akan pernah sampai ke Toast pada akhirnya karena browser internet adalah aplikasi yang valid untuk meluncurkan skema url ini juga.

        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:

Untuk petunjuk arah, maksud navigasi sekarang didukung dengan 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);
David Thompson
sumber
java.util.IllegalFormatConversionException:% f tidak dapat memformat pengecualian java.lang.String argumen
Amitsharma
Silakan kirim apa yang telah Anda ganti baris kode pertama dengan [baris yang dimulai dengan String uri = string.format] Sepertinya Anda memiliki string sebagai salah satu parameter yang harusnya berupa float
David Thompson
Hai ketika saya meneruskan label ke google maps dengan lintang dan bujur, aplikasi peta mengubah label menjadi alamat. Bisakah Anda memberi tahu cara mengatasi masalah ini?
Rohan Sharma
41

Menggunakan format String akan membantu tetapi Anda harus berhati-hati dengan lokal. Di Jerman float akan dipisahkan dengan koma, bukan titik.

Menggunakan String.format("geo:%f,%f",5.1,2.1);bahasa Inggris lokal hasilnya akan "geo:5.1,2.1"tetapi dengan lokal Jerman Anda akan mendapatkan"geo:5,1,2,1"

Anda harus menggunakan bahasa Inggris untuk mencegah perilaku ini.

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

Untuk mengatur label ke titik geografis Anda dapat memperluas geografi Anda dengan menggunakan:

!!! tapi hati-hati dengan ini geo-uri masih dalam pengembangan 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);
David Boho
sumber
Anda juga dapat menggunakan "& t = h" versus "& t = m" untuk memanggil tampilan layer satelit atau peta.
tony gil
1
Saya mencoba sesuatu yang serupa kecuali saya menambahkan kueri dengan koordinat sehingga saya mendapatkan balon. Kode saya persis seperti contoh pertama Anda. Saya memformat URI dengan lokal Inggris, tetapi ketika saya menggunakannya di perangkat saya yang diatur ke lokal Jerman, Google Maps masih mengganti titik dengan koma sehingga kueri saya tidak berfungsi. Ketika saya mengatur lokal perangkat ke bahasa Inggris US fe itu berfungsi dengan baik. Apa yang dapat saya? Tampaknya apa pun Google Maps yang mengubah string kueri lagi.
kaolick
6

Terkadang jika tidak ada aplikasi yang terkait dengan geo: protocal, Anda bisa menggunakan try-catch untuk mendapatkan ActivityNotFoundException untuk menanganinya.

Ini terjadi ketika Anda menggunakan beberapa emulator seperti androVM yang tidak diinstal google map secara default.

TonyQ
sumber
6

Anda juga dapat menggunakan cuplikan kode di bawah ini, dengan cara ini keberadaan google maps diperiksa sebelum niat dimulai.

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

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

Kerim Gökarslan
sumber
1

Untuk menuju ke lokasi DENGAN PIN di atasnya, gunakan:

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

untuk tanpa pin, gunakan ini di uri:

 String uri = "geo:" + destinationLatitude + "," + destinationLongitude;
M. Usman Khan
sumber
0

Saya memiliki contoh aplikasi tempat saya menyiapkan maksud dan hanya meneruskan CITY_NAME dalam maksud ke aktivitas penanda peta yang akhirnya menghitung garis bujur dan garis lintang oleh Geocoder menggunakan CITY_NAME.

Di bawah ini adalah potongan kode memulai aktivitas penanda peta dan MapsMarkerActivity lengkap.

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

Tautan kedaluwarsa jadi saya telah menyisipkan kode lengkap di atas tetapi untuk berjaga-jaga jika Anda ingin melihat kode lengkap maka tersedia di: https://github.com/gosaliajigar/CSC519/tree/master/CSC519_HW4_89753

JRG
sumber
0

Ini ditulis di Kotlin, itu akan membuka aplikasi peta jika ditemukan dan menempatkan titik dan membiarkan Anda memulai perjalanan:

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

Ganti requireActivity()dengan Anda Context.

Gastón Saillén
sumber