我有一个类 RegistrationRequest ,它实现 Parcelable ,如下所示:
package org.esec.mcg.androidu2f.client.msg;
public final class RegistrationRequest extends BaseRequest implements Parcelable {
public RegistrationRequest(byte[] applicationSha256, byte[] challengeSha256) {
super(challengeSha256, applicationSha256);
}
private RegistrationRequest(Parcel source) {
challengeSha256 = source.createByteArray();
applicationSha256 = source.createByteArray();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeByteArray(challengeSha256);
dest.writeByteArray(applicationSha256);
}
public static final ClassLoaderCreator<RegistrationRequest> CREATOR = new ClassLoaderCreator<RegistrationRequest>() {
@Override
public RegistrationRequest createFromParcel(Parcel source, ClassLoader loader) {
return new RegistrationRequest(source);
}
@Override
public RegistrationRequest createFromParcel(Parcel source) {
return createFromParcel(source, null);
}
@Override
public RegistrationRequest[] newArray(int size) {
return new RegistrationRequest[size];
}
}
applicationSha256&amp; challengeSha256 是 BaseRequest 中的两个字节数组。 我将 RegistrationRequest 的对象放在一个包中:
Bundle data = new Bundle();
data.putParcelable("registerRequest", registrationRequest);
并将数据放入意图中。然后使用StartActivityWithResult()
传递此意图。
最后,我将在另一个包含不同包名的APK中收到此Bundle:package org.esec.mcg.androidu2fsimulator.token;
。在此APK中, RegistrationRequest 的包名称为package org.esec.mcg.androidu2fsimulator.token.msg;
。
所以,当我取消它的时候:
Bundle data = new Bundle();
data.getParcelable("registerRequest");
我收到以下错误:
引起:android.os.BadParcelableException:ClassNotFoundException 当解组时: org.esec.mcg.androidu2f.client.msg.RegistrationRequest
我注意到Parcelable接口中有ClassLoaderCreator
。
我试过Bundle的setClassLoader(RegistrationRequest.class.getClassLoader())
。但问题仍然存在。
更新我已尝试在setClassLoader(RegistrationRequest.class.getClassLoader())
之前致电data.getParcelable()
。但问题仍然存在。