24

我通过 crashlytics 从用户体验中得到一些报告,给我一个错误

Fatal Exception java.lang.NullPointerException         
CameraUpdateFactory is not initialized

这不是常规崩溃,因为它不会发生在每个用户身上,但它变得太常规了,我需要解决它。

我读过如果我认为我已经涵盖的地图没有被初始化,这可能会发生

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

还有一个可能的原因可能是设备上没有谷歌播放服务或已过时,我也为此添加了一些验证。

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

在那之后,我不确定接下来要做什么,因为这不会发生在每个用户身上。

如果有人对为什么会发生这种情况有任何想法,我将不胜感激您的意见

4

5 回答 5

23

我得到了同样的错误,即使我从 MapView 获得了一个非空的 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 始终成功。

于 2014-01-31T04:55:26.197 回答
11

只需使用 MapsInitializer.initialize 而不使用 try-catch,因为它不会在最新版本的 Google Play 服务中抛出 GooglePlayServicesNotAvailableException,该服务已使用包版本 5084032 进行了验证。

于 2014-07-06T16:09:46.327 回答
1

有时可能是旧版本的 Google Play 服务造成的,请更新 Google Play 服务它可能对您有帮助

于 2014-05-14T03:12:50.983 回答
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);
                            }
                        }
                    });
                }
            }
        }

    }
于 2014-09-16T04:19:25.997 回答
0

可能是你应该做一个Class.forName()?为CameraUpdateFactory?在try - catch

于 2013-10-23T12:49:44.900 回答