【问题标题】:java.lang.NullPointerException: CameraUpdateFactory is not initialized, calling method on "onResume"java.lang.NullPointerException:CameraUpdateFactory 未初始化,在“onResume”上调用方法
【发布时间】:2014-11-04 07:46:25
【问题描述】:

我将从 Detail Activity 获取数据,因此我正在更新“onResume”上的地图,并且它在 animateCamera 方法上崩溃。我尝试了 SO 中可用的所有解决方案。请在下面找到代码:

异常:java.lang.NullPointerException:CameraUpdateFactory 未初始化

private void zoomToShowAllMarkers(final GoogleMap map) {

        final LatLngBounds.Builder builder = new LatLngBounds.Builder();
        for (MapLocations marker : arrMarkers) {
            final LatLng pos = new LatLng(marker.getLatitude(),marker.getLongitude());
             builder.include(pos);
            map.addMarker(new MarkerOptions().position(pos));

              map.animateCamera(CameraUpdateFactory.newLatLngZoom(pos, 17.0f));

        }
}


public void onResume() {
        super.onResume();
        if(mapView!=null &&  mapView.isShown())
        mapView.onResume();
        zoomToShowAllMarkers(map);
    }

【问题讨论】:

    标签: android android-fragments android-mapview android-maps-v2


    【解决方案1】:

    来自http://developer.android.com/reference/com/google/android/gms/maps/CameraUpdateFactory.html

    在使用此类中的任何方法之前,您必须执行以下操作之一 以下以确保该类已初始化:

    • 等待GoogleMap 从您添加到应用程序的MapFragmentMapView 变为可用。您可以通过调用getMap() 方法并检查返回的对象是否不为空来验证GoogleMap 是否可用。
    • 致电initialize(Context)。只要不抛出GooglePlayServicesNotAvailableException,这个类就会 被正确初始化。

    您必须确保它已初始化,然后才能对其调用任何方法。

    【讨论】:

    • 我删除了下面代码中的 GooglePlayServicesNotAvailableException catch 子句,因为错误“GooglePlayServicesNotAvailableException 的捕获块无法到达。这个异常永远不会从 try 语句体中抛出”。
    • 尝试 { MapsInitializer.initialize(this.getActivity()); } 捕捉(GooglePlayServicesNotAvailableException e){ e.printStackTrace(); }
    【解决方案2】:

    我认为您应该将zoomToShowAllMarkers(map); 方法放在if 语句下,因为当您尝试动画相机时,您的mapView 可能是null,如下所示:

    public void onResume() {
        super.onResume();
        if(mapView!=null &&  mapView.isShown()) {
            mapView.onResume();
            zoomToShowAllMarkers(map);
        }
    }
    

    【讨论】:

    • 感谢您的支持@Romadja,问题是我有一个地图初始化条件,在 onCreate 期间没有通过,所以这就是崩溃的原因。使用您的 cmets,这种错误修复方法更深入。谢谢 Romadja。
    【解决方案3】:

    我正在测试的设备的 Google Play 服务版本过时。为了避免空指针,我只是对空值做了一个简单的检查。当用户尝试访问地图时,他们会收到提示说他们已经过时了。

    private void setupMap() {
        final GoogleMap map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    
        MapsInitializer.initialize(this);
    
        double lat = getIntent().getDoubleExtra("lat", 37.6329946);
        double lng = getIntent().getDoubleExtra("lng", -122.4938344);
        float zoom = getIntent().getFloatExtra("zoom", 15);
    
        LatLng position = new LatLng(lat, lng);
        if(null != map) {
            map.moveCamera(CameraUpdateFactory.newLatLngZoom(position, zoom));
            map.addMarker(new MarkerOptions().position(position));
    
            map.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
                @Override
                public void onMapLoaded() {
                    map.snapshot(new GoogleMap.SnapshotReadyCallback() {
                        @Override
                        public void onSnapshotReady(Bitmap bitmap) {
                            mapLoaded(bitmap);
                        }
                    });
                }
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 2014-09-11
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 2020-06-06
      相关资源
      最近更新 更多