32

Ich konnte nicht beheben, warum dieser Fehler auftritt, und nur auf einem Samsung Tab3-Gerät mit 4.4.2? Es passiert, wenn mein MainActivity eine andere Aktivität beginnt, und übergibt eine Parcel Klasse in der Absicht, etwa so:Android E/Paket: Klasse wurde beim Entpacken nicht gefunden (nur bei Samsung Tab3)

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 erhält die Parcel Daten wie folgt:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.test_activity); 

    TestParcel cfgOptions = getIntent().getExtras().getParcelable("cfgOptions"); 
} 

Die Klasse 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]; 
     } 
    }; 
} 

Wieder sehe ich nur das auf dem Samsung Tab3-Gerät - aber das ist das Gerät, an dem wir arbeiten müssen. Hier ist das Samsung logcat:

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) 
+0

Ich hatte das gleiche Unmarshalling Fehler in Samsung Tab3 und versuchte fast alle möglichen Lösungen einschließlich Ihrer und keiner scheint das Problem zu lösen, bis ich auf die neueste Version von Android Studio 1.3.1 aktualisiert, die schließlich das Problem gelöst. Aktualisieren Sie auf die neueste Version, säubern Sie das Projekt und bauen Sie es neu auf, was den Zweck erfüllen sollte. –

+0

Das klingt so mysteriös! –

Antwort

49

Aus irgendeinem seltsamen Grund sieht es aus wie der Klassenlader nicht richtig konfiguriert ist.

Versuchen eine der folgenden in 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"); 

Alternativ wickeln die Parcel in einem Brötchen DLE:

Bundle b = new Bundle(); 
b.putParcelable("options", cfgOptions); 
Intent intent = new Intent(MDex.this, TestActivity.class); 
intent.putExtra("bundle", b); 

zu erhalten:

Bundle b = getIntent().getBundleExtra("bundle"); 
TestParcel cfgOptions = b.getParcelable("options"); 
+0

Ich habe wirklich auf einen Erfolg gehofft, aber keines dieser Szenarien hat das Problem gelöst. Ich frage mich, ob das wirklich ein Samsung-spezifisches Problem sein könnte?Die App stürzt nicht ab, bis ich (obwohl ich –

+0

stürzt nicht einmal mit diesem Fehler in Logcat –

+0

danke für diese Optionen. Ich hatte gelesen, dass Bundles die Klassennamen speichern, also habe ich Folgendes versucht, und es funktionierte: –

4

Nur knapper und klar von der Antwort, hier zu sein versuchen -

//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"); 
    } 
} 
6

In meinem Fall neues Intent() putExtra (. Schlüssel, parcelable), der intern automatisch neues Bündel erstellt, gibt mir unmarshall Fehler Ich weiß nicht warum, also musste ich neues Bündel selbst schaffen, addiere das parcelable darauf und füge das Bündel auf der Absicht hinzu. Dadurch löst es das Problem.

+0

Vielen Dank. Ihre Lösung ist sehr einfach –

0

Das gleiche Problem ist mir mit einem aktuellen Samsung S8 Handy passiert. Das Erstellen des Bundles hat explizit für mich funktioniert. Ich habe den folgenden Code, die nicht auf einen String-Kennung für das Bündel benötigen:

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

Und lesen Sie dann die Parcel zurück in der Tätigkeit:

// In your activity, read parcelable back. 
YourParcelable p = getIntent().getParcelableExtra("YOUR_PARCELABLE_ID"); 

Ich hoffe, das hilft.

Verwandte Themen