Android E/Parcel: Clase no encontrada al desmaterializar(solo en Samsung Tab3)
android-intent classnotfoundexception (4)
No he podido resolver por qué ocurre este error, y solo en un dispositivo Samsung Tab3, ejecutando 4.4.2. Sucede cuando mi MainActivity comienza otra actividad y pasa una clase Parcelable en la intención de esta manera:
private void debugTest(TestParcel cfgOptions){
TestParcel cfgOptions = new TestParcel();
cfgOptions.setValue(15); //just to verify
Intent intent = new Intent(MainActivity.this, TestActivity.class);
intent.putExtra("cfgOptions", cfgOptions);
startActivityForResult(intent, DBG_TEST);
}
TestActivity obtiene los datos compartibles de la siguiente manera:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_activity);
TestParcel cfgOptions = getIntent().getExtras().getParcelable("cfgOptions");
}
La clase TestParcel:
import android.os.Parcel;
import android.os.Parcelable;
public class TestParcel implements Parcelable {
private long l_ucs_value = 0;
private String s_rx_number = "";
//constructor
public TestParcel() {
l_ucs_value = 0;
s_rx_number = "";
}
public void RxNumber(String s) {
s_rx_number = s;
}
public String RxNumber() {
return s_rx_number;
}
//-----------------------------------------------------------------------
public void setValue(long v){
l_ucs_value = v;
}
public long getValue(){ return l_ucs_value; }
protected TestParcel(Parcel in) {
l_ucs_value = in.readLong();
s_rx_number = in.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(l_ucs_value);
dest.writeString(s_rx_number);
}
@SuppressWarnings("unused")
public static final Parcelable.Creator<TestParcel> CREATOR = new Parcelable.Creator<TestParcel>() {
@Override
public TestParcel createFromParcel(Parcel in) {
return new TestParcel(in);
}
@Override
public TestParcel[] newArray(int size) {
return new TestParcel[size];
}
};
}
De nuevo, solo veo esto en el dispositivo Samsung Tab3, pero ese es el dispositivo en el que necesitamos que funcione. Aquí está el logcat de samsung:
02-18 08:05:55.393 2235-2571/? E/Parcel? Class not found when unmarshalling: com.vms.android.VersatileDEX.TestParcel
java.lang.ClassNotFoundException: com.vms.android.VersatileDEX.TestParcel
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:251)
at java.lang.Class.forName(Class.java:216)
at android.os.Parcel.readParcelableCreator(Parcel.java:2133)
at android.os.Parcel.readParcelable(Parcel.java:2097)
at android.os.Parcel.readValue(Parcel.java:2013)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
at android.os.Bundle.unparcel(Bundle.java:249)
at android.os.Bundle.getString(Bundle.java:1118)
at android.content.Intent.getStringExtra(Intent.java:5148)
at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1467)
at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1063)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4134)
at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4032)
at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:159)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2712)
at android.os.Binder.execTransact(Binder.java:404)
at dalvik.system.NativeStart.run(Native Method)
Caused by: java.lang.NoClassDefFoundError: com/vms/android/VersatileDEX/TestParcel
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:251)
at java.lang.Class.forName(Class.java:216)
at android.os.Parcel.readParcelableCreator(Parcel.java:2133)
at android.os.Parcel.readParcelable(Parcel.java:2097)
at android.os.Parcel.readValue(Parcel.java:2013)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
at android.os.Bundle.unparcel(Bundle.java:249)
at android.os.Bundle.getString(Bundle.java:1118)
at android.content.Intent.getStringExtra(Intent.java:5148)
at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1467)
at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1063)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4134)
at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4032)
at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:159)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2712)
at android.os.Binder.execTransact(Binder.java:404)
at dalvik.system.NativeStart.run(Native Method)
Caused by: java.lang.ClassNotFoundException: Didn''t find class "com.vms.android.VersatileDEX.TestParcel" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:251)
at java.lang.Class.forName(Class.java:216)
at android.os.Parcel.readParcelableCreator(Parcel.java:2133)
at android.os.Parcel.readParcelable(Parcel.java:2097)
at android.os.Parcel.readValue(Parcel.java:2013)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
at android.os.Bundle.unparcel(Bundle.java:249)
at android.os.Bundle.getString(Bundle.java:1118)
at android.content.Intent.getStringExtra(Intent.java:5148)
at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1467)
at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1063)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4134)
at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4032)
at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:159)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2712)
at android.os.Binder.execTransact(Binder.java:404)
at dalvik.system.NativeStart.run(Native Method)
El mismo problema me sucedió con un teléfono Samsung S8 reciente. Crear el paquete explícitamente funcionó para mí. Usé el siguiente código, que no requiere un identificador de cadena para el paquete:
// Create the intent to start the activity.
Bundle bundle = new Bundle();
bundle.putParcelable("YOUR_PARCELABLE_ID", yourPacelable);
Intent intent = new Intent(context, YourActivity.class);
intent.putExtras(bundle);
Y luego lea la parte que se puede volver a parcelar en la actividad:
// In your activity, read parcelable back.
YourParcelable p = getIntent().getParcelableExtra("YOUR_PARCELABLE_ID");
Espero que esto ayude.
En mi caso, el nuevo Intento (). PutExtra (clave, parcelable) que internamente crea automáticamente un nuevo paquete me da un error irrelevante. No sé por qué, así que tuve que crear un paquete nuevo por mi cuenta, agregar el paquete y agregar el paquete en el intento. Al hacerlo, resuelve el problema.
Por alguna extraña razón, parece que el cargador de clases no está configurado correctamente.
Pruebe uno de los siguientes en TestActivity.onCreate()
:
TestParcel cfgOptions = getIntent().getParcelableExtra("cfgOptions");
Intent intent = getIntent();
intent.setExtrasClassLoader(TestParcel.class.getClassLoader());
TestParcel cfgOptions = intent.getParcelableExtra("cfgOptions");
Bundle extras = getIntent().getExtras();
extras.setClassLoader(TestParcel.class.getClassLoader());
TestParcel cfgOptions = extras.getParcelable("cfgOptions");
Alternativamente, envuelva el paquete en un paquete:
Bundle b = new Bundle();
b.putParcelable("options", cfgOptions);
Intent intent = new Intent(MDex.this, TestActivity.class);
intent.putExtra("bundle", b);
Llegar:
Bundle b = getIntent().getBundleExtra("bundle");
TestParcel cfgOptions = b.getParcelable("options");
Solo trato de ser más conciso y claro de la respuesta aquí -
//sending a parcelable class to another activity -----------------
MyParcelableOptionsClass mpoc = new MyParcelableOptionsClass();
Bundle b = new Bundle();
b.putParcelable("options", mpoc );
Intent intent = new Intent(MyActivity.this, OtherActivity.class);
intent.putExtra("bundle", b);
startActivityForResult(intent, 1);
//getting the parcelable class from OtherActivity------------------
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.other_activity);
Bundle b = getIntent().getBundleExtra("bundle");
MyParcelableOptionsClass mpoc = b.getParcelable("options");
}
//returning the parcelable class back from OtherActivity -----------
Bundle b = new Bundle();
b.putParcelable("options", mpoc);
Intent intent = new Intent();
intent.putExtra("bundle", b);
setResult(0, intent);
//and getting the parcelable class back in MyActivity --------------
onActivityResult(int requestCode, int resultCode, Intent data){
if(null != data){
Bundle b = data.getBundleExtra("bundle");
MyParcelableOptionsClass mpoc = b.getParcelable("options");
}
}