[Xamarin, AIDL, Android] BitmapStub osztály nem létezik

[Xamarin, AIDL, Android] BitmapStub osztály nem létezik
2020-06-21T15:06:30+02:00
2021-10-08T18:42:08+02:00
2022-10-15T21:16:23+02:00
H.Lilla
Sziasztok!

Kaptam egy "Jicai JP-Q2" handheld eszközt, amely Android 6.0 rendszerre épül és van benne egy hőnyomtató. Xamarin Forms alkalmazásból szeretném elérni azt, hogy ezzel a hőnyomtatóval tudjak nyomtatni.

Nagy nyomozások árán kiderítettem, hogy ezzel a nyomtatóval kétféleképp tudok kommunikálni: Bluetooth serial kapcsolattal, illetve egy háttérben futó service-en keresztül, amihez van egy AIDL interfész-leíró fájl. Bluetooth-szal simán működik ESC/POS parancsokkal, de nekem nem tetszik az benne, hogy a Bluetooth-vevőnek folyamatosan mennie kell emiatt. Szóval megpróbálkoznék az AIDL-lel.

Maga az AIDL fájlt itt találtam meg: areeb111/jicai-q2-sdk

Szóval a Xamarin-os Android projektbe ezt a két fájlt belemásoltam, a build action-t mindkettőnél "AndroidInterfaceDescription"-re állítottam. Build során viszont kapok két fordítási hibát az AIDL-ből generált kódra, amit nem tudok hová tenni:

1) The type or namespace name 'BitmapStub' does not exist in the namespace 'Android.Graphics' (are you missing an assembly reference?)
2) 'Bitmap' does not contain a definition for 'AsBinder' and no accessible extension method 'AsBinder' accepting a first argument of type 'Bitmap' could be found (are you missing a using directive or an assembly reference?)

Arra már rájöttem, hogyha az AIDL-ből ezt kitörlöm:

void printBitmap(int alignment, int bitmapSize, in Bitmap mBitmap, in IPosPrinterCallback callback);
Akkor mindkét fordítási hibám megszűnik. Ebben az esetben viszont nem tudom bind-olni a service-t az alábbi kóddal:

class PrinterBinder : Java.Lang.Object, IServiceConnection { public void OnServiceConnected(ComponentName name, IBinder service) { //ez null lesz IPosPrinterService boundService = service as IPosPrinterService; } public void OnServiceDisconnected(ComponentName name) {} } //MainActivity.cs Intent i = new Intent(); i.SetPackage("com.iposprinter.iposprinterservice"); i.SetAction("com.iposprinter.iposprinterservice.IPosPrintService"); IServiceConnection serviceConnection = new PrinterBinder(); bool result = BindService(i, serviceConnection, Bind.AutoCreate); //ez true lesz
Van ötletetek arra, hogy ezt a BitmapStub problémát hogy lehetne megoldani? Már feltúrtam érte az internet jó részét, de nem találtam semmi hasznosat.
Mutasd a teljes hozzászólást!
Azt hiszem, találtam egy lehetséges megoldást:
Imprimir en Sunmi V2 usando Xamarin y AIDL
Mutasd a teljes hozzászólást!

  • Közben elkezdtem követni az itt leírtakat, és rögtön észrevettem egy különbséget. Miközben a Xamarin doksija szerint a service-t így érhetem el az OnServiceConnected-ben:

    IPosPrinterService boundService = service as IPosPrinterService;
    Valójában ezt kellett csinálom, hogy életet leheljek bele:

    IPosPrinterService boundService = IPosPrinterServiceStub.AsInterface(service);
    Ez nyilván a BitmapStub problémát nem oldja meg, de egyrészt lehet, arra nincs is szükségem (szóval kikommentezhetem az AIDL-ben), másrészt a blog alapján ha nagyon kell mégis, tudok csinálni egy AAR fájlt Android Studio-ban. Igaz, a tuti megoldás az lenne, ha a Xamarin kódgenerátora jó kódot generálna.
    Mutasd a teljes hozzászólást!
  • Valóban bevált az a módszer, amit a linkelt blog leír. Mivel a Xamarin az AIDL-ből valamiért rossz kódot generált, így végül letettem róla, hogy azt használjam. Amikor az AIDL-ből kikommenteztem azt a metódust, ami miatt a Xamarin fordítási hibába futott, bár tudtam belőle egy forduló kódot csinálni, de aztán jött a következő probléma. Valami a generált kód miatt az inter-process communication során félrement, ezért a nyomtató állandóan hülyeséget nyomtatott, valamint sokszor hibára futott, kriptikus runtime hibaüzeneteket produkálva.

    Szóval a módszer a következő:
    1) Android Studio-ban csináltam egy teljesen új, üres projektet...
    2) ... amihez rögtön hozzáadtam egy új Android Library-t.
    3) Ehhez a library-hez hozzáadtam az AIDL fájlokat.
    4) Release-re állítottam a build konfigurációt.
    5) Build-eltem a library-t, aminek az eredménye egy valami-release.aar fájl lett.
    6) A Xamarin solution-höz hozzáadtam egy új Android Bindings Library projektet.
    7) A Jars mappához hozzáadtam az AAR fájlt.
    8) Az Android Bindings Library-t build-eltem, ami generált némi kódot a háttérben, amivel...
    9) ...a Xamarin.Android projektben a MainActivity.OnCreate metódusban, a kérdésben szereplő módszerrel már tudtam bind-olni a service-t és hozzá tudtam adni a service locatorhoz, így már tudtam használni a Xamarin Forms projekten belül.
    Mutasd a teljes hozzászólást!
  • Sikerült kijavítani?
    Meg tudná osztani a megoldást a githubon keresztül?
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd