2013-10-23 23 views
20

Dostaję jakieś raporty z powrotem z doświadczenia użytkownika poprzez crashlytics dając mi błądGoogle Maps CameraUpdateFactory nie zainicjowany

Fatal Exception java.lang.NullPointerException   
CameraUpdateFactory is not initialized 

To nie jest regularny katastrofy, jak w nim nie występuje dla każdego użytkownika, ale to staje się zbyt regularny i muszę go rozwiązać.

Czytałem, że to może się zdarzyć, jeśli mapy nie został zainicjowany, które myślę, że pokryte

if(googleMap!=null){ 
       googleMap.animateCamera(CameraUpdateFactory.newLatLng(selectedLatLng)); 
      } 

też prawdopodobnie przyczyną może być to, że usługi Google Play nie jest na urządzeniu lub jest nieaktualny i dodałem do tego również weryfikację.

public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(FuelsFragment.this.getActivity()); 

    // Showing status 
    //CAMERAUPDATE FACTORY CRASH CAN BE A RESULT OF GOOGLE PLAY SERVICES NOT INSTALLED OR OUT OF DATE 
    //ADDITIONAL VERIFICATION ADDED TO PREVENT FURTHER CRASHES 

    //https://github.com/imhotep/MapKit/pull/17 
    if(status == ConnectionResult.SUCCESS) 
    { 
     mMapFragment = ReepMapFragment.newInstance(); 

     FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction(); 
     fragmentTransaction.add(R.id.mapContainer, mMapFragment); 
     fragmentTransaction.commit(); 

    } 
    else if(status == ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED){ 

     reep.toastNotify("You need to update Google Play Services in order to view maps"); 
    } 
    else if (status==ConnectionResult.SERVICE_MISSING){ 
     reep.toastNotify("Google Play service is not enabled on this device."); 
    } 

Po tym nie jestem pewien, co dalej, ponieważ tak się nie stanie dla każdego użytkownika.

Jeśli ktoś ma jakieś przemyślenia na temat dlaczego tak się dzieje, że doceniam Twój wkład

Odpowiedz

0

Może powinieneś zrobić Class.forName()? dla CameraUpdateFactory? w try - catch

21

Otrzymałem ten sam błąd, mimo że otrzymałem niezerowy obiekt GoogleMap z MapView. Rozwiązałem go za pomocą wyraźnego połączenia z MapsInitializer, mimo że dokumentacja mówi, że nie jest potrzebna.

moja aplikacja za Fragment konfiguruje MapView poprzez następujące:

@Override public View 
onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) 
{ 
    View view = inflater.inflate(R.layout.map_panel, container, false); 
    mapView = (MapView) view.findViewById(R.id.map_view); 
    mapView.onCreate(savedInstanceState); 
    configureMap(mapView.getMap()); 
    return view; 
} 

private void 
configureMap(GoogleMap map, double lat, double lon) 
{ 
    if (map == null) 
     return; // Google Maps not available 
    try { 
     MapsInitializer.initialize(getActivity()); 
    } 
    catch (GooglePlayServicesNotAvailableException e) { 
     Log.e(LOG_TAG, "Have GoogleMap but then error", e); 
     return; 
    } 
    map.setMyLocationEnabled(true); 
    LatLng latLng = new LatLng(lat, lon); 
    CameraUpdate camera = CameraUpdateFactory.newLatLng(latLng); 
    map.animateCamera(camera); 
} 

Przed I dodaje wywołanie MapsInitializer, chciałbym uzyskać wyjątek od CameraUpdateFactory. Po dodaniu wywołania CameraUpdateFactory zawsze się powiedzie.

1

jakiś czas może to być spowodowane starej wersji Google Play usługę zaktualizuj usługę Google Play może ona pomaga Ci

+0

ja omówiliśmy już w moje pytanie ... –

11

Wystarczy użyć MapsInitializer.initialize bez try-catch, ponieważ nie rzucać GooglePlayServicesNotAvailableException w najnowszym wersja usługi Google Play, który został zweryfikowany z wersji pakietu 5084032.

0

coś z moich MapUtil, który obsługuje tę sprawę:

public static void animateCamera(final MapView mapView, final GoogleMap map, final LatLng location) { 
     try{ 
      CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(location, getBetterZoom(map)); 
      map.animateCamera(cameraUpdate); 
     }catch(Exception e) { 
      MapsInitializer.initialize(mapView.getContext()); 
      if (mapView.getViewTreeObserver().isAlive()) { 
       mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
        @SuppressLint("NewApi") 
        @Override 
        public void onGlobalLayout() { 
         GlobalyLayoutListenerUtil.removeGlobalLayoutListener(mapView, this); 
         animateCamera(mapView, mapView.getMap(), location); 
        } 
       }); 
      } else { 
       if(map != null){ 
        map.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() { 
         @Override 
         public void onMapLoaded() { 
          if(location != null){ 
           animateCamera(mapView, mapView.getMap(), location); 
          } 
         } 
        }); 
       } 
      } 
     } 

    } 
+0

Nie można w pełni użyć powyższego kodu z powodu braku GlobalyLayoutListenerUtil & getBetterZoom - proszę opublikować brakujący kod. Dzięki. – AlexVPerl