Odeslat poptávku

Vývoj pro Zebry, aneb jak se nenechat kopnout

QR a čárové kódy jsou dnes standardem v tisíci různých odvětví, stejně jako aplikace, které s nimi pracují. Co ale dělat, když běžný telefon nesplňuje požadavky na výdrž, odolnost nebo poskytované funkce? Řešením mohou být skenery od firmy Zebra.

Jedná se o různorodá proprietární zařízení s operačním systémem Android. Lze mezi nimi nebo vytvořit kombinaci hardwaru a softwaru pro každou situaci. Při vývoji je však potřeba počítat s jistými specifiky. 

Design aplikace

Je pravda, že design obvykle není první slovo, které člověka napadne ve spojení s pracovní aplikací. Když tvoříte appku pro tyto skenery, je to ale první věc, kterou musíte brát v úvahu.

Zejména v případě, že budou používány někde v zastrčeném skladu. V dnešní době, kdy se výrobci telefonů předhánějí ve velikosti a rozlišení displeje, je totiž jednoduché zapomenout, že velká úhlopříčka nemusí představovat reálně využitelný prostor.

Rozlišení skenerů na nižším konci cenového spektra totiž odpovídá oslnivému MDPI. Ono je to logické – horší panel znamená úsporu při výrobě a menší spotřebu energie při provozu, ale zároveň bohužel posouvá design guidelines zpět do roku 2010.

DataWedge vs EMDK 

Skenery Zebra umožňují aplikacím dva způsoby komunikace s hardwarem: DataWedge a Enterprise Mobility Developer Kit. Zatímco DataWedge umožňuje snadnější implementaci běžných situací, a tím zjednodušuje a zrychluje vývoj, při použití EMDK musí programátor ošetřit vše sám.

Totéž se každý dozví při otevření oficiální dokumentace k EMDK, kde hned první řádek odkazuje na výhody použití DataWedge

Každá mince ale má dvě strany, což platí i v tomto případě. DataWedge sice umožňuje rychlý vývoj, ale uživatel (nebo správce zařízení) pak musí nastavit podpůrnou aplikaci, nad kterou vývojář nemá žádnou kontrolu. Kromě nutnosti nastavit každý skener se tak vytváří potenciální zdroj těžko debugovatelných problémů, zvláště pak v rukou zvídavého koncového uživatele.

Využití EMDK sice znamená více práce při vývoji, ale pro použití pak stačí pouze nainstalovat aplikaci. Navíc má vývojář plnou kontrolu nad tím, kdy a jaký kód bude akceptován – a pokud se něco pokazí, je jasné, kde je chyba. Z těchto důvodů jsme pro vývoj našich aplikací vybrali EMDK

Volba je snad jasná... Nebo ne?

EMDK a jeho zvláštnosti

Jako každý software i EMDK prochází průběžným vývojem. Výběr správné verze je však poněkud složitější než najít aktuálně nejnovější. Jednotlivé verze EMDK totiž podporují různé verze Androidu, je tedy potřeba vědět, jestli klient neplánuje používat starší modely skenerů. V následujících ukázkách kódu bude použit EMDK verze 7.6.10.

Pokud má aplikace pracovat i na bežných telefonech nebo jiných zařízeních bez hardwarového skeneru čárových kódů, je potřeba vyřešit čtení těchto kódů pomocí fotoaparátu. EMDK však používá hardwarové ovladače pro kameru. Výsledek? Není možné zároveň přijímat kódy z kamery a hardwarového skeneru.

Dost řečí, pojďme se podívat na kód 

V první řadě potřebujeme do manifestu přidat závislost na EMDK...

<uses-library android:name="com.symbol.emdk" />

...a přidat EMDK do gradle

compileOnly "com.symbol:emdk:7.6.10"

 

Pak můžeme získat referenci na EMDKManager...

EMDKManager.getEMDKManager(context, object : EMDKManager.EMDKListener {
            override fun onOpened(emdkManager: EMDKManager?) {
                //reference obtained, we can proceed with binding actual devices
                initScanner((emdkManager?.getInstance(EMDKManager.FEATURE_TYPE.BARCODE) as? BarcodeManager) ?: return)
            }

            override fun onClosed() {
                //clear all references, since manager is about to be destroyed
            }
        })

…a inicializovat samotný skener

fun initScanner(barcodeManager: BarcodeManager) {
    barcodeManager.getDevice(BarcodeManager.DeviceIdentifier.DEFAULT)
            ?.apply {
                addDataListener {
                    if (it.result == ScannerResults.SUCCESS) {
                        for (code in it.scanData) {
                            //do what you will with scanned code
                        }
                    }
                }
                addStatusListener {
                    if (it.state == StatusData.ScannerStates.IDLE && !isReadPending) {
                        read()
                    }
                }
                try {
                    enable() //start scanning immediately                   
                } catch (e: Exception) {
                    //here we should handle cases like already running camera, that block the device from initializing
                }
            }
}


Jakmile máme referenci na skener, můžeme skenování přerušit pomocí metody disable() a znovu obnovit pomocí enable(), podobně jako při inicializaci. Když už scanner nepotřebujeme, je dobré referenci uvolnit

fun releaseScanner(it: Scanner) {
    it.disable()
    it.release()
}

 

Pokud chceme, aby aplikace fungovala i na běžných telefonech, pak musíme do manifestu přidat řádek

<uses-library android:name="com.symbol.emdk" android:required="false" />

 

a za běhu aplikace pak zjistit, jestli jde o podporované zařízení

fun Context.isEMDKAvailable() =
        try {
            Build.MANUFACTURER.contains("Zebra Technologies")
                    && packageManager.getPackageInfo("com.symbol.emdk.emdkservice", 0) != null
        } catch (e: Exception) {
            false
        }

Máte se Zebrou své zkušenosti? Potěší nás vaše postřehy. Dejte nám vědět třeba na dactyláckém Facebooku. A pokud pro Zebry potřebujete aplikaci, nenechte se jimi nakopnout. Rádi vám s vývojem pomůžeme. 

Článek připravil Vojta, náš senior Android developer.