24

エラーが発生して、crashlytics を介してユーザー エクスペリエンスからいくつかのレポートが返されます。

Fatal Exception java.lang.NullPointerException         
CameraUpdateFactory is not initialized

これは通常のクラッシュではありません。すべてのユーザーに発生するわけではありませんが、定期的になりすぎているため、解決する必要があります。

私がカバーしたと思うマップが初期化されていない場合、これが起こる可能性があることを読んでいました

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

また、おそらく原因として、Google 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.");
    }

その後、これはユーザーごとに発生するわけではないため、次に何をすべきかわかりません。

なぜこれが発生するのかについて何か考えがある場合は、ご意見をいただければ幸いです

4

5 に答える 5

23

MapView から null 以外の GoogleMap オブジェクトを取得したにもかかわらず、同じエラーが発生していました。ドキュメントには必要ないと書かれていますが、MapsInitializer を明示的に呼び出して解決しました。

私のアプリの Fragment は、次の方法で 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

パッケージ バージョン 5084032 で検証された Google Play サービスの最新バージョンでは GooglePlayServicesNotAvailableException をスローしないため、try-catch なしで MapsInitializer.initialize を使用するだけです。

于 2014-07-06T16:09:46.327 に答える
0

あなたはするべきかもしれませんClass.forName()か?のためのCameraUpdateFactory?のtry - catch

于 2013-10-23T12:49:44.900 に答える