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 UsbDeviceConnection eszkö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 UsbDevice
letö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 aandroid.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 aandroid.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
-
protocol
(eszköz vagy interfész)
subclass
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:
- 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.
- kérje meg a felhasználót, hogy engedélyezze az USB-eszközhöz való csatlakozást, ha még nem kapta meg.
- 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()
vagycontrolTransfer()
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.