【问题标题】:Parcel android.os.Parcel Unmarshalling unknown type code 7209057 at offset XXXX in AndroidParcel android.os.Parcel Unmarshalling unknown type code 7209057 at offset XXXX in Android
【发布时间】:2015-08-27 10:34:35
【问题描述】:

我有两种不同的设备:

  • 手机 Sony Xperia SP Android v4.3
  • 平板爱可视101 helium Android v4.4

当我在平板电脑上启动我的应用程序时,它运行良好。

所以我尝试在我的另一台设备(索尼)上启动我的应用程序。在此设备上,当我尝试从处于活动状态的意图中恢复可打包对象时出现错误。

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)

这很奇怪,因为当应用程序在我的平板电脑(Archos)上启动相同的操作时,我没有任何问题或错误。当我尝试在意图启动的活动中使用intent.getParcelableExtra 获取可打包对象时,问题就出现了。

你可以在下面看到我的 parcelable 类:

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

在这里你可以看到我的意图的创建:

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

下面是我如何从额外中获得包裹:

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

}

我读过很多类似How to fix Unmarshalling unknown type code XXX at offset YYY in Android?的东西

但我的问题特别突出,因为该应用程序可以在平板电脑(Archos)上运行。

我找不到解决问题的方法,而且我不明白为什么问题取决于设备。

【问题讨论】:

    标签: android android-intent serialization unmarshalling parcelable


    【解决方案1】:

    正如我们在 cmets 中发现的,异常是 ProGuard 混淆 Parcelable 类的结果。修复方法是在 ProGuard 配置文件中包含这个 sn-p:

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

    Source answer

    【讨论】:

    • 我已将此添加到我的 ProGuard 配置文件 proguard-rules.pro 中,并在我的 build.gradle proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 中添加了这个,但它不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 2022-11-11
    • 1970-01-01
    • 2022-08-22
    • 2022-10-31
    相关资源
    最近更新 更多