Android ca o gazdă USB, Android, programare

USB definește constantele definiții din linux / usb / ch9.h Linux kernel corespunzătoare.

În cele mai multe situații, trebuie să utilizați toate aceste clase (UsbRequest este necesară numai dacă pune în aplicare comunicarea asincronă), atunci când există o interacțiune cu unitatea dispozitiv USB. Tu de obicei, zadeystvuete UsbManager pentru a avea acces la UsbDevice necesare. Atunci când primiți un dispozitiv USB, pentru a comunica pentru a găsi o interfață și punct final UsbInterface UsbEndpoint adecvat pe această interfață. După ce ați primit punctul final corect, conexiunea UsbDeviceConnection deschisă pentru a comunica cu dispozitivul USB.

[Pentru a Cerințe Android Manifest]

Următoarea listă descrie ceea ce trebuie să adăugați în manifestul aplicației înainte de a începe lucrul cu API-ul gazdă USB:

• Pentru că nu toate dispozitivele Android sunt garantate pentru a sprijini API-ul gazdă USB, inclusiv elemente . care declară că cererea dumneavoastră utilizează android.hardware.usb.host.
• Setați nivelul minim de aplicare SDK pe nivel API 12 sau mai mare, deoarece API-ul gazdă USB nu sunt reprezentate în nivelurile API mai vechi.
• Dacă doriți ca aplicația să fie notificate cu privire la dispozitivele conectate la magistrala USB, selectați o pereche de elemente și pentru intenția android.hardware.usb.action.USB_DEVICE_ATTACHED în activitatea principală a aplicației. element Aceasta indică un fișier XML de resurse externe, care conține identificarea dispozitivului, informațiile de conectare pe care doriți să detecteze.

Fișier XML elemente de resurse prodeklariruyte pentru dispozitivele USB pe care doriți să le filtrați. Lista de mai jos descrie atributele . De obicei identificatori ai unui furnizor (furnizor ID, VID) și produs (ID produs, PID), dacă doriți să filtrați dispozitiv specific și clasă utilizat, subclasa și protocol, în cazul în care grupurile de filtrare dorite (clase) dispozitive USB, cum ar fi dispozitivele de stocare (stocare în masă dispozitive, MSD) sau aparat de fotografiat digital. Nu puteți specifica oricare dintre aceste atribute, în acest caz, filtrul este potrivit pentru orice dispozitiv USB, nu doar ceea ce ai nevoie. Aici numele de atribute pentru dispozitive USB:

furnizor-id
produs-id
clasă
subclasă
protocol (dispozitiv sau interfață)

Salvați resursele fișier XML în res / XML / director. nume de fișier de resurse (fără .xml extensie) trebuie să fie identice cu cele descrise în elementul . format XML fișier de resurse este prezentat în exemplul de mai jos (de exemplu, dintr-un fișier manifest și resursele necesare pentru a le):

În acest caz, fișierul de resurse vor fi salvate în fișierul res / XML / device_filter.xml (specificate aici, care trebuie să fie filtrate de către orice dispozitiv USB cu parametrii specificați):

Notă: în textul menționat aici ca valoarea VID (furnizor-id) și PID (produs-id) ar trebui să fie în hexazecimal și în zecimal. Astfel, dacă, de exemplu, aveți un VID = 0x16C0, PID = 0x05DF, atunci trebuie să convertiți valorile hexazecimale în zecimal, și în format text specificat în XML:

VID 0x16C0 -> 5824
PID 0x05DF -> 1503

Dacă doriți să cadă sub filtru, fără excepție, conectați dispozitivul USB, apoi pur și simplu eliminați atributele elementului USB dispozitiv:

[Cum de a lucra cu dispozitivele USB conectate la Android]

Atunci când un utilizator se conectează un dispozitiv USB la Android, sistemul Android poate identifica întrebarea dacă dispozitivul USB conectat pentru aplicația dumneavoastră. Dacă da, aveți posibilitatea să configurați un schimb cu dispozitivul, dacă este necesar. Pentru a face acest lucru, aplicația trebuie să îndeplinească:

1. Definirea dispozitivelor USB conectate, folosind filtre de intenție pentru a vă avertiza la situații când un utilizator se conectează un dispozitiv USB, sau prin enumerarea dispozitivelor USB care sunt deja conectate.
2. Cere utilizatorului permisiunea de a se conecta la un dispozitiv USB, în cazul în care nu a primit.
3. În plus, este posibil pentru a interacționa cu dispozitivul USB prin citirea și scrierea datelor prin punctele de capăt ale interfeței (puncte finale de interfață).

[Determinarea dacă dispozitivul USB conectat]

Cererea dumneavoastră poate recunoaște dispozitivul USB, sau prin utilizarea intenție-filtru, care va alerta utilizatorul pentru a conecta dispozitivele, sau prin enumerarea dispozitivelor USB care sunt deja conectate. Utilizarea de filtre de intenții este utilă dacă doriți să aveți în cerere posibilitatea de a detecta automat (conecta) dispozitivul dorit. Enumerarea dispozitivelor USB conectate este util dacă doriți să obțineți o listă a tuturor dispozitivelor conectate, sau în cazul în care aplicația nu filtrează pentru intenție.

Utilizarea filtrului intenție

Pentru o aplicație pentru a detecta un dispozitiv USB unic, puteți specifica filtrul de intenții, pentru a filtra intenția android.hardware.usb.action.USB_DEVICE_ATTACHED. În același filtru intenție Trebuie să specificați un fișier de resurse care definește proprietățile dispozitivului USB, cum ar fi VID și / sau PID. Atunci când utilizatorul se conectează dispozitivul care se potrivește cu starea dispozitivului de filtrare, sistemul prezintă o fereastră de dialog întreabă utilizatorul dacă vrea să ruleze programul. În cazul în care utilizatorul confirmă pornirea, cererea dumneavoastră va avea în mod automat dreptul de acces (permisiune) la aparat, până când dispozitivul este oprit.

Următorul exemplu arată cum să declare filtru de intenție:

Următorul exemplu arată cum să declare fișierul de resurse corespunzătoare, care indică faptul că sunteți interesat de un dispozitiv USB:

Cererea de activitate, puteți prelua UsbDevice obiect. care este dispozitivul USB conectat la intenția ca aceasta:

Dacă cererea dumneavoastră necesită inspectarea tuturor dispozitivelor USB care sunt deja conectate la momentul cererii, se poate produce enumera dispozitive pe magistrala USB. Utilizați metoda getDeviceList () pentru a prelua hărți ale tuturor dispozitivelor USB (hartă hash), care sunt conectate. Lista hash map are un nume de dispozitiv USB, pe care le puteți utiliza pentru a avea acces la aparat.

Dacă este necesar, puteți obține pur și simplu un iterator de pe hartă hash și tratează fiecare dispozitiv unul după altul:

[Pregătirea drepturilor pentru a interacționa cu dispozitivul USB]

Înainte de a începe partajarea cu dispozitivul USB, aplicația trebuie să ceară permisiunea de la utilizator.

Notă: În cazul în care aplicația utilizează filtrul intenție, în scopul de a recunoaște dispozitivul USB conectat, acesta primește permisiunea în mod automat în cazul în care utilizatorilor li se permite să proceseze intenția aplicației. Dacă nu, atunci trebuie să solicite în anexă în mod explicit permisiunea înainte de a conecta la dispozitiv.

O solicitare explicită de permisiune poate fi necesară în anumite situații, cum ar fi în cazul în care aplicația nu recenzată deja conectate dispozitive USB, și apoi vrea să comunice cu ei. Ar trebui să verificați dreptul de acces la dispozitiv înainte de a face o încercare de a comunica cu el. Dacă nu, veți primi o eroare de execuție (eroare de execuție), atunci când un utilizator care nu și-a dat permisiunea de a accesa dispozitivul.

Pentru a căuta în mod explicit permisiunea de a crea mai întâi un receptor de difuzare (receptor de difuzare). Acest receptor ascultă intenție, care primește de difuzare, atunci când apelați requestPermission (). Call requestPermission () afișează o fereastră de dialog pentru utilizator de a solicita permisiunea de a se conecta la dispozitivul USB. Următorul exemplu de cod arată cum să creați receptor de difuzare:

Pentru a înregistra un receptor de difuzare, adăugați onCreate () metoda activității dumneavoastră următorul cod:

Pentru a afișa un dialog solicită utilizatorului permisiunea de a se conecta la dispozitiv, apelați metoda requestPermission ():

Atunci când utilizatorul răspunde la această casetă de dialog, receptorul de difuzare va primi o intenție, care conține o extensie EXTRA_PERMISSION_GRANTED. Aceasta reprezintă esența răspunsului în binar. Verificați-l adevărat înainte de a vă conecta la dispozitiv.

[Schimb de un dispozitiv USB]

Schimb cu dispozitivul USB poate fi sincron sau asincron. În orice caz, aveți nevoie pentru a crea un nou fir care se va ocupa de toate mișcării de date, nu pentru a bloca firul UI pe așteptare (firul UI). Pentru a stabili în mod corespunzător schimbul cu dispozitivul, aveți nevoie pentru a obține obiectele corespunzătoare și dispozitivul UsbInterface UsbEndpoint cu care doriți să facă schimb, și să trimită aceste obiective folosind UsbDeviceConnection. În general, codul trebuie să faceți următoarele:

• Este necesar să se verifice atributele UsbDevice obiectului. cum ar fi ID-ul produsului (Product ID, PID), ID-ul distribuitorului (identificator de producător, VID), sau clasa de dispozitiv - pentru a determina dacă doriți să-l conectați cu dispozitivul USB.

• Atunci când o decizie pozitivă privind schimbul cu dispozitivul USB, localizați UsbInterface corespunzătoare (), pe care doriți să o utilizați (așa cum este definit în descriptorii USB al punctelor finale și conectarea acestora la interfața), pentru a face schimb cu o interfață UsbEndpoint adecvată.

Aproximativ Traducerea: interfața - este un fel de entitate logica care descrie metoda de interacțiune cu dispozitivul USB. o altă entitate logică, care întruchipează unele date amortizată în dispozitivul USB - și o interfață puncte finale atașat. Prezența unei anumite interfețe (este de obicei într-un dispozitiv USB, dar interfața poate fi mai multe), tipul acestuia, legarea de interfață obiective, tip obiective - toate acestea depinde de descriptorul dispozitivului USB (a se vedea [2].). Dispozitivele USB Descriptorii sunt citite în mod automat de către sistemul Android atunci când enumerarea și conectarea dispozitivelor USB.

Interfața poate aparține uneia sau mai multor punct final (endpoint). De obicei, există două puncte finale pentru comunicare bidirecțională - un punct final care operează pe intrarea de pe aparat (în punctul final), iar cealaltă să fie de ieșire în dispozitivul (OUT punctul final).

• Când ați găsit punctul final corect, UsbDeviceConnection deschis la acest punct final.

• Furnizarea de date pe care doriți să le transferați la punctul final bulkTransfer () metoda sau controlTransfer (). Tu trebuie să efectueze această operațiune de transmitere de date într-un alt fir care nu blochează firul principal al interfeței cu utilizatorul (UI fir principal). Pentru mai multe informații despre utilizarea în Android fire, a se vedea. [3].

Următoarea bucată de cod arată un mod banal de a pune în aplicare transferuri de date sincrone. Codul real de lucru ar trebui să conțină mai logică pentru a găsi interfața corectă și punctele finale la schimb, și, de asemenea, pentru a transmite date la un fir separat (astfel încât să nu blocheze firul principal UI, și că aplicația nu este inhibată vizual [4]):

Pentru a trimite date asincronă (fără întârziere), utilizați clasa UsbRequest pentru a inițializa coada pentru cererea asincronă și apoi așteptați pentru rezultatul prin apelarea requestWait ().

Pentru mai multe informații, consultați. Exemplul AdbTest. care arată cum se face transferul în vrac asincron și un exemplu MissleLauncher. care arată cum să asculte asincronă punct final de întrerupere.

[Încetarea comunicare cu dispozitiv USB]

După ce ați completat un schimb cu dispozitivul USB sau dispozitivul USB a fost deconectat, și aproape UsbInterface UsbDeviceConnection provocare releaseInterface () și aproape (). Pentru a asculta evenimentul care declanșează, de a crea un receptor de difuzare ca aceasta:

Crearea unui receptor de difuzare în anexă, nu în manifest, permite aplicației dvs. să ruleze în timp procesa numai evenimentul declanșator. Cu această metodă evenimentul de declanșare va fi trimis numai la aplicația pe care se execută în prezent, și nu toate aplicațiile.