Подтвердить что ты не робот

Google Maps CameraUpdateFactory не инициализирован

Я получаю некоторые отчеты из пользовательского опыта через 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.");
    }

После этого я не уверен, что делать дальше, поскольку этого не происходит для каждого пользователя.

Если у кого-то есть мысли о том, почему это происходит, я буду благодарен за ваш вход

4b9b3361

Ответ 1

Я получал ту же ошибку, хотя я получил ненулевой объект GoogleMap из MapView. Я разрешил его с явным вызовом 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 всегда преуспевает.

Ответ 2

Просто используйте MapsInitializer.initialize без try-catch, потому что он не бросает GooglePlayServicesNotAvailableException в последнюю версию сервисов Google Play, которая была проверена с пакетом версии 5084032.

Ответ 3

Может быть, вы должны сделать Class.forName()? для CameraUpdateFactory? в try - catch

Ответ 4

Некоторое время, которое может быть вызвано старой службой Google Play, пожалуйста, обновите сервис Google Play, это может помочь вам

Ответ 5

Что-то из моего 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);
                            }
                        }
                    });
                }
            }
        }

    }