3

Base32文字列としてマーシェリングして保存することで「ショートカット」を保存するホーム画面の実装がありParcelます。

マーシェリングとアンマーシェリングは、次の 1 つのシナリオを除いて、まったく問題なく動作します。

Honeycomb (またはそれ以下) でインテントをマーシェルし、ICS (またはそれ以上) でそれをアンマーシェルしようとすると、null ポインター例外が発生します。(これは逆もまた真であり、ICS でマーシェル化され、HC でマーシェル化されていないこともまた誤りです)

しかし、マーシェリング - Froyo、GB、および HC 間でのアンマーシェリングはまったく問題なく機能します。ICS と JellyBean の間でも同じです。

Base32 変換に apache commons ライブラリを使用しています。(Base64も試しましたが、うまくいきません)。Base32 からの文字列のエンコードとデコードには問題はありません。

これは私のコードです:

public static Intent getIntentFromBase32String(final String s)
{
    try
    {
        final Parcel p = Parcel.obtain();
        final byte[] array = new Base32(true).decode(s);
        p.unmarshall(array, 0, array.length);
        p.setDataPosition(0);
        final Intent intent = (Intent)p.readValue(Intent.class.getClassLoader());
        return intent;
    }
    catch (final Exception e)
    {
        Logger.logError(e);
    }
    return null;
}

public static String getBase32StringFromIntent(final Intent intent)
{
    try
    {
        final Parcel p = Parcel.obtain();
        p.writeValue(intent);
        final byte[] array = p.marshall();
        return new Base32(true).encodeToString(array);
    }
    catch (final Exception e)
    {
        Logger.logError(e);
    }
    return null;
}

これはスタックトレースです:

java.lang.NullPointerException in com.myapp.myhome.loadShortcuts Message: null
    android.content.Intent.readFromParcel(Intent.java:6222)
    android.content.Intent.<init>(Intent.java:6202)
    android.content.Intent.readFromParcel(Intent.java:6229)
    android.content.Intent.<init>(Intent.java:6202)
    android.content.Intent$1.createFromParcel(Intent.java:6193)
    android.content.Intent$1.createFromParcel(Intent.java:6191)
    android.os.Parcel.readParcelable(Parcel.java:1993)
    android.os.Parcel.readValue(Parcel.java:1855)
    com.myapp.common.utils.getIntentFromBase32String(Unknown Source)
    .....

シリアル化されたイメージが古いバージョンと互換性がないため、Google が ICS の Intent にいくつかの追加属性を追加したと思います。これに対する回避策はありますか?

4

0 に答える 0