USB host áttekintés

amikor az Android-alapú eszköz USB host módban van, USB host-ként működik, táplálja a buszt, és felsorolja a csatlakoztatott USB-eszközöket. Az USB host mód az Android 3.1 vagy újabb verziójában támogatott.

API áttekintés

mielőtt elkezdené, fontos megérteni azokat az osztályokat, amelyekkel együtt kell dolgoznia. Az alábbi táblázat a android.hardware.usb csomagban található USB host API-kat írja le.

1. táblázat., Az USB Host API-k

Class leírás
UsbManager lehetővé teszi a csatlakoztatott USB-eszközökkel való kommunikációt.
UsbDevice egy csatlakoztatott USB-eszközt jelent, amely azonosítási információinak, interfészeinek és végpontjainak elérésére szolgáló módszereket tartalmaz.
UsbInterface egy USB-eszköz interfészét jelenti, amely meghatározza az eszköz funkcionalitásának halmazát., A készüléknek lehet egy vagy több interfésze, amelyen kommunikálni lehet.
UsbEndpoint egy interfészvégpontot jelent, amely ezen interfész kommunikációs csatornája. Egy interfésznek lehet egy vagy több végpontja, általában bemeneti és kimeneti végpontjai vannak a készülékkel való kétirányú kommunikációhoz.
UsbDeviceConnection kapcsolatot jelent az eszközzel, amely végpontokon továbbítja az adatokat. Ez az osztály lehetővé teszi, hogy az adatokat előre-hátra sychronously vagy aszinkron módon küldje el.,
UsbRequest egy aszinkron kérést jelent a UsbDeviceConnectioneszközzel való kommunikációra.
UsbConstants meghatározza az USB állandókat, amelyek megfelelnek a Linux/usb / ch9 definícióinak.h a Linux kernel.

a legtöbb esetben ezeket az osztályokat (UsbRequest csak akkor kell használni, ha aszinkron kommunikációt végez), amikor USB-eszközzel kommunikál., Általában a UsbManager értéket kapja a kívánt UsbDeviceletöltéséhez. Ha rendelkezik a készülékkel, meg kell találnia a megfelelő UsbInterface és a UsbEndpoint az adott interfészt. Miután megkapta a megfelelő végpontot, nyissa meg aUsbDeviceConnection az USB-eszközzel való kommunikációhoz.,

Android nyilvánvaló követelmények

Az alábbi lista bemutatja, mi kell hozzá, hogy az alkalmazás nyilvánvaló fájlt, mielőtt dolgozik az USB host Api-k:

  • Mert nem minden Android-alapú készülékek garantált, hogy támogatja az USB host Api-k, tartalmaz egy <uses-feature> elem, amely kijelenti, hogy az alkalmazás a android.hardware.usb.host funkciót.
  • állítsa az alkalmazás minimális SDK-jét 12 vagy újabb API szintre. Az USB host API-k nincsenek jelen a korábbi API szinteken.,
  • ha azt szeretné, hogy az alkalmazás értesítést kapjon egy csatolt USB-eszközről, adjon meg egy <intent-filter> és <meta-data> elempárt a android.hardware.usb.action.USB_DEVICE_ATTACHED fő tevékenységéhez. A <meta-data> elem egy külső XML erőforrás fájlra mutat, amely azonosítja az észlelni kívánt eszközre vonatkozó információkat.

    az XML erőforrás fájlban deklarálja a<usb-device> szűrni kívánt USB-eszközök elemeit. Az alábbi lista a <usb-device>attribútumait írja le., Általában használja a gyártó és a termékazonosítót, ha szűrni szeretne egy adott eszközhöz, és osztály, alosztály és protokollt szeretne használni, ha USB-eszközök egy csoportjára szeretne szűrni, például a háttértároló eszközökre vagy a digitális fényképezőgépekre. Megadhatja egyik vagy az összes ilyen attribútumok., A nem attribútumok megadása minden USB-eszközre vonatkozik, ezért csak akkor tegye ezt, ha az alkalmazás megköveteli:

    • vendor-id
    • product-id

  • class
  • subclass

  • protocol (eszköz vagy interfész)

mentse az erőforrás fájlt a res/xml/könyvtárba. Az erőforrás fájl neve (nélkül .xml kiterjesztés) meg kell egyeznie a megadott <meta-data> elem. Az XML erőforrás fájl formátuma az alábbi példában található.,

Nyilvánvaló, a forrás fájl példák

A következő példa azt mutatja be, egy minta nyilvánvaló, valamint a megfelelő erőforrás-fájl:

ebben az esetben a következő forrás fájlt menteni kell a res/xml/device_filter.xml adja meg, hogy bármilyen USB-eszközt a megadott attribútumok kell szűrni:

a Munka eszközök

Amikor a felhasználók csatlakoztassa az USB-eszközt, hogy egy Android-alapú készüléket, hogy az Android rendszer lehet meghatározni, hogy a kérelmet az érdekelt, hogy a csatlakoztatott eszköz. Ha igen, beállíthatja a kommunikációt az eszközzel, ha szükséges., Ehhez az alkalmazásnak a következőket kell tennie:

  1. fedezze fel a csatlakoztatott USB-eszközöket egy intent szűrő használatával, amelyet értesíteni kell, amikor a felhasználó USB-eszközt csatlakoztat, vagy felsorolja a már csatlakoztatott USB-eszközöket.
  2. kérje meg a felhasználót, hogy engedélyezze az USB-eszközhöz való csatlakozást, ha még nem kapta meg.
  3. kommunikáljon az USB-eszközzel úgy, hogy az adatokat a megfelelő interfészvégpontokon olvassa el és írja le.,

fedezzen fel egy eszközt

az alkalmazás felfedezheti az USB-eszközöket egy olyan szándékszűrő használatával, amelyet értesíteni kell, amikor a felhasználó csatlakoztat egy eszközt, vagy felsorolja a már csatlakoztatott USB-eszközöket. A szándékszűrő használata akkor hasznos, ha azt szeretné, hogy az alkalmazás automatikusan felismerje a kívánt eszközt. A csatlakoztatott USB-eszközök felsorolása akkor hasznos, ha az összes csatlakoztatott eszköz listáját szeretné megkapni, vagy ha az alkalmazás nem szűrte a szándékot.,

használjon szándékszűrőt

ahhoz, hogy az alkalmazás felfedezzen egy adott USB-eszközt, megadhat egy szándékszűrőt a android.hardware.usb.action.USB_DEVICE_ATTACHED szándék szűréséhez. Ezzel a szándékszűrővel együtt meg kell adnia egy erőforrásfájlt, amely meghatározza az USB-eszköz tulajdonságait, például a termék-vagy szállítóazonosítót. Amikor a felhasználók olyan eszközt csatlakoztatnak, amely megfelel az eszközszűrőnek, a rendszer egy párbeszédpanellel mutatja be őket, amely megkérdezi, hogy el akarják-e indítani az alkalmazást. Ha a felhasználók elfogadják, az alkalmazás automatikusan jogosult az eszközhöz való hozzáférésre, amíg az eszköz le nincs választva.,

A következő példa azt mutatja be, hogyan állapítsa meg, hogy a szándék szűrő:

A következő példa azt mutatja be, hogyan állapítsa meg a megfelelő erőforrás-fájl, amely meghatározza, hogy az USB-eszköz, ami érdekel:

<?xml version="1.0" encoding="utf-8"?><resources> <usb-device vendor-id="1234" product-id="5678" /></resources>

a tevékenység, akkor kaphat a UsbDevice jelenti, hogy a csatlakoztatott eszköz a szándék, mint ez:

Felsorolni eszközök

Ha a kérelmet az érdekelt felügyeleti az összes USB eszközt csatlakoztatott, amíg az alkalmazás fut, felsorolni eszközök a buszon., Használja a getDeviceList() módszert, hogy hash térképet kapjon az összes csatlakoztatott USB-eszközről. A hash térképet az USB-eszköz neve adja meg, ha eszközt szeretne beszerezni a térképről.

ha szükséges, akkor is csak szerezni egy iterátor a hash térkép és feldolgozza az egyes eszközök egyenként:

engedélyt szerezni kommunikálni egy eszköz

mielőtt kommunikál az USB eszköz, az alkalmazás engedélyével kell rendelkeznie a felhasználók.,

Megjegyzés: Ha az alkalmazás szándékszűrőt használ az USB-eszközök felfedezéséhez, amikor csatlakoztatva vannak, akkor automatikusan engedélyt kap, ha a felhasználó lehetővé teszi az alkalmazás számára a szándék kezelését. Ha nem, akkor engedélyt kell kérnie kifejezetten az alkalmazásban, mielőtt csatlakozna az eszközhöz.

az engedély kifejezett kérése szükség lehet bizonyos helyzetekben, például amikor az alkalmazás felsorolja a már csatlakoztatott USB-eszközöket, majd kommunikálni akar velük. Mielőtt megpróbálna kommunikálni vele, ellenőriznie kell az eszköz eléréséhez szükséges engedélyt., Ha nem, akkor futási hibát kap, ha a felhasználó megtagadta az eszköz eléréséhez szükséges engedélyt.

az engedély kifejezett megszerzéséhez először hozzon létre egy sugárzott vevőt. Ez a vevő hallgatja a szándék, hogy lesz sugárzott, ha hívja requestPermission(). A requestPermission() hívás párbeszédpanelt jelenít meg a felhasználónak, amely engedélyt kér az eszközhöz való csatlakozáshoz., A következő minta kód megmutatja, hogyan kell létrehozni a broadcast receiver:

regisztrálni a broadcast receiver, add hozzá ezt a onCreate() módszer a tevékenység:

jelenítse meg a párbeszédpanel, hogy kéri a felhasználók engedélyét, hogy a csatlakozás után a készülék hívja a requestPermission() method:

Amikor a felhasználók a válasz, hogy a párbeszéd, a broadcast receiver kap a szándékkal, hogy tartalmazza a EXTRA_PERMISSION_GRANTED extra, ami egy logikai képviselő a választ. Mielőtt csatlakozna az eszközhöz, ellenőrizze ezt az extra értéket a true értéknél.,

kommunikálni egy eszköz

kommunikáció egy USB eszköz lehet szinkron vagy aszinkron. Mindkét esetben létre kell hoznia egy új szálat, amelyen elvégezheti az összes adatátvitelt, így nem blokkolja a felhasználói felület menetét. Az eszközzel való kommunikáció megfelelő beállításához meg kell szereznie a megfelelő UsbInterface és UsbEndpoint azon eszköz megfelelő azonosítóját, amelyen kommunikálni szeretne, és a végpontra vonatkozó kéréseket egyUsbDeviceConnection., Általában a kódnak:

  • ellenőrizze a UsbDevice objektum attribútumait, például a termékazonosítót, a szállítóazonosítót vagy az eszközosztályt annak megállapításához, hogy kommunikálni szeretne-e az eszközzel.
  • ha biztos benne, hogy kommunikálni szeretne az eszközzel, keresse meg a megfelelő UsbInterface, amelyet a megfelelő UsbEndpoint – val kíván kommunikálni. Az interfészeknek egy vagy több végpontja lehet, és általában egy bemeneti és kimeneti végpontja lesz a kétirányú kommunikációhoz.,
  • ha megtalálja a megfelelő végpontot, nyisson meg egy UsbDeviceConnection értéket ezen a végponton.
  • adja meg a végponton továbbítani kívánt adatokat a bulkTransfer() vagy controlTransfer() módszerrel. Ezt a lépést egy másik szálban kell végrehajtania, hogy megakadályozza a fő UI szál blokkolását. További információ a szálak Android, lásd folyamatok és szálak.

a következő kódrészlet triviális módja a szinkron adatátvitelnek., A kód több a logika, hogy helyesen megtalálja a megfelelő interfész végpontok, hogy kommunikálni is kell tennie, bármilyen át adatokat egy másik szál, mint a fő UI szál:

ahhoz, Hogy adatot küldhessen aszinkron módon kerülhet sor, használja a UsbRequest osztály initialize vagy queue aszinkron kérés, akkor várni az eredményt requestWait().,

Ha befejezte a kommunikációt egy eszközzel, vagy ha az eszköz leválasztásra került, zárja be a UsbInterface és UsbDeviceConnection releaseInterface() és . A különálló események hallgatásához hozzon létre egy olyan műsorszóró vevőt, mint az alábbi:

az alkalmazáson belüli sugárzott vevőkészülék létrehozása, nem pedig a manifest, lehetővé teszi az alkalmazás számára, hogy csak különálló eseményeket kezeljen futás közben., Így a különálló események csak a jelenleg futó alkalmazáshoz kerülnek elküldésre, nem pedig az összes alkalmazáshoz.

Share

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük