2012-12-08 4 views
28

Quando si utilizza l'API V2 di Google Maps per Android Sto seguendo lo Google Play Services setup documentation per verificare che i servizi di Google Play siano installati, utilizzando il seguente codice nella mia attività principale:Google Maps API Android V2 verifica se GoogleMaps è installato sul dispositivo

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

Questo funziona correttamente. 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 riporterà 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.

Aggiornamento Ecco il mio metodo setupMapIfNeeded() che viene chiamato alla fine del onCreate(). Questo è dove penso che avrei voluto per determinare se è installato Google Maps 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); 
     } 
    } 
} 
+0

Posso solo chiedere che cosa è che il 69 si hanno sul metodo paramte getErrorDialog rs? – luiscvalmeida

+1

@luiscvalmeida Il 69 è solo il codice di richiesta (l'ho scelto). Vedere il metodo getErrorDialog in http://developer.android.com/reference/com/google/android/gms/common/GooglePlayServicesUtil.html#getErrorDialog – DiscDev

risposta

50

Va bene, dopo un po 'di più e 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 sono installati e re-indirizzare l'utente al Play Store elenco per google maps se non è installato (vedere 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: How to check if Google Maps are installed and redirect user to the Play Store

+1

evviva, ha fatto il trucco senza problemi!Questo dovrebbe davvero essere parte dell'APi o almeno meglio documentato. –

+0

Felice che sia utile. Sono assolutamente d'accordo che dovrebbe essere parte dei documenti API al minimo ... perché non avere qualcosa di simile al GooglePlayServicesUtil per le mappe? – DiscDev

+1

Grazie mille, questo è molto utile. –

0

è possibile verificare che la GoogleMap è disponibile chiamando il MapFragment.getMap() o Metodi MapView.getMap() e controllando che l'oggetto restituito non sia nullo.

public GoogleMap getMap()

The GoogleMap. Null if the view of the fragment is not yet ready. This can happen if the fragment lifecyle have not gone through onCreateView(LayoutInflater, ViewGroup, Bundle) yet. This can also happen if Google Play services is not available. If Google Play services becomes available afterwards and the fragment have gone through onCreateView(LayoutInflater, ViewGroup, Bundle), calling this method again will initialize and return the GoogleMap.

È possibile leggere su verify map availability here.

+4

No, questo non funziona. Con Google Play Services installato ma Google Maps non installato (https://play.google.com/store/apps/details?id=com.google.android.apps.maps) che chiama MapFragment.getMap() non è nullo. Tuttavia, nessuna delle tessere verrà caricata. I pulsanti di zoom sono presenti e la vista sembra una mappa, ma i dati della mappa non verranno scaricati e LogCat segnala: E/API di Google Maps Android (23235): l'applicazione di Google Maps è mancante. Ho bisogno di un modo per rilevare questo o gli utenti si lamenteranno che l'app non funziona. Domanda aggiornata con il mio metodo setupMapIfNeeded. – DiscDev

+0

Ho appena provato a rimuovere google maps e le mappe funzionano bene nella mia app. Probabilmente i nuovissimi servizi di google play consentono di utilizzare la mappa senza google maps. – IlyaEremin

1

From Google guide

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