USB host overview (Čeština)

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 pro android.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á:

  1. 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.
  2. Požádejte uživatele o povolení k připojení k zařízení USB, pokud již nebylo získáno.
  3. 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:

  • zkontrolujteUsbDevice 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() nebo controlTransfer() 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í.

Share

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *