API di Google Maps V2 per Android controlla se GoogleMaps è installato sul dispositivo

Quando si utilizza l’API di Google Maps per Android V2, seguo la documentazione di installazione dei servizi di Google Play per verificare che i servizi di Google Play siano installati, utilizzando il seguente codice nella mia attività principale:

@Override public void onResume() { checkGooglePlayServicesAvailability(); super.onResume(); } public void checkGooglePlayServicesAvailability() { int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); if(resultCode != ConnectionResult.SUCCESS) { Dialog dialog = GooglePlayServicesUtil.getErrorDialog(resultCode, this, 69); dialog.setCancelable(false); dialog.setOnDismissListener(getOnDismissListener()); dialog.show(); } Log.d("GooglePlayServicesUtil Check", "Result is: " + resultCode); } 

Funziona bene Tuttavia, ho notato che alcuni dei vecchi telefoni Android che ho messo in giro (per la maggior parte in esecuzione 2.2) mancavano sia a GooglePlayServices sia all’app Google Maps stessa.

LogCat segnalerà questo errore: API Android di Google Maps: manca l’applicazione di Google Maps.

Domanda : come posso eseguire un controllo simile a quello sopra per la disponibilità di Google Maps su un dispositivo? In secondo luogo, se l’utente ha già installato Google Maps, penso che il controllo dovrà accertarsi che la loro versione installata sia compatibile con V2 dell’API di Android Maps.

Aggiorna Ecco il mio metodo setupMapIfNeeded () che viene chiamato alla fine di onCreate (). Questo è dove penso che vorrei determinare se Google Maps è installato e avvisare l’utente, vedere il blocco else:

     private void setUpMapIfNeeded() { // Do a null check to confirm that we have not already instantiated the map. if (mMap == null) { // Try to obtain the map from the SupportMapFragment. mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.basicMap)).getMap(); if (mMap != null) { mMap.setLocationSource(this); mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(44.9800, -93.2636), 10.0f)); setUpMap(); } else { //THIS CODE NEVER EXECUTES - mMap is non-null even when Google Maps are not installed MapConstants.showOkDialogWithText(this, R.string.installGoogleMaps); } } } 

    Va bene, dopo un po ‘di curiosità e incitamento mi sono reso conto che ho solo bisogno di chiedere a PackageManager se sono installate google maps. IMO questo dovrebbe essere incluso nella guida agli sviluppatori dell’API di Google Maps per Android V2 … ci saranno molti sviluppatori che perdono questo caso e hanno utenti frustrati.

    Ecco come verificare se Google Maps è installato e redirect l’utente all’elenco di Play Store per google maps se non è installato (consulta isGoogleMapsInstalled() ):

     private void setUpMapIfNeeded() { // Do a null check to confirm that we have not already instantiated the map. if (mMap == null) { // Try to obtain the map from the SupportMapFragment. mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.basicMap)).getMap(); if(isGoogleMapsInstalled()) { if (mMap != null) { setUpMap(); } } else { Builder builder = new AlertDialog.Builder(this); builder.setMessage("Install Google Maps"); builder.setCancelable(false); builder.setPositiveButton("Install", getGoogleMapsListener()); AlertDialog dialog = builder.create(); dialog.show(); } } } public boolean isGoogleMapsInstalled() { try { ApplicationInfo info = getPackageManager().getApplicationInfo("com.google.android.apps.maps", 0 ); return true; } catch(PackageManager.NameNotFoundException e) { return false; } } public OnClickListener getGoogleMapsListener() { return new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.apps.maps")); startActivity(intent); //Finish the activity so they can't circumvent the check finish(); } }; } 

    Ho scritto un breve post sul blog con questi dettagli: come verificare se sono installate le mappe di Google e redirect l’utente al Play Store

    Dalla guida di Google

     if (mapIntent.resolveActivity(getPackageManager()) != null) { ... } 

    Puoi verificare che GoogleMap sia disponibile chiamando i metodi MapFragment.getMap () o MapView.getMap () e controllando che l’object restituito non sia nullo.

    GoogleMap getMap pubblico ()

    GoogleMap. Nulla se la vista del frammento non è ancora pronta. Questo può accadere se il frammento di vita non ha ancora attraversato onCreateView (LayoutInflater, ViewGroup, Bundle). Ciò può anche accadere se i servizi di Google Play non sono disponibili. Se i servizi di Google Play diventano disponibili successivamente e il frammento è passato su onCreateView (LayoutInflater, ViewGroup, Bundle), la chiamata di questo metodo di nuovo inizializzerà e restituirà GoogleMap.

    Puoi leggere la verifica della disponibilità della mappa qui .