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.");
}
После этого я не уверен, что делать дальше, поскольку этого не происходит для каждого пользователя.
Если у кого-то есть мысли о том, почему это происходит, я буду благодарен за ваш вход
Ответы
Ответ 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);
}
}
});
}
}
}
}