När din Android-drivna enhet är i USB-värdläge fungerar den som USB-värd, Driver bussen och räknar upp anslutna USB-enheter. USB-värdläge stöds i Android 3.1 och högre.
API översikt
innan du börjar är det viktigt att förstå de klasser som du behöver arbeta med. Följande tabell beskriver USB host API: er i paketetandroid.hardware.usb
.
tabell 1., USB Host API: er
klass | beskrivning |
---|---|
UsbManager |
låter dig räkna upp och kommunicera med anslutna USB-enheter. |
UsbDevice |
representerar en ansluten USB-enhet och innehåller metoder för att komma åt dess identifieringsinformation, gränssnitt och slutpunkter. |
UsbInterface |
representerar ett gränssnitt för en USB-enhet, som definierar en uppsättning funktioner för enheten., En enhet kan ha ett eller flera gränssnitt för att kommunicera. |
UsbEndpoint |
representerar ett gränssnitt endpoint, som är en kommunikationskanal för detta gränssnitt. Ett gränssnitt kan ha en eller flera endpoints, och har vanligtvis ingångs-och utgångspunkter för tvåvägskommunikation med enheten. |
UsbDeviceConnection |
representerar en anslutning till enheten, som överför data på slutpunkter. Med den här klassen kan du skicka data fram och tillbaka sykront eller asynkront., |
UsbRequest |
representerar en asynkron begäran om att kommunicera med en enhet via enUsbDeviceConnection . |
UsbConstants |
definierar USB-konstanter som motsvarar definitioner i linux/usb / ch9.h av Linux-kärnan. |
i de flesta situationer måste du använda alla dessa klasser (UsbRequest
krävs endast om du gör asynkron kommunikation) när du kommunicerar med en USB-enhet., I allmänhet får du enUsbManager
för att hämta önskatUsbDevice
. När du har enheten måste du hitta rättUsbInterface
ochUsbEndpoint
för det gränssnittet att kommunicera på. När du har fått rätt slutpunkt öppnar du enUsbDeviceConnection
för att kommunicera med USB-enheten.,
Android manifest requirements
följande lista beskriver vad du behöver lägga till i programmets manifestfil innan du arbetar med USB host API: er:
- eftersom inte alla Android-drivna enheter garanteras stödja USB host API: er, inkludera ett
<uses-feature>
– element som förklarar att programmet använder funktionenandroid.hardware.usb.host
. - Ställ in programmets minsta SDK till API-nivå 12 eller högre. USB host API: er finns inte på tidigare API-nivåer.,
- Om du vill att din ansökan ska meddelas om en ansluten USB-enhet, Ange en
<intent-filter>
och<meta-data>
elementpar förandroid.hardware.usb.action.USB_DEVICE_ATTACHED
avsikt i din huvudsakliga aktivitet. Elementet<meta-data>
pekar på en extern XML-resursfil som deklarerar identifieringsinformation om den enhet som du vill upptäcka.i XML-resursfilen deklarerar du
<usb-device>
element för USB-enheter som du vill filtrera. Följande lista beskriver attributen för<usb-device>
., I allmänhet, använd leverantör och Produkt-ID om du vill filtrera för en viss enhet och använda Klass, underklass och protokoll om du vill filtrera för en grupp USB-enheter, till exempel masslagringsenheter eller digitalkameror. Du kan ange ingen eller alla dessa attribut., Ange inga attribut matchar varje USB-enhet, så gör det bara om din ansökan kräver det:vendor-id
product-id
class
subclass
-
subclass
- (enhet eller gränssnitt)
spara resursfilen i katalogen
res/xml/
. Resursfilnamnet (utan .xml-tillägg) måste vara samma som du angav i<meta-data>
– elementet. Formatet för XML-resursfilen finns i exemplet nedan.,
exempel på Manifest-och resursfil
följande exempel visar ett provmanifest och dess motsvarande resursfil:
i det här fallet ska följande resursfil sparas ires/xml/device_filter.xml
och anger att alla USB-enheter med angivna attribut ska filtreras:
arbeta med enheter
När användare ansluter USB-enheter till en Android-driven enhet ska Android-systemet kan avgöra om din ansökan är intresserad av den anslutna enheten. Om så är fallet kan du ställa in kommunikation med enheten om så önskas., För att göra detta måste din ansökan:
- Upptäck anslutna USB-enheter genom att använda ett intent-filter som ska meddelas när användaren ansluter en USB-enhet eller genom att räkna upp USB-enheter som redan är anslutna.
- fråga användaren om behörighet att ansluta till USB-enheten, om den inte redan erhållits.
- kommunicera med USB-enheten genom att läsa och skriva data om lämpliga gränssnitt endpoints.,
upptäck en enhet
ditt program kan upptäcka USB-enheter genom att antingen använda ett intent-filter som ska meddelas när användaren ansluter en enhet eller genom att räkna upp USB-enheter som redan är anslutna. Att använda ett avsiktsfilter är användbart om du vill kunna få din ansökan automatiskt upptäcka en önskad enhet. Räkna upp anslutna USB-enheter är användbart om du vill få en lista över alla anslutna enheter eller om din ansökan inte filtrerades för en avsikt.,
Använd ett intent-filter
för att få din applikation att upptäcka en viss USB-enhet kan du ange ett intent-filter för att filtrera förandroid.hardware.usb.action.USB_DEVICE_ATTACHED
– avsikten. Tillsammans med detta intent-filter måste du ange en resursfil som anger egenskaper för USB-enheten, till exempel produkt-och leverantörsnummer. När användare ansluter en enhet som matchar enhetsfiltret, presenterar systemet dem med en dialogruta som frågar om de vill starta programmet. Om användare accepterar har din ansökan automatiskt behörighet att komma åt enheten tills enheten är frånkopplad.,
följande exempel visar hur du deklarerar avsiktsfiltret:
följande exempel visar hur du deklarerar motsvarande resursfil som anger de USB-enheter som du är intresserad av:
<?xml version="1.0" encoding="utf-8"?><resources> <usb-device vendor-id="1234" product-id="5678" /></resources>
i din aktivitet kan du hämta UsbDevice
som representerar den bifogade enheten från avsikten så här:
räkna upp enheter
om din ansökan är intresserad av att inspektera alla USB-enheter som för närvarande är anslutna medan din ansökan körs, kan den räkna upp enheter på bussen., Använd metodengetDeviceList()
för att få en hashkarta över alla USB-enheter som är anslutna. Hash-kartan är knappad av USB-enhetens namn om du vill få en enhet från kartan.
om så önskas kan du också bara få en iterator från hash-kartan och bearbeta varje enhet en efter en:
få tillstånd att kommunicera med en enhet
innan du kommunicerar med USB-enheten måste din ansökan ha behörighet från dina användare.,
Obs! Om programmet använder ett avsiktsfilter för att upptäcka USB-enheter när de är anslutna, får det automatiskt tillstånd om användaren tillåter att programmet hanterar avsikten. Om inte, måste du begära tillstånd uttryckligen i din ansökan innan du ansluter till enheten.
uttryckligen ber om tillstånd kan vara nödvändig i vissa situationer som när programmet räknar upp USB-enheter som redan är anslutna och sedan vill kommunicera med en. Du måste kontrollera åtkomst till enheten innan du försöker kommunicera med den., Om inte får du ett runtime-fel om användaren nekade behörighet att komma åt enheten.
för att uttryckligen få tillstånd, skapa först en sändningsmottagare. Denna mottagare lyssnar på den avsikt som sänds när du ringer requestPermission()
. Anropet till requestPermission()
visar en dialogruta för användaren som ber om tillstånd att ansluta till enheten., Följande exempelkod visar hur du skapar sändningsmottagaren:
för att registrera sändningsmottagaren, Lägg till den här i din onCreate()
– metod i din aktivitet:
för att visa dialogrutan som ber användarna om behörighet att ansluta till enheten, Ring requestPermission()
– metoden:
När användarna svarar i dialogrutan får sändningsmottagaren avsikten som innehåller requestPermission()
– metoden:
När användarna svarar på dialogrutan får sändningsmottagaren a87e19c1cd ” > extra, vilket är en boolesk som representerar svaret. Kontrollera detta extra för ett värde av Sant innan du ansluter till enheten.,
kommunicera med en enhet
kommunikation med en USB-enhet kan vara antingen synkron eller asynkron. I båda fallen bör du skapa en ny tråd för att utföra alla dataöverföringar, så att du inte blockerar UI-tråden. För att korrekt ställa in kommunikation med en enhet måste du hämta lämplig UsbInterface
och UsbEndpoint
för den enhet som du vill kommunicera på och skicka förfrågningar på denna slutpunkt med en UsbDeviceConnection
., I allmänhet bör din kod:
- kontrollera
UsbDevice
objektets attribut, till exempel Produkt-ID, leverantörs-ID eller enhetsklass för att ta reda på om du vill kommunicera med enheten eller inte. - när du är säker på att du vill kommunicera med enheten, hitta lämplig
UsbInterface
som du vill använda för att kommunicera tillsammans med lämpligUsbEndpoint
för det gränssnittet. Gränssnitt kan ha en eller flera endpoints, och vanligtvis kommer att ha en ingångs-och utgångs endpoint för tvåvägskommunikation., - när du hittar rätt slutpunkt, öppna en
UsbDeviceConnection
på den slutpunkten. - ange de data som du vill överföra på slutpunkten med metoden
bulkTransfer()
ellercontrolTransfer()
. Du bör utföra detta steg i en annan tråd för att förhindra att du blockerar huvudgängan. Mer information om hur du använder trådar i Android finns i processer och trådar.
följande kodavsnitt är ett trivialt sätt att göra en synkron dataöverföring., Din kod bör ha mer logik för att korrekt hitta rätt gränssnitt och slutpunkter att kommunicera på och bör också göra någon överföring av data i en annan tråd än huvud UI-tråden:
för att skicka data asynkront, använd klassen UsbRequest
till initialize
och queue
en asynkron begäran och vänta sedan på resultatet med requestWait()
.,
avsluta kommunikationen med en enhet
När du är klar med att kommunicera med en enhet eller om enheten har lossats stänger duUsbInterface
ochUsbDeviceConnection
genom att ringareleaseInterface()
ochclose()
. För att lyssna på fristående händelser, skapa en sändningsmottagare som nedan:
skapa sändningsmottagaren i programmet, och inte manifestet, tillåter din ansökan att bara hantera fristående händelser medan den körs., På så sätt skickas fristående händelser endast till det program som för närvarande körs och sänds inte till alla program.