BadParcelableException en el código de google maps

Ejecutar un ejemplo ligeramente modificado de Google Maps arroja BadParcelableException en el código de Google Maps. La clase LatLng es parcelable pero no se puede encontrar. Parece que el código de Google Maps está intentando unparcel el objeto que no fue parcelado por él. ¿Qué casos el problema?

 package com.example.mapdemo; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapView; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import android.os.Bundle; public class RawMapViewDemoActivity extends android.support.v4.app.FragmentActivity { private MapView mMapView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.raw_mapview_demo); mMapView = (MapView) findViewById(R.id.map); mMapView.onCreate(savedInstanceState); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mMapView.onSaveInstanceState(outState); outState.putParcelable("marker", new LatLng(0, 0)); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); LatLng ll = savedInstanceState.getParcelable("marker"); } } 

 FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mapdemo/com.example.mapdemo.RawMapViewDemoActivity}: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.google.android.gms.maps.model.LatLng at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2832) at android.app.ActivityThread.access$1600(ActivityThread.java:117) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3683) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) at dalvik.system.NativeStart.main(Native Method) Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.google.android.gms.maps.model.LatLng at android.os.Parcel.readParcelable(Parcel.java:1958) at android.os.Parcel.readValue(Parcel.java:1846) at android.os.Parcel.readMapInternal(Parcel.java:2083) at android.os.Bundle.unparcel(Bundle.java:208) at android.os.Bundle.getBundle(Bundle.java:1078) at com.google.android.gms.maps.internal.MapStateHelper .getParcelableFromMapStateBundle(MapStateHelper.java:41) at maps.y.ae.a(Unknown Source) at maps.y.bm.onCreate(Unknown Source) at com.google.android.gms.maps.internal.IMapViewDelegate$Stub .onTransact(IMapViewDelegate.java:66) at android.os.Binder.transact(Binder.java:279) at com.google.android.gms.maps.internal.IMapViewDelegate$a$a .onCreate(Unknown Source) at com.google.android.gms.maps.MapView$b.onCreate(Unknown Source) at com.google.android.gms.internal.c$3.a(Unknown Source) at com.google.android.gms.internal.ib(Unknown Source) at com.google.android.gms.maps.MapView$aa(Unknown Source) at com.google.android.gms.maps.MapView$aa(Unknown Source) at com.google.android.gms.internal.ca(Unknown Source) at com.google.android.gms.internal.c.onCreate(Unknown Source) at com.google.android.gms.maps.MapView.onCreate(Unknown Source) at com.example.mapdemo.RawMapViewDemoActivity .onCreate(RawMapViewDemoActivity.java:40) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) ... 12 more 

6 Solutions collect form web for “BadParcelableException en el código de google maps”

Sólo para añadir a las respuestas existentes aquí, yo había estado eliminando mis paquetes del estado guardado antes de llamar a mapView.onCreate y estaba funcionando bien.

Sin embargo, después de agregar un ViewPager a mi Fragmento no me di cuenta de que la BadParcelableException había regresado y el código lo hizo a la producción. Resulta que el ViewPager guarda su estado también y, como es parte de la Biblioteca de Soporte, Google Map no puede encontrar la clase para descomprimirlo.

Así que opté por invertir el proceso, en lugar de eliminar Paquetes del paquete que conocía, opté por crear un nuevo Bundle para el mapa copiando sólo el estado del mapa.

 private final static String BUNDLE_KEY_MAP_STATE = "mapData"; @Override public void onSaveInstanceState(Bundle outState) { // Save the map state to it's own bundle Bundle mapState = new Bundle(); mapView.onSaveInstanceState(mapState); // Put the map bundle in the main outState outState.putBundle(BUNDLE_KEY_MAP_STATE, mapState); super.onSaveInstanceState(outState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_map, container, false); mapView = (MapView) view.findViewById(R.id.mapView); mapView.getMapAsync(this); Bundle mapState = null; if (savedInstanceState != null) { // Load the map state bundle from the main savedInstanceState mapState = savedInstanceState.getBundle(BUNDLE_KEY_MAP_STATE); } mapView.onCreate(mapState); return view; } 

He probado las dos respuestas anteriores sin éxito, pero he encontrado otra solución:

Al guardar el estado, tenga cuidado de reenviar la llamada MapView.onSaveInstanceState antes de agregar sus datos al Bundle (lo hizo bien):

 @Override public void onSaveInstanceState(Bundle outState) { // Forward the call BEFORE adding our LatLng array, else it will crash : _mapView.onSaveInstanceState(outState); // Put your Parcelable in the bundle: outState.putParcelableArray("myLatLng", new LatLng(0, 0) ); } 

Al restaurar el estado en onCreate / onRestore, compruebe si el paquete no es nulo y, si es así, obtenga su paquete y, a continuación, quítelo del paquete antes de reenviar la llamada:

 @Override public void onCreate(Bundle savedInstanceState) { // If the bundle is not null, get your Parcelable : LatLng myLatLng = null; if(savedInstanceState != null) { myLatLng = (LatLng) savedInstanceState.getParcelable("myLatLng"); // Remove your Parcelable from the bundle, else it will crash : savedInstanceState.remove("myLatLng"); } // Forward the call : _mapView.onCreate(savedInstanceState); setUpMapIfNeeded(); } 

Este problema ha sido archivado en code.google.com aquí en caso de que desee iniciarlo.

Mientras tanto, he logrado resolver este problema simplemente añadiendo mi Parcelable a un lote antes de añadirlo al paquete final onSaveInstanceState. Esto funciona porque un Bundle es una clase conocida por el ClassLoader interno de MapView.

He creado dos muy pequeño método util para hacer esto para mí. Aquí está el código

 public static Parcelable unbundleParcelable(String key, Bundle src) { Bundle b = src.getBundle(key); if (b != null) { return b.getParcelable("bundle_parcelable_util_key"); } return null; } public static void bundleParcelable(String key, Bundle dest, Parcelable parcelable) { Bundle b = new Bundle(); b.putParcelable("bundle_parcelable_util_key", parcelable); dest.putBundle(key, b); } 

He modificado el código en una de las publicaciones anteriores para usar mi solución temporal. Así es como lo uso.

 @Override public void onSaveInstanceState(Bundle outState) { // Forward the call BEFORE adding our LatLng array, else it will crash : _mapView.onSaveInstanceState(outState); // Put your Parcelable in the bundle: bundleParcelable("myLatLng", outState, new LatLng(0, 0)); } @Override public void onCreate(Bundle savedInstanceState) { // Forward the call : _mapView.onCreate(savedInstanceState); LatLng myLatLng = null; if(savedInstanceState != null) { // Extract your Parcelable myLatLng = (LatLng) unbundleParcelable("myLatLng", savedInstanceState); } setUpMapIfNeeded(); } 

Esto debería funcionar para cualquier Parcelable personalizado que utilice en su proyecto.

He encontrado una solución (un poco). En el lugar cuando sucede intenta hacerlo por segunda vez. Siempre captura la Excepción y la segunda vez que el problema no parece suceder en este lugar. Eso funcionó para mí.

 try { mapIntent.putExtra(Intents.EXTRA_LATLNG, new LatLng( store.getLatitude(), store.getLongitude())); } catch (BadParcelableException e) { mapIntent.putExtra(Intents.EXTRA_LATLNG, new LatLng( store.getLatitude(), store.getLongitude())); } 

He encontrado una solución más simple a esto. Proporcionar el cargador de clases de su Fragmento o Actividad al paquete antes de realizar cualquier operación como tal:

 savedInstanceState.setClassLoader(getClass().getClassLoader()); 

Esto no parece funcionar cuando se pasa directamente al MapFragment o onCreateView o onCreate de MapView, así que tendrás que distribuir manualmente la CameraPosition del mapa y pasar un paquete nulo a esas funciones.

También tuve una BadParcelableException cuando estaba dejando mi aplicación (FragmentActivity con pestañas y un fragmento en cada ficha). He resuelto esto llamando primero mapmpvMap.onSaveInstanceState(outState); y luego super.onSaveInstanceState(outState);

  • Algoritmo de Google Maps
  • Google Maps no se muestra en el dispositivo Android.
  • Google Maps: LocationSource personalizado en iOS
  • Pantalla azul en Android Google Maps
  • Error al obtener Google Maps en android
  • Recuperar la distancia de la parte visible del mapa de Google
  • Android cómo desenmarañar en un solo toque en un marcador de clúster v2 mapas
  • Intentando mostrar StreetView utilizando Google Maps Android API v2 en android pero no consiguiendo que funcione
  • Obtenga los puntos de latitud y longitud cada 10 metros, entre las dos ubicaciones diferentes en android
  • Google Map no aparece en Android
  • Android maps: No se pudo encontrar el estilo 'mapViewStyle' en el tema actual
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.