prezentare generală gazdă USB

când dispozitivul dvs. alimentat cu Android este în modul gazdă USB, acesta acționează ca gazdă USB, alimentează magistrala și enumeră dispozitivele USB conectate. Modul gazdă USB este acceptat în Android 3.1 și versiuni ulterioare.înainte de a începe, este important să înțelegeți clasele cu care trebuie să lucrați. Următorul tabel descrie API-urile gazdă USB în pachetul android.hardware.usb.Tabelul 1., USB Host APIs

Clasa Descriere
UsbManager vă Permite să enumere și să comunice cu dispozitivele USB conectate.
UsbDevice Reprezintă un dispozitiv USB conectat și conține metode pentru a accesa informații de identificare, interfețe, și obiective.
UsbInterface Reprezintă o interfață a unui dispozitiv USB, care definește un set de funcționalități pentru dispozitiv., Un dispozitiv poate avea una sau mai multe interfețe pe care să comunice.
UsbEndpoint reprezintă un punct final de interfață, care este un canal de comunicare pentru această interfață. O interfață poate avea unul sau mai multe puncte finale și, de obicei, are puncte finale de intrare și ieșire pentru comunicarea bidirecțională cu dispozitivul.
UsbDeviceConnection reprezintă o conexiune la dispozitiv, care transferă date pe puncte finale. Această clasă vă permite să trimiteți date înainte și înapoi sincron sau asincron.,
UsbRequest Reprezintă o cerere asincron pentru a comunica cu un dispozitiv printr-un UsbDeviceConnection.
UsbConstants definește constantele USB care corespund definițiilor din linux/usb / ch9.h a kernel-ului Linux.

În cele mai multe situații, aveți nevoie pentru a utiliza toate aceste clase (UsbRequest este necesară doar dacă faci comunicare asincronă) atunci când comunică cu un dispozitiv USB., În general, veți obține un UsbManager pentru a prelua dorit UsbDevice. Când aveți dispozitivul, trebuie să găsiți corespunzător UsbInterface și UsbEndpoint din acea interfață pentru a comunica mai departe. După ce obțineți punctul final corect, deschideți un UsbDeviceConnection pentru a comunica cu dispozitivul USB.,

Android manifestă cerințe

următoarea listă descrie ceea ce ai nevoie pentru a adăuga la cererea dumneavoastră manifest fișier înainte de a lucra cu USB host APIs:

  • Pentru că nu toate dispozitivele Android sunt garantate pentru suport USB host APIs, include un <uses-feature> element care declară că aplicația folosește android.hardware.usb.host caracteristică.
  • setați SDK-ul minim al aplicației la nivelul API 12 sau mai mare. API-urile gazdă USB nu sunt prezente la nivelurile API anterioare.,
  • Dacă vrei ca cererea ta să fie notificat de un atașat dispozitivul USB, specificați un <intent-filter> și <meta-data> element pereche pentru android.hardware.usb.action.USB_DEVICE_ATTACHED intenție în principal de activitate. Elementul <meta-data> indică un fișier de resurse XML extern care declară informații de identificare despre dispozitivul pe care doriți să îl detectați.

    în fișierul de resurse XML, declarați <usb-device> elemente pentru dispozitivele USB pe care doriți să le filtrați. Următoarea listă descrie atributele <usb-device>., În general, utilizați furnizorul și ID-ul produsului dacă doriți să filtrați pentru un anumit dispozitiv și utilizați clasa, subclasa și protocolul dacă doriți să filtrați pentru un grup de dispozitive USB, cum ar fi dispozitive de stocare în masă sau camere digitale. Puteți specifica nici unul sau toate aceste atribute., Specificarea nr de atribute meciuri fiecare dispozitiv USB, deci, face acest lucru numai dacă aplicația dvs. necesită:

    • vendor-id
    • product-id
    • class
    • subclass
    • protocol (dispozitiv sau interfață)

    Salvați fișierul de resurse în res/xml/ director. Numele fișierului de resurse (fără .extensia xml) trebuie să fie aceeași cu cea specificată în elementul <meta-data>. Formatul pentru fișierul de resurse XML este în exemplul de mai jos.,în acest caz, următorul fișier de resurse ar trebui să fie salvate înres/xml/device_filter.xmlși specifică faptul că orice dispozitiv USB cu atributele specificate ar trebui să fie filtrate:

    lucrul cu dispozitive

    atunci când utilizatorii conecta dispozitive USB la un dispozitiv Android-alimentat cu un dispozitiv USB, sistemul Android poate determina dacă aplicația dvs. este interesată de dispozitivul conectat. Dacă da, puteți configura comunicarea cu dispozitivul, dacă doriți., Pentru a face acest lucru, aplicația dvs. trebuie să:

    1. descoperiți dispozitivele USB conectate utilizând un filtru de intenție pentru a fi notificat atunci când utilizatorul conectează un dispozitiv USB sau enumerând dispozitivele USB care sunt deja conectate.
    2. cereți utilizatorului permisiunea de a se conecta la dispozitivul USB, dacă nu a fost deja obținut.
    3. comunicați cu dispozitivul USB prin citirea și scrierea datelor pe punctele finale ale interfeței corespunzătoare.,

    descoperiți un dispozitiv

    aplicația dvs. poate descoperi dispozitive USB fie folosind un filtru de intenție pentru a fi notificat atunci când utilizatorul conectează un dispozitiv, fie enumerând dispozitive USB care sunt deja conectate. Utilizarea unui filtru de intenție este utilă dacă doriți ca aplicația dvs. să detecteze automat un dispozitiv dorit. Enumerarea dispozitivelor USB conectate este utilă dacă doriți să obțineți o listă cu toate dispozitivele conectate sau dacă aplicația dvs. nu a filtrat pentru o intenție.,

    utilizați un filtru de intenție

    pentru ca aplicația dvs. să descopere un anumit dispozitiv USB, puteți specifica un filtru de intenție pentru a filtraandroid.hardware.usb.action.USB_DEVICE_ATTACHED intenție. Împreună cu acest filtru de intenție, trebuie să specificați un fișier de resurse care specifică proprietățile dispozitivului USB, cum ar fi ID-ul produsului și furnizorului. Când utilizatorii conectează un dispozitiv care se potrivește cu filtrul dispozitivului, sistemul le prezintă un dialog care îi întreabă dacă doresc să pornească aplicația. Dacă utilizatorii acceptă, aplicația dvs. are automat permisiunea de a accesa dispozitivul până când dispozitivul este deconectat.,

    următorul exemplu arată cum să-și declare intenția de filtrare:

    următorul exemplu arată cum să declare de resurse corespunzătoare fișier care specifică dispozitivele USB care sunteți interesat în:

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

    În activitatea dumneavoastră, puteți obține UsbDevice care reprezintă dispozitivul atașat la intenția de genul asta:

    Enumera dispozitive

    Dacă cererea dumneavoastră este interesat în inspectarea tuturor dispozitivelor USB conectat în timp ce aplicația se execută, se pot enumera dispozitive pe bus., Utilizați metoda getDeviceList() pentru a obține o hartă hash a tuturor dispozitivelor USB conectate. Harta hash este tastată de numele dispozitivului USB dacă doriți să obțineți un dispozitiv de pe hartă.dacă doriți, puteți obține doar un iterator din harta hash și să procesați fiecare dispozitiv unul câte unul:

    obțineți permisiunea de a comunica cu un dispozitiv

    înainte de a comunica cu dispozitivul USB, aplicația dvs. trebuie să aibă permisiunea utilizatorilor.,Notă: Dacă aplicația dvs. utilizează un filtru de intenție pentru a descoperi dispozitivele USB în timp ce sunt conectate, aceasta primește automat permisiunea dacă utilizatorul permite aplicației dvs. să gestioneze intenția. Dacă nu, trebuie să solicitați permisiunea în mod explicit în aplicația dvs. înainte de a vă conecta la dispozitiv.solicitarea explicită a permisiunii poate fi necesară în anumite situații, cum ar fi atunci când aplicația dvs. enumeră dispozitive USB care sunt deja conectate și apoi dorește să comunice cu una. Trebuie să verificați permisiunea de a accesa un dispozitiv înainte de a încerca să comunicați cu acesta., Dacă nu, veți primi o eroare de rulare dacă utilizatorul a refuzat permisiunea de a accesa dispozitivul.

    pentru a obține în mod explicit permisiunea, creați mai întâi un receptor de difuzare. Acest receptor ascultă pentru intenția care devine difuzat atunci când apelați requestPermission(). Apelul la requestPermission() afișează un dialog utilizatorului care solicită permisiunea de a se conecta la dispozitiv., Următorul exemplu de cod arată cum să creați receptor de difuzare:

    Pentru a înregistra receptor de difuzare, adăuga acest lucru în onCreate() metodă în activitatea dvs.:

    Pentru a afișa caseta de dialog care cere utilizatorilor pentru permisiunea de a se conecta la dispozitiv, chem requestPermission() metoda:

    atunci Când utilizatorii răspuns la dialog, difuzare destinatarul primeste intenție care conține EXTRA_PERMISSION_GRANTED suplimentar, care este un boolean care reprezintă răspunsul. Verificați acest extra pentru o valoare de true înainte de a vă conecta la dispozitiv.,comunicarea cu un dispozitiv USB poate fi sincronă sau asincronă. În ambele cazuri, ar trebui să creați un fir nou pe care să efectuați toate transmisiile de date, astfel încât să nu blocați firul UI. Pentru a stabili corect de comunicare cu un dispozitiv, aveți nevoie pentru a obține corespunzătoare UsbInterface și UsbEndpoint de pe dispozitivul pe care doriți să comunice și trimite cereri pe acest efect cu un UsbDeviceConnection., În general, codul dvs. ar trebui:

    • verificați un UsbDevice atributele obiectului, cum ar fi ID-ul produsului, ID-ul furnizorului sau clasa dispozitivului pentru a afla dacă doriți sau nu să comunicați cu dispozitivul.
    • atunci Când sunteți sigur că doriți să comunice cu aparatul, pentru a găsi corespunzătoare UsbInterface pe care doriți să-l utilizați pentru a comunica împreună cu corespunzătoare UsbEndpoint de acea interfață. Interfețele pot avea unul sau mai multe puncte finale și, în mod obișnuit, vor avea un punct final de intrare și ieșire pentru comunicarea bidirecțională.,
    • când găsiți punctul final corect, deschideți un UsbDeviceConnection pe acel punct final.
    • Furnizarea de date pe care doriți să transmită pe final cu bulkTransfer() sau controlTransfer() metoda. Ar trebui să efectuați acest pas într-un alt fir pentru a preveni blocarea firului UI principal. Pentru mai multe informații despre utilizarea firelor în Android, consultați procese și fire.

    următorul fragment de cod este un mod banal de a face un transfer de date sincron., Codul ar trebui să aibă mai mult de logica corect, pentru a găsi corect interfață și efecte pentru a comunica și, de asemenea, ar trebui să facă orice transferul de date într-un fir diferit decât firul principal UI:

    Pentru a trimite date în mod asincron, folosiți UsbRequest clasa initialize și queue o cerere asincron, apoi așteptați pentru rezultatul cu requestWait().,

    de Încheiere a comunicării cu un dispozitiv

    atunci Când ați terminat comunicarea cu un aparat sau dacă aparatul a fost detașat, aproape UsbInterface și UsbDeviceConnection de asteptare releaseInterface() și close(). Pentru a asculta evenimente detașate, creați un receptor de difuzare ca mai jos:

    crearea receptorului de difuzare în cadrul aplicației, și nu manifestul, permite aplicației dvs. să se ocupe doar de evenimente detașate în timp ce rulează., În acest fel, evenimentele detașate sunt trimise numai aplicației care rulează în prezent și nu sunt difuzate tuturor aplicațiilor.

Share

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *