když je vaše zařízení se systémem Android v režimu USB host, působí jako USB hostitel, pohání sběrnici, a výčet připojených zařízení USB. Režim hostitele USB je podporován v systému Android 3.1 a vyšším.
přehled API
než začnete, je důležité pochopit třídy, se kterými musíte pracovat. Následující tabulka popisuje rozhraní USB host API v balíčku android.hardware.usb
.
Tabulka 1., USB Host rozhraní Api,
Třída | Popis |
---|---|
UsbManager |
Umožňuje vyjmenovat a komunikovat s připojenými zařízeními USB. |
UsbDevice |
Představuje připojené zařízení USB a obsahuje metody pro přístup k jeho identifikační údaje, rozhraní a koncových bodů. |
UsbInterface |
představuje rozhraní USB zařízení, které definuje sadu funkcí pro zařízení., Zařízení může mít jedno nebo více rozhraní, na kterých lze komunikovat. |
UsbEndpoint |
představuje koncový bod rozhraní, který je komunikačním kanálem pro toto rozhraní. Rozhraní může mít jeden nebo více koncových bodů a obvykle má vstupní a výstupní koncové body pro obousměrnou komunikaci se zařízením. |
UsbDeviceConnection |
představuje připojení k zařízení, které přenáší data na koncové body. Tato třída umožňuje posílat data tam a zpět sychronně nebo asynchronně., |
UsbRequest |
Představuje asynchronní požadavek pro komunikaci s přístroji pomocí UsbDeviceConnection . |
UsbConstants |
Definuje USB konstanty, které odpovídají definicím v linux/usb/ch9.h jádra Linuxu. |
Ve většině případů budete muset použít všechny z těchto tříd (UsbRequest
je nutné pouze, pokud děláte asynchronní komunikace) při komunikaci s USB zařízením., Obecně získáte UsbManager
pro načtení požadovaného UsbDevice
. Pokud máte zařízení, musíte najít odpovídající UsbInterface
a UsbEndpoint
tohoto rozhraní pro komunikaci. Jakmile získáte správný koncový bod, otevřeteUsbDeviceConnection
pro komunikaci se zařízením USB.,
Android manifest požadavky
následující seznam popisuje, co je třeba přidat do vaší aplikace manifest soubor, než pracovat s USB host rozhraní Api:
- Protože ne všechny Android-poháněl zařízení jsou garantované na podporu USB host rozhraní Api patří
<uses-feature>
element, který prohlašuje, že vaše aplikace používáandroid.hardware.usb.host
funkce. - nastavte minimální SDK aplikace na úroveň API 12 nebo vyšší. Rozhraní USB host API nejsou k dispozici na dřívějších úrovních API.,
- Pokud chcete, aby vaše aplikace být informován o připojené USB zařízení, zadejte
<intent-filter>
<meta-data>
element, pár proandroid.hardware.usb.action.USB_DEVICE_ATTACHED
záměr ve své hlavní činnosti. Prvek<meta-data>
ukazuje na externí soubor zdrojů XML, který deklaruje identifikační informace o zařízení, které chcete detekovat.v souboru zdrojů XML deklarujte
<usb-device>
prvky pro zařízení USB, která chcete filtrovat. Následující seznam popisuje atributy<usb-device>
., Obecně použijte ID dodavatele a produktu, pokud chcete filtrovat pro konkrétní zařízení a používat třídu, podtřídu a protokol, pokud chcete filtrovat pro skupinu zařízení USB, jako jsou velkokapacitní paměťová zařízení nebo digitální fotoaparáty. Můžete zadat žádný nebo všechny tyto atributy., Upřesňující žádné atributy zápasy každý USB zařízení, tak pouze to, pokud vaše aplikace vyžaduje:vendor-id
product-id
class
subclass
-
protocol
(zařízení nebo rozhraní)
Uložit soubor prostředků v
res/xml/
adresář. Název souboru zdroje (bez .XML přípona) musí být stejná jako ta, kterou jste zadali v prvku<meta-data>
. Formát souboru zdrojů XML je v níže uvedeném příkladu.,
Manifest a soubor resource příklady
následující příklad ukazuje manifest a jeho odpovídající resource file:
V tomto případě, následující zdrojový soubor by měl být uložen v res/xml/device_filter.xml
a určuje, že jakákoliv USB zařízení s uvedenými atributy by měly být filtrovány:
Práce s prostředky
Když uživatelé připojit USB zařízení do Android-poháněl zařízení, Android systém může určit, zda vaše aplikace je zájem o připojeném zařízení. Pokud ano, můžete v případě potřeby nastavit komunikaci se zařízením., K tomu, vaše aplikace má:
- Zjistit, z připojených USB zařízení pomocí intent filtru, které mají být upozorněni, když se uživatel připojí zařízení USB nebo výčtem USB zařízení, která jsou již připojeny.
- Požádejte uživatele o povolení k připojení k zařízení USB, pokud již nebylo získáno.
- Komunikujte se zařízením USB čtením a zápisem dat na příslušných koncových bodech rozhraní.,
Objevte zařízení
Vaše aplikace může zjistit, USB zařízení buď pomocí intent filtru, které mají být upozorněni, když se uživatel připojí zařízení nebo výčtem USB zařízení, která jsou již připojeny. Použití filtru záměr je užitečné, pokud chcete, aby vaše aplikace automaticky rozpoznala požadované zařízení. Výčet připojených zařízení USB je užitečný, pokud chcete získat seznam všech připojených zařízení nebo pokud vaše aplikace nefiltrovala záměr.,
Použití úmyslem filtr
, Aby vaše aplikace objevovat konkrétní USB zařízení, můžete určit záměr filtr filtr android.hardware.usb.action.USB_DEVICE_ATTACHED
záměr. Spolu s tímto filtrem záměru musíte zadat soubor zdrojů, který určuje vlastnosti zařízení USB, jako je ID produktu a dodavatele. Když uživatelé připojí zařízení, které odpovídá filtru vašeho zařízení, systém jim zobrazí dialogové okno s dotazem, zda chtějí spustit aplikaci. Pokud uživatelé přijmou, vaše aplikace má automaticky oprávnění k přístupu k zařízení, dokud není zařízení odpojeno.,
následující příklad ukazuje, jak deklarovat záměr filtr:
následující příklad ukazuje, jak deklarovat odpovídající resource file, který určuje USB zařízení, která máte zájem:
<?xml version="1.0" encoding="utf-8"?><resources> <usb-device vendor-id="1234" product-id="5678" /></resources>
Ve vaší činnosti, můžete získat UsbDevice
, který představuje připojené zařízení od záměru takto:
Výčet zařízení
Pokud vaše aplikace má zájem o kontrolu všech USB zařízení momentálně připojených, zatímco je aplikace spuštěna, můžete vytvořit výčet zařízení na sběrnici., Pomocí metodygetDeviceList()
získáte hash mapu všech připojených zařízení USB. Mapa hash je zadána jménem zařízení USB, pokud chcete získat zařízení z mapy.
Pokud chcete, můžete také získat iterátor z hash mapy a proces každé zařízení, jeden po druhém:
Získat povolení pro komunikaci se zařízením
Před komunikací s zařízení USB, aplikace musí mít povolení od uživatelů.,
Poznámka: Pokud vaše aplikace používá filtr intent k objevování zařízení USB, když jsou připojena, automaticky obdrží povolení, pokud uživatel dovolí vaší aplikaci zvládnout záměr. Pokud tomu tak není, musíte před připojením k zařízení výslovně požádat o povolení ve své aplikaci.
explicitně žádat o povolení může být nezbytné v některých situacích, jako je například, když vaše aplikace vyjmenuje USB zařízení, která jsou již připojena a pak chce komunikovat s jedním. Před pokusem o komunikaci s ním musíte zkontrolovat oprávnění k přístupu k zařízení., Pokud tomu tak není, obdržíte chybu runtime, pokud uživatel odepřel oprávnění k přístupu k zařízení.
Chcete-li explicitně získat oprávnění, nejprve vytvořte vysílací přijímač. Tento přijímač poslouchá záměr, který se vysílá při volání requestPermission()
. Volání na requestPermission()
zobrazí uživateli dialog s žádostí o povolení k připojení k zařízení., Následující ukázkový kód ukazuje, jak vytvořit broadcast receiver:
zaregistrovat broadcast receiver, přidejte this in your onCreate()
metoda ve vaší činnosti:
Se zobrazí dialogové okno, které požádá uživatele o oprávnění k připojení přístroje, zavolejte requestPermission()
metoda:
Když uživatelé odpovědi na dialog, vysílání přijímač přijímá záměr, který obsahuje EXTRA_PERMISSION_GRANTED
navíc, což je logický představující odpověď. Před připojením k zařízení zkontrolujte hodnotu true.,
komunikace se zařízením
komunikace se zařízením USB může být synchronní nebo asynchronní. V obou případech byste měli vytvořit nové vlákno, na kterém budete provádět všechny datové přenosy, abyste neblokovali vlákno uživatelského rozhraní. Správně nastavit komunikaci s přístrojem, budete muset získat příslušné UsbInterface
UsbEndpoint
o zařízení, které chcete komunikovat a posílat požadavky na tento koncový bod s UsbDeviceConnection
., Váš kód by obecně měl:
- zkontrolujte
UsbDevice
atributy objektu, jako je ID produktu, ID dodavatele nebo třída zařízení, abyste zjistili, zda chcete se zařízením komunikovat. - Pokud jste si jisti, že chcete komunikovat s přístrojem, najít odpovídající
UsbInterface
, který chcete použít pro komunikaci spolu s odpovídajícíUsbEndpoint
rozhraní. Rozhraní mohou mít jeden nebo více koncových bodů a obvykle budou mít vstupní a výstupní koncový bod pro obousměrnou komunikaci., - Když najdete správný koncový bod, otevřete v tomto koncovém bodě
UsbDeviceConnection
. - Dodávky dat, které chcete přenášet na koncový bod s
bulkTransfer()
nebocontrolTransfer()
metoda. Tento krok byste měli provést v jiném vlákně, abyste zabránili blokování hlavního vlákna uživatelského rozhraní. Další informace o používání podprocesů v systému Android naleznete v části Procesy a vlákna.
následující úryvek kódu je triviální způsob, jak provést synchronní přenos dat., Váš kód by měl mít větší logiku správně najít správné rozhraní a koncové body komunikovat a také by přenos dat v jiném vlákně, než hlavní vlákno uživatelského ROZHRANÍ:
poslat data asynchronně, použijte UsbRequest
class initialize
queue
asynchronní požadavek, pak čekat na výsledek s requestWait()
.,
Zastavení komunikace se zařízením
Když jste hotovi komunikaci se zařízením, nebo pokud bylo zařízení samostatná budova, blízko UsbInterface
UsbDeviceConnection
zavoláním releaseInterface()
close()
. Chcete-li poslouchat oddělené události, Vytvořte přijímač vysílání, jako je níže:
vytvoření přijímače vysílání v aplikaci, a nikoli manifestu, umožňuje vaší aplikaci zpracovávat pouze oddělené události, když je spuštěna., Tímto způsobem jsou oddělené události odesílány pouze do aplikace, která je aktuálně spuštěna a není vysílána do všech aplikací.