0

I have two differents devices :

  • Phone Sony Xperia SP Android v4.3
  • Tablet Archos 101 helium Android v4.4

When i start my app on the tablet, it's work perfectly.

So i try to launch my app on my the other device(Sony). On this device i have an error when i try to recuperate a parcelable object from an intent in activy.

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.*/com.*.activity.QRCodeScanResultActivity}: java.lang.RuntimeException: Parcel android.os.Parcel@419f2ef8: Unmarshalling unknown type code 7209057 at offset 9620
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2266)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316)
        at android.app.ActivityThread.access$600(ActivityThread.java:150)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1298)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:213)
        at android.app.ActivityThread.main(ActivityThread.java:5225)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@419f2ef8: Unmarshalling unknown type code 7209057 at offset 9620
        at android.os.Parcel.readValue(Parcel.java:2071)
        at android.os.Parcel.readMapInternal(Parcel.java:2288)
        at android.os.Bundle.unparcel(Bundle.java:223)
        at android.os.Bundle.getParcelable(Bundle.java:1170)
        at android.content.Intent.getParcelableExtra(Intent.java:4525)
        at com.*.activity.QRCodeScanResultActivity.onCreate(QRCodeScanResultActivity.java:61)
        at android.app.Activity.performCreate(Activity.java:5133)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2230)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316)
            at android.app.ActivityThread.access$600(ActivityThread.java:150)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1298)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:213)
            at android.app.ActivityThread.main(ActivityThread.java:5225)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)

It's stange because when the app is launch on my tablet(Archos) for the same action i don't have any problem or error. The problem appaer when i try to get the parcelable objet with intent.getParcelableExtra on the activity launch by the intent.

You can see my parcelable class just below :

public class BeanFDRQRCode implements Parcelable {

    public String A_Adresse;
    public String A_CDC;
    public String A_Code;
    public String A_ServeurRH;
    public String A_Telephone;

    public String D_CodeEmploi;
    public String D_Matricule;
    public String D_NomPrenom;
    public String D_TauxHoraire;
    public String D_TauxIK;
    public String D_VehImmat;
    public String D_VehPTAC;

    public String F_ID;
    public String F_CodeCouleur;
    public String F_Depart;
    public String F_Duree;
    public String F_Fin;
    public String F_Frais;
    public String F_No_Annee;
    public String F_No_Semaine;
    public String F_Numero;
    public String F_Numero_Remplacee;
    public String F_Poids;
    public String F_Rechargement;
    public String F_Remuneration;
    public String F_Statut;
    public String F_CoStatut;
    public List<String> F_Taches;
    public List<String> F_Secteurs;

    public BeanFDRQRCode() {
        this.F_Taches = new ArrayList<>();
        this.F_Secteurs = new ArrayList<>();
    }

    public int describeContents() {
        return 0;
    }

    public void writeToParcel(Parcel out, int flags) {
        out.writeString(A_Adresse);
        out.writeString(A_CDC);
        out.writeString(A_Code);
        out.writeString(A_ServeurRH);
        out.writeString(A_Telephone);

        out.writeString(D_CodeEmploi);
        out.writeString(D_Matricule);
        out.writeString(D_NomPrenom);
        out.writeString(D_TauxHoraire);
        out.writeString(D_TauxIK);
        out.writeString(D_VehImmat);
        out.writeString(D_VehPTAC);

        out.writeString(F_ID);
        out.writeString(F_CodeCouleur);
        out.writeString(F_Depart);
        out.writeString(F_Duree);
        out.writeString(F_Fin);
        out.writeString(F_Frais);
        out.writeString(F_No_Annee);
        out.writeString(F_No_Semaine);
        out.writeString(F_Numero);
        out.writeString(F_Numero_Remplacee);
        out.writeString(F_Poids);
        out.writeString(F_Rechargement);
        out.writeString(F_Remuneration);
        out.writeString(F_Statut);
        out.writeString(F_CoStatut);
        out.writeStringList(F_Taches);
        out.writeStringList(F_Secteurs);
    }

    public static final Creator<BeanFDRQRCode> CREATOR = new Creator<BeanFDRQRCode>() {
        public BeanFDRQRCode createFromParcel(Parcel in) {
            return new BeanFDRQRCode(in);
        }

        public BeanFDRQRCode[] newArray(int size) {
            return new BeanFDRQRCode[size];
        }
    };

    private BeanFDRQRCode(Parcel in) {
        A_Adresse = in.readString();
        A_CDC = in.readString();
        A_Code = in.readString();
        A_ServeurRH = in.readString();
        A_Telephone = in.readString();

        D_CodeEmploi = in.readString();
        D_Matricule = in.readString();
        D_NomPrenom = in.readString();
        D_TauxHoraire = in.readString();
        D_TauxIK = in.readString();
        D_VehImmat = in.readString();
        DISTRI_VehPTAC = in.readString();

        F_ID = in.readString();
        F_CodeCouleur = in.readString();
        F_Depart = in.readString();
        F_Duree = in.readString();
        F_Fin = in.readString();
        F_Frais = in.readString();
        F_No_Annee = in.readString();
        F_No_Semaine = in.readString();
        F_Numero = in.readString();
        F_Numero_Remplacee = in.readString();
        F_Poids = in.readString();
        F_Rechargement = in.readString();
        F_Remuneration = in.readString();
        F_Statut = in.readString();
        F_CoStatut = in.readString();
        F_Taches = new ArrayList<>();
        in.readStringList(F_Taches);
        F_Secteurs = new ArrayList<>();
        in.readStringList(F_Secteurs);
    }
}

here you can see the creation of my intent:

Intent intent = new Intent(QRCodeScanActivity.this, QRCodeScanResultActivity.class);
                    intent.putExtra("BeanFDRQRCode", mBeanFDRQRCode);
                    intent.putExtra("androidPrincipal", mAndroidPrincipal);
                    intent.putExtra("beanEnregistrerSignature", beanEnregistrerSignature);
                    QRCodeScanActivity.this.startActivity(intent);

and below this is how i get parcelable from extra :

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i("onCreate", "QRCodeScanResultActivity");
        setContentView(R.layout.activity_scan_result);

        Intent i = getIntent();
        v_BeanFDRQRCode = i.getParcelableExtra("BeanFDRQRCode");
        androidPrincipal = i.getParcelableExtra("androidPrincipal");
        beanEnregistrerSignature = i.getParcelableExtra("beanEnregistrerSignature");

}

I read lot of things like this How to fix Unmarshalling unknown type code XXX at offset YYY in Android?

But my problem is particullary because the app work on the tablet(Archos).

I find nothing to solve my problem, morever i don't understand why the probleme depending on the device.

Community
  • 1
  • 1
Slasch
  • 275
  • 1
  • 6
  • 20

1 Answers1

0

As we found out in the comments, the exception was the result of ProGuard obfuscating Parcelable classes. The fix is to include this snippet in the ProGuard configuration file:

-keepclassmembers class * implements android.os.Parcelable {
    static ** CREATOR;
}

Source answer

Community
  • 1
  • 1
user2413972
  • 1,355
  • 2
  • 9
  • 25
  • i have add this to my ProGuard configuration file **proguard-rules.pro** with this in my build.gradle `proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'` but it's not working – Slasch Oct 23 '15 at 15:26