2013-10-23 102 views
20

我得到了一些報告,從用戶體驗的背透crashlytics給我一個錯誤谷歌地圖CameraUpdateFactory未初始化

Fatal Exception java.lang.NullPointerException   
CameraUpdateFactory is not initialized 

這不是一個經常性的死機,因爲它不會出現爲每一個用戶,但它變得太經常,我需要解決它。

我讀了,如果地圖沒有被初始化,我想我已經覆蓋

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

也是一個可能原因可能是谷歌Play服務沒有設備或這可能發生已過時,我也爲此添加了一些驗證。

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

之後,我不確定接下來要做什麼,因爲這不會發生在每個用戶身上。

如果任何人有會出現這種情況我會很感激你輸入的任何想法

回答

0

可能是你應該做一個Class.forName()?爲CameraUpdateFactory?在try - catch

21

即使我從MapView獲得非null的GoogleMap對象,我也遇到了同樣的錯誤。我通過明確的調用MapsInitializer解決了這個問題,即使文檔說它不需要。

我的應用程序的片段通過以下設置的MapView:

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

之前我加入了呼籲MapsInitializer,我會得到來自CameraUpdateFactory異常。在添加調用之後,CameraUpdateFactory總是成功。

1

一段時間,也可以通過舊版本的谷歌造成的播放服務,請更新谷歌播放服務情況,可能幫助你

+0

我已經涵蓋了已經在我的問題... –

11

只需使用MapsInitializer.initialize沒有的try-catch,因爲它沒有在最新扔GooglePlayServicesNotAvailableException谷歌的Play服務版本,與包版本5084032.

0

驗證的東西從我的MapUtil,處理這一情況:

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

由於缺少GlobalyLayoutListenerUtil&getBetterZoom,無法完全使用上述代碼 - 請發佈缺少的代碼。謝謝。 – AlexVPerl

相關問題