Android alkalmazás fejlesztés Zebra címkenyomtatóhoz
Bizonyos ügyfélkörben gyakori igény lehet a címkék gyors nyomtatása hordozható, kompakt hő nyomtatóval, mint arra cikksorozatunk első részében is rámutattunk. A Zebra ZQ szériás nyomtatók kiválóan alkalmasak erre a feladatra. Hogyan tudjuk integrálni a Zebra ZSDK android SDK-ját, milyen engedélyek szükségesek a nyomtatáshoz, milyen úton lehet megtalálni az elérhető nyomtatókat, illetve hogyan néz ki a nyomtatás? Cikkünkben választ kaphatsz ezekre a kérdésekre!
ZSDK Android SDK integrálása
Mivel ez a könyvtár nincs fent egyik SDK megosztó platformon sem, így a Zebra hivatalos weboldaláról kell letölteni a .jar fájlt. A Google-ba beírva a “ZSDK Android SDK”-t könnyedén megtalálható az oldal, ahonnan letölthető.
Az SDK letöltését követően be kell másolni az app/libs mappába, viszont ez még nem elégséges ahhoz, hogy használni tudjuk. A következő sor hozzáadása is szükséges az app.gradle fájlban:
Engedélyek adása
Mivel Bluetooth-al kapcsolódunk a címkenyomtatóhoz, ezért az eszközön szükség van a Bluetooth bekapcsolására, míg az alkalmazásban a következő engedélyeket kell hozzáadni az AndroidManifest.xml fájlban:
Mielőtt elindítanánk a nyomtatók keresését, előtte “location permission” engedélyt szükséges kérni a felhasználótól.
A fenti kód részleten az látható, ahogy a képernyő létrejötte után megvizsgáljuk, hogy rendelkezünk-e a megfelelő engedélyekkel a felhasználótól. Ez jelen esetben az ACCESS_FINE_LOCATION permission. Ha nem, akkor elkérjük a felhasználótól.
Nyomtató keresés, cache-elés
A különböző nyomtatáshoz kapcsolódó service-eket érdemes leválasztani az Activity-ről és egy külön komponensben elhelyezni.
A keresés elindításához az SDK-ban lévő BluetoothDiscoverer osztály findPrinters() metódusát tudjuk használni.
A következő kódrészletben egy lehetséges megvalósítás szerepel.
A fenti kódrészletben látható egy ScanPrintersService interfész. Ezen interfész implementációja tartalmazza a nyomtató keresés funkciót, továbbá a megtalált nyomtatókat memóriába cache-eli. Ezt később el tudjunk érni, illetve a memória cache ürítését is lehetővé teszi. A keresés elindítása az adott igénytől függ, viszont az egyik lehetséges módszer egy UI-on elhelyezett Keresés gomb, melynek megnyomására meghívódik a startScan() metódus, amely a keresés eredményét a PrinterScanCallback-en keresztül adja vissza.
Miután a ScanPrintersService-től megkaptuk az elérhető nyomtatókat, azokat ki tudjuk listázni a képernyőre a felhasználó számára, így ki tudja választani, melyik nyomtatót szeretné csatlakoztatni.
Megjegyzés: A kódrészletek nyomokban a Hilt dependency injection library nyomait tartalmazzák (@Singleton, @Inject, @ApplicationContext). Természetesen ez nem szükséges a nyomtatók kereséséhez, viszont a dependency injection alkalmazása erősen ajánlott, és az egyik legelterjedtebb DI library jelenleg a Hilt.
Kapcsolódás a Zebra címkenyomtatóhoz
A fenti kódrészletben látható service-ben a connectToPrinter() metódussal tudunk kapcsolódni egy nyomtatóhoz. Jól látható, hogy a kapcsolódáshoz csak a nyomtatóhoz tartozó MAC address-re van szükség. A MAC address megtalálható az SDK-ban lévő DiscoveredPrinter osztályban. A nyomtató keresés eredménye egy ilyen DiscoveredPrinter lista.
Milyen formátumban lehet nyomtatni?
A ZQ szériába tartozó címkenyomtatókra több formátumban is el tudjuk juttatni amit nyomtatni szeretnénk.
ZPL vs. PDF
A ZPL (Zebra Programming Language) egy speciális nyelv, amelyet a Zebra fejlesztett ki a saját hőnyomtatóihoz. A ZPL széles körben használt nyelv címkék, vonalkódok és képek formázásához Zebra nyomtatókon. Lehetővé teszi, hogy megadjuk, hogyan kell nyomtatni a címkét, beleértve a szöveget, vonalkódokat, grafikákat és elrendezési részleteket.
A ZPL főbb jellemzői
Szöveg, vonalkódok és grafikák: A ZPL lehetővé teszi, hogy meghatározzuk a címkék elrendezését, beleértve a szöveg elhelyezését, a vonalkód létrehozását és a kép (logó) nyomtatását.
Sebesség és hatékonyság: A ZPL tömör és könnyű nyelv, amelyet gyors címke generálásra tervezték, ezáltal hatékony a nagy mennyiségű adat nyomtatásában.
Formátum tárolás: A ZPL parancsokat tárolni lehet a nyomtatón, így dinamikus tartalmú címkék gyors nyomtatása lehetséges, csupán a változó adatok elküldésével.
PDF nyomtatás Zebra címkenyomtatókon
A Zebra nyomtatók nemcsak ZPL-t (Zebra Programming Language) támogatnak, hanem PDF fájlok nyomtatását is lehetővé teszik. Ez különösen hasznos lehet olyan esetekben, amikor a címkék tartalmát nem kódolt ZPL-parancsok segítségével szeretnénk meghatározni, hanem közvetlenül PDF dokumentum formájában áll rendelkezésre az információ.
A fenti kódrészletek alapján már kiderülhetett, hogy a PDF nyomtatást választottuk a fejlesztés során. Ennek a részleteibe nem szeretnék itt most belemenni, mert egy PDF fájl összeállítása Androidban programkóddal egy külön cikket igényelne, viszont nagyvonalakban úgy kell elképzelni, hogy egy üres Canvas-ra, koordináták számolásával tudjuk pozicionálni a kívánt elemeket, mint például egy QR kód, vagy bármilyen más szöveges tartalmat.
A címkenyomtató beállításainak módosítása
A címkenyomtató beállításainak a megváltoztatására az SGD.GET és SGD.SET metódusok szolgálnak, ezek segítségével tudunk bizonyos beállításokat kiolvasni a nyomtatóról, illetve módosítani azokat. A nyomtatóhoz való csatlakozás után a zebraPrinterSupportsPDF() metódussal tudjuk megnézni, hogy a PDF nyomtatás van-e beállítva a nyomtatón, és ha nem, akkor a setPdfPrintingEnabled() metódussal tudjuk azt beállítani.
A nyomtató bővebb konfigurálására a Zebra Printer Setup Utility alkalmazás használható. Ez az alkalmazás általában előre fel van telepítve a Zebra android eszközökre.
Nyomtatás, adatküldés a címkenyomtatóra
Ha összeállítottuk a kinyomtatni kívánt pdf fájlt és a nyomtatót is sikeresen bekonfiguráltuk, akkor nincs más hátra, mint a nyomtatás.
Ahogy a kódból is látszik, szükségünk van a pdf fájl URI-re, valamint a connection objektumra, ami a kapcsolódás után jön létre. Ezeknek a birtokában a printDocument() metódussal tudjuk elindítani a nyomtatást. Mivel ez egy long running task, ezért nem célszerű a Main thread-en futtatni. A fenti kódban coroutine-ok használatával oldjuk meg a szálváltást.