2012-12-08 10 views
28

Korzystając z Google Maps Android API V2, podążam za Google Play Services setup documentation, aby sprawdzić, czy usługi Google Play są zainstalowane, używając następującego kodu w mojej głównej aktywności:Google Maps Android API V2 sprawdź, czy GoogleMaps są zainstalowane na urządzeniu

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

Działa to dobrze. Zauważyłem jednak, że niektóre ze starszych telefonów z Androidem, na których się znajdowałem (głównie z wersji 2.2), nie miały ani GooglePlayServices, ani samej aplikacji Map Google.

LogCat zgłosi ten błąd: Google Maps Android API: brakuje aplikacji Mapy Google.

Pytanie - w jaki sposób mogę przeprowadzić podobną kontrolę, niż w przypadku dostępności Google Maps na urządzeniu? Po drugie, jeśli użytkownik ma już zainstalowane Mapy Google, uważam, że kontrola będzie musiała upewnić się, że ich zainstalowana wersja jest zgodna z wersją 2 interfejsu API Map Google na Androida.

Aktualizacja Oto moja metoda setupMapIfNeeded(), która jest wywoływana na końcu onCreate(). To jest, gdy myślę, że chciałbym, aby ustalić, czy Google Maps jest zainstalowana i ostrzega użytkownika, patrz blok innego:

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

mogę tylko zapytać co, który 69 masz na metodzie paramte getErrorDialog rs? – luiscvalmeida

+1

@luiscvalmeida 69 to tylko kod żądania (wybrałem go). Zobacz metodę getErrorDialog w http://developer.android.com/reference/com/google/android/gms/common/GooglePlayServicesUtil.html#getErrorDialog – DiscDev

Odpowiedz

50

W porządku, po kolejnych szturchnięciach i pchnięciach zdałem sobie sprawę, że muszę zapytać PackageManager, czy są zainstalowane mapy google. IMO powinno być zawarte w przewodniku programistycznym Google Maps Android API V2 ... będzie wielu programistów, którzy tęsknią za tą sprawą i mają sfrustrowanych użytkowników.

Oto jak sprawdzić, czy Google Maps są zainstalowane i ponownie skierować użytkownika do Sklepu Play witryny google maps, jeśli nie jest zainstalowany (patrz 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(); 
     } 
    }; 
} 

Napisałem krótki wpis na blogu z tych szczegółów: How to check if Google Maps are installed and redirect user to the Play Store

+1

okrzyki, czy podstęp nie stanowi problemu!To naprawdę powinno być częścią APi lub przynajmniej lepiej udokumentowane. –

+0

Cieszę się, że to pomocne. Całkowicie zgadzam się, że powinno to być częścią dokumentacji API co najmniej ... dlaczego nie ma czegoś podobnego do GooglePlayServicesUtil dla map? – DiscDev

+1

Wielkie dzięki, to bardzo pomocne. –

0

Można sprawdzić, że GoogleMap jest dostępny przez wywołanie MapFragment.getMap() lub MapView.getMap() metody i sprawdzanie, czy zwracany obiekt nie jest pusty.

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.

Możesz przeczytać o verify map availability here.

+4

Nie, to nie działa. Po zainstalowaniu Usług Google Play, ale Mapy Google nie są zainstalowane (https://play.google.com/store/apps/details?id=com.google.android.apps.maps), wywołanie funkcji MapFragment.getMap() ma wartość inną niż null. Jednak żadna z płytek nie zostanie załadowana. Przyciski zoomu są obecne, a widok wygląda jak mapa, ale żadne dane map nie zostaną pobrane, a raporty LogCat: E/Google Maps Android API (23235): brakuje aplikacji Mapy Google. Potrzebuję sposobu, aby to wykryć lub użytkownicy będą narzekać, że aplikacja nie działa. Zaktualizowane pytanie za pomocą mojej metody setupMapIfNeeded. – DiscDev

+0

Właśnie próbowałem usunąć mapy i mapy Google działa dobrze w mojej aplikacji. Prawdopodobnie najnowsze usługi Google Play pozwalają korzystać z mapy bez map google. – IlyaEremin

Powiązane problemy