Chcę przekazać ciąg i bitmapę do usługi przy użyciu AIDL. Usługa implementuje tę metodę AIDL:Umieszczanie bitmapy w pakiecie
void addButton(in Bundle data);
W moim przypadku Pakiet zawiera ciąg i bitmapę.
aplikacji wywołującej (klient) ma ten kod:
...
// 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();
}
...
Na koniec służby, mam klasę ButtonComponent z tym kodem:
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;
}
}
Po utworzeniu ButtonComponent, usługa tworzy przycisk wykorzystujący tekst i ikonę z obiektu 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);
}
...
Jako w rezultacie przycisk jest wyświetlany z poprawnym tekstem i widzę miejsce na ikonę, ale faktyczna mapa bitowa nie jest rysowana (tj. po lewej stronie tekstu jest puste miejsce).
Czy to prawda, aby umieścić bitmapę w pakiecie w ten sposób?
Jeśli powinienem użyć paczki (w porównaniu z paczką) czy istnieje sposób na zachowanie pojedynczego argumentu "dane" w metodzie AIDL, aby zachować tekst i ikonę razem?
Pytanie boczne: Jak mogę zdecydować się na użycie pakietów zamiast paczek?
Wielkie dzięki.
Dziękuję. W moim scenariuszu bitmapy mają rozmiar ~ 900 bajtów, co jest prawdopodobnie dość dużym rozmiarem i chcę uniknąć umieszczania ich wszystkich w pliku APK usługi (może być wielu różnych klientów). Jeśli użyłbym unikalnego identyfikatora, to sądzę, że zarówno pakiety klientów, jak i usług będą zawierały rzeczywisty plik PNG ... prawda? – rippeltippel
wszystkie twoje obrazy powinny znajdować się w katalogu '/ res/drawable' –