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);

  • ¿API de Google Play Services de Google para GPS solamente?
  • No se puede ejecutar la aplicación con mapas en el dispositivo Android que ejecuta 4.0.3 ICS
  • Android - mapas offline, no basados ​​en vectores, personalizados
  • Google google mapv2 icono de la URL
  • Android Maps API v2 dibujar círculo
  • google maps api clave no funciona v2
  • MyLocation botón oculto tras la barra de acción transparente, cómo reposicionar?
  • Problema al eliminar el elemento de clustermanager
  • Definición de un CameraUpdate con LatLngBounds con diferentes valores de relleno
  • Google Map V2 Android y iOS colocan decimales latlng
  • Google maps glitch en los teléfonos Motorola
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.