USB-hostoverzicht

wanneer uw Android-apparaat in de USB-hostmodus staat, fungeert het als de USB-host, stuurt de bus aan en somt het aangesloten USB-apparaten op. USB-hostmodus wordt ondersteund in Android 3.1 en hoger.

API overzicht

voordat u begint, is het belangrijk om de klassen te begrijpen waarmee u moet werken. De volgende tabel beschrijft de USB host API ‘ s in het android.hardware.usb pakket.

Tabel 1., USB Host API ‘ s

Klasse Description
UsbManager stelt u in staat om op te sommen en te communiceren met aangesloten USB-apparaten.
UsbDevice vertegenwoordigt een aangesloten USB-apparaat en bevat methoden om toegang te krijgen tot de identificatie-informatie, interfaces en eindpunten.
UsbInterface vertegenwoordigt een interface van een USB-apparaat, die een set functionaliteit voor het apparaat definieert., Een apparaat kan een of meer interfaces hebben om mee te communiceren.
UsbEndpoint vertegenwoordigt een interface-eindpunt, dat een communicatiekanaal is voor deze interface. Een interface kan één of meer eindpunten hebben, en heeft gewoonlijk input en output eindpunten voor twee-weg communicatie met het apparaat.
UsbDeviceConnection vertegenwoordigt een verbinding met het apparaat, dat gegevens over eindpunten overdraagt. In deze klasse kunt u gegevens sychroon of asynchroon heen en weer sturen.,
UsbRequest vertegenwoordigt een asynchrone aanvraag om met een apparaat te communiceren via een UsbDeviceConnection.
UsbConstants definieert USB-constanten die overeenkomen met de definities in linux/usb/ch9.h van de Linux kernel.

in de meeste situaties moet u al deze klassen gebruiken (UsbRequest is alleen vereist als u asynchrone communicatie doet) wanneer u communiceert met een USB-apparaat., In het algemeen verkrijgt u een UsbManager om de gewenste UsbDeviceop te halen. Als je het apparaat hebt, moet je de juiste UsbInterface vinden en de UsbEndpoint van die interface om mee te communiceren. Zodra u het juiste eindpunt hebt verkregen, opent u een UsbDeviceConnection om te communiceren met het USB-apparaat.,

Android manifest-vereisten

de volgende lijst beschrijft wat u aan het manifest-bestand van uw toepassing moet toevoegen voordat u met de USB-host-API ’s werkt:

  • omdat niet alle Android-apparaten gegarandeerd de USB-Host-API’ s ondersteunen, bevat u een <uses-feature> element dat verklaart dat uw toepassing de android.hardware.usb.host functie gebruikt.
  • Stel de minimale SDK van de toepassing in op API-niveau 12 of hoger. De USB-host API ‘ s zijn niet aanwezig op eerdere API-niveaus.,
  • Als u wilt dat uw toepassing op de hoogte wordt gesteld van een aangesloten USB-apparaat, geef dan een <intent-filter> en <meta-data> elementpaar op voor de android.hardware.usb.action.USB_DEVICE_ATTACHED Intentie in uw hoofdactiviteit. Het element <meta-data> wijst naar een extern XML-bronbestand dat identificerende informatie aangeeft over het apparaat dat u wilt detecteren.

    declareer in het XML-bronbestand <usb-device> elementen voor de USB-apparaten die u wilt filteren. De volgende lijst beschrijft de kenmerken van <usb-device>., Over het algemeen gebruikt u leverancier-en product-ID als u wilt filteren op een specifiek apparaat en gebruikt u Klasse, subklasse en protocol als u wilt filteren op een groep USB-apparaten, zoals apparaten voor massaopslag of digitale camera ‘ s. U kunt geen of al deze attributen opgeven., Opgeven geen kenmerken overeenkomen met elke USB-apparaat, dus doe dit alleen als uw toepassing vereist:

    • vendor-id
    • product-id
    • class
    • subclass
    • protocol (apparaat of interface)

    Sla het resource-bestand in de res/xml/ map. De naam van het bronbestand (zonder de .XML extensie) moet hetzelfde zijn als degene die je hebt opgegeven in het <meta-data> element. Het formaat voor het XML resource bestand is in het voorbeeld hieronder.,

Manifest en bronbestand voorbeelden

het volgende voorbeeld toont een voorbeeld manifest en het bijbehorende bronbestand:

In dit geval moet het volgende bronbestand worden opgeslagen in res/xml/device_filter.xml en geeft aan dat elk USB-apparaat met de opgegeven kenmerken moet worden gefilterd:

werk met apparaten

wanneer gebruikers USB-apparaten aansluiten op een Android-aangedreven apparaat, kan het Android-systeem bepalen of uw applicatie is geïnteresseerd in het aangesloten apparaat. Zo ja, kunt u het opzetten van de communicatie met het apparaat indien gewenst., Om dit te doen, moet uw toepassing:

  1. aangesloten USB-apparaten ontdekken door gebruik te maken van een intentiefilter om te worden gewaarschuwd wanneer de gebruiker een USB-apparaat verbindt of door USB-apparaten op te sommen die al zijn aangesloten.
  2. vraag de gebruiker om toestemming om verbinding te maken met het USB-apparaat, indien dit nog niet is verkregen.
  3. Communiceer met het USB-apparaat door gegevens te lezen en te schrijven op de juiste interface-eindpunten.,

een apparaat ontdekken

uw toepassing kan USB-apparaten ontdekken door gebruik te maken van een intentiefilter dat wordt aangemeld wanneer de gebruiker een apparaat verbindt of door USB-apparaten op te sommen die al zijn aangesloten. Het gebruik van een intent filter is handig als u wilt dat uw applicatie automatisch een gewenst apparaat detecteert. Het opsommen van aangesloten USB-apparaten is handig als u een lijst wilt krijgen van alle aangesloten apparaten of als uw toepassing niet heeft gefilterd op een intentie.,

gebruik een intent filter

om uw toepassing een bepaald USB-apparaat te laten ontdekken, kunt u een intent filter opgeven om te filteren voor de android.hardware.usb.action.USB_DEVICE_ATTACHED intent. Samen met dit doelfilter moet u een Bronbestand opgeven dat eigenschappen van het USB-apparaat specificeert, zoals product-en leveranciersidentiteitskaart. Wanneer gebruikers een apparaat aansluiten dat overeenkomt met uw apparaatfilter, presenteert het systeem hen een dialoogvenster waarin wordt gevraagd of ze uw toepassing willen starten. Als gebruikers dit accepteren, heeft uw toepassing automatisch toegang tot het apparaat totdat het apparaat wordt losgekoppeld.,

in Het volgende voorbeeld ziet u hoe verklaren de intentie filter:

in Het volgende voorbeeld ziet u hoe verklaren de bijbehorende resource bestand dat hiermee kunt u de USB-apparaten dat u geïnteresseerd bent in:

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

In uw activiteit, kunt u de UsbDevice vertegenwoordigt de aangesloten apparaat van de opzet zoals deze:

het Inventariseren van apparaten

Als uw aanvraag is geïnteresseerd in het inspecteren van alle USB-apparaten die momenteel verbinding heeft terwijl uw toepassing wordt uitgevoerd, kan het inventariseren van apparaten op de bus., Gebruik de methode getDeviceList() om een hash-kaart te krijgen van alle USB-apparaten die zijn aangesloten. De hash-kaart wordt gecodeerd door de naam van het USB-apparaat als u een apparaat van de kaart wilt verkrijgen.

indien gewenst kunt u ook gewoon een iterator uit de hash-map halen en elk apparaat één voor één verwerken:

toestemming verkrijgen om met een apparaat te communiceren

voordat u met het USB-apparaat communiceert, moet uw toepassing toestemming hebben van uw gebruikers.,

Opmerking: Als uw toepassing een intentiefilter gebruikt om USB-apparaten te ontdekken terwijl ze zijn aangesloten, krijgt het automatisch toestemming als de gebruiker uw toepassing toestaat om de intentieverklaring af te handelen. Als dit niet het geval is, moet u expliciet toestemming vragen in uw toepassing voordat u verbinding maakt met het apparaat.

expliciet om toestemming vragen kan noodzakelijk zijn in sommige situaties, zoals wanneer uw toepassing USB-apparaten opnoemt die al verbonden zijn en dan met één wil communiceren. U moet controleren op toestemming om toegang te krijgen tot een apparaat voordat u probeert te communiceren met het., Als dit niet het geval is, ontvangt u een runtime-fout als de gebruiker de toegang tot het apparaat heeft geweigerd.

om expliciet toestemming te verkrijgen, moet u eerst een broadcast-ontvanger maken. Deze ontvanger luistert naar de intentie die wordt uitgezonden als je requestPermission()aanroept. De aanroep naar requestPermission() toont een dialoogvenster voor de gebruiker die om toestemming vraagt om verbinding te maken met het apparaat., De volgende voorbeeldcode ziet u hoe de broadcast receiver:

Voor het registreren van de uitzending ontvanger, voeg dit toe aan uw onCreate() methode in uw activiteit:

Voor weergave van het dialoogvenster dat vraagt gebruikers om toestemming om verbinding te maken met het apparaat, de oproep van de requestPermission() methode:

Wanneer gebruikers een antwoord aan de dialoog, de uitzending ontvanger ontvangt het de bedoeling dat met de EXTRA_PERMISSION_GRANTED extra, dat is een boolean die de antwoorden. Controleer deze extra voor een waarde van true voordat u verbinding maakt met het apparaat.,

communiceren met een apparaat

communicatie met een USB-apparaat kan synchroon of asynchroon zijn. In beide gevallen moet u een nieuwe thread maken waarop u alle gegevensoverdracht kunt uitvoeren, zodat u de UI-thread niet blokkeert. Om de communicatie met een apparaat correct in te stellen, moet u de juiste UsbInterface en UsbEndpoint van het apparaat waarop u wilt communiceren verkrijgen en verzoeken verzenden op dit eindpunt met een UsbDeviceConnection., In het algemeen moet uw code:

  • Controleer eenUsbDevice attributen van het object, zoals product-ID, vendor-ID of apparaatklasse om erachter te komen of u met het apparaat wilt communiceren.
  • Als u zeker weet dat u met het apparaat wilt communiceren, zoek dan de juiste UsbInterface die u wilt gebruiken om samen met de juiste UsbEndpoint van die interface te communiceren. Interfaces kunnen één of meer eindpunten hebben, en zullen gewoonlijk een input en output eindpunt hebben voor tweerichtingscommunicatie.,
  • wanneer u het juiste eindpunt vindt, opent u een UsbDeviceConnection op dat eindpunt.
  • Geef de gegevens die u op het eindpunt wilt verzenden met de methode bulkTransfer() of controlTransfer(). U moet deze stap in een andere draad uit te voeren om te voorkomen dat het blokkeren van de belangrijkste UI draad. Zie processen en Threads voor meer informatie over het gebruik van threads in Android.

het volgende codefragment is een triviale manier om een synchrone gegevensoverdracht te doen., Je code moet meer logica correct vinden van de juiste interface en eindpunten te communiceren en ook moeten doen overbrengen van de gegevens in een andere thread dan de UI-thread:

Voor het verzenden van gegevens asynchroon, gebruik je de UsbRequest klasse initialize en queue een asynchroon verzoek, vervolgens wachten op de uitslag met requestWait().,

communicatie beëindigen met een apparaat

wanneer u klaar bent met communiceren met een apparaat of als het apparaat los was, sluit u UsbInterface en UsbDeviceConnection door releaseInterface() en close()aan te roepen. Om naar losgemaakte gebeurtenissen te luisteren, maak je een broadcast-ontvanger aan zoals hieronder:

Het aanmaken van de broadcast-ontvanger binnen de toepassing, en niet het manifest, staat toe dat je toepassing alleen losgemaakte gebeurtenissen afhandelt terwijl het draait., Op deze manier worden losgemaakte gebeurtenissen alleen verzonden naar de toepassing die momenteel wordt uitgevoerd en niet uitgezonden naar alle toepassingen.

Share

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *