将位图放入Bundle

rip*_*pel 5 android bundle bitmap parcel parcelable

我想使用AIDL将String和Bitmap传递给服务.服务实现此AIDL方法:

void addButton(in Bundle data);
Run Code Online (Sandbox Code Playgroud)

在我的例子中,Bundle包含一个String和一个Bitmap.

调用应用程序(客户端)具有以下代码:

...
// Add text to the bundle
Bundle data = new Bundle();
String text = "Some text";
data.putString("BundleText", text);

// Add bitmap to the bundle
Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.myIcon);
data.putParcelable("BundleIcon", icon);

try {
    myService.addButton(data);

} catch (RemoteException e) {
    Log.e(TAG, "Exception: ", e);
    e.printStackTrace();
}
...
Run Code Online (Sandbox Code Playgroud)

在服务端,我有一个带有以下代码的ButtonComponent类:

public final class ButtonComponent implements Parcelable {
    private final Bundle mData;

    private ComponComponent(Parcel source) {
        mData = source.readBundle();
    }

    public String getText() {
        return mData.getString("BundleText");
    }

    public Bitmap getIcon() {
        Bitmap icon = (Bitmap) mData.getParcelable("BundleIcon");
        return icon;
    }

    public void writeToParcel(Parcel aOutParcel, int aFlags) {
        aOutParcel.writeBundle(mData);
    }

    public int describeContents() {
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

创建ButtonComponent后,服务使用ButtonComponent对象中的文本和图标创建一个按钮:

...
mInflater.inflate(R.layout.my_button, aParent, true);
Button button = (Button) aParent.getChildAt(aParent.getChildCount() - 1);

// Set caption and icon
String caption = buttonComponent.getText();
if (caption != null) {
    button.setText(caption);
}

Bitmap icon = buttonComponent.getIcon();
if (icon != null) {
    BitmapDrawable iconDrawable = new BitmapDrawable(icon);
    button.setCompoundDrawablesWithIntrinsicBounds(iconDrawable, null, null, null);
}
...
Run Code Online (Sandbox Code Playgroud)

结果,按钮显示正确的文本,我可以看到图标的空间,但没有绘制实际的位图(即文本左侧有一个空白区域).

以这种方式将Bitmap放入Bundle是否正确?

如果我应该使用Parcel(vs一个Bundle)有没有办法在AIDL方法中维护一个'data'参数来保持文本和图标在一起?

附带问题:我如何决定使用Bundles vs Parcels?

非常感谢.

rip*_*pel 2

解决了。

问题是 Android 不支持我使用的 PNG。代码:

icon.getConfig()
Run Code Online (Sandbox Code Playgroud)

返回空值。