Android като домакин USB, андроид, програмиране

USB дефинира константи, съответстващи на определенията в Linux / USB / ch9.h Linux ядрото.

В повечето случаи, ще трябва да използвате всички тези класове (UsbRequest се изисква само ако изпълни асинхронна комуникация), когато има взаимодействие с устройството на USB устройство. Обикновено zadeystvuete UsbManager да получат достъп до необходимата UsbDevice. Когато получите USB устройство, да общуват, за да намерите подходящ интерфейс и крайна точка UsbInterface UsbEndpoint на този интерфейс. След като сте получили правилната крайна точка, с отворен UsbDeviceConnection за да се свързва с USB устройството.

[Да Android Явни изисквания]

Следващият списък описва това, което трябва да се добави в манифеста на приложението, преди да започнете работа с API фейса:

• Тъй като не всички Android устройства са гарантирани в подкрепа API фейса, включително елементи . с което декларира, че молбата Ви Ти използва android.hardware.usb.host.
• Задайте минималното ниво на SDK прилагане на API ниво 12 или по-висока, тъй като API фейса не са представени в по-старите нива на API.
• Ако искате вашата кандидатура да бъдете уведомявани за свързаните устройства към USB шината, изберете чифт елементи и за намерението android.hardware.usb.action.USB_DEVICE_ATTACHED в основната дейност на заявлението. елемент Той посочва към външен източник на XML файл, който съдържа идентификация на устройството, информация за връзка, който искате да се открие.

XML файл ресурсни елементи prodeklariruyte за USB устройства, които искате да филтрирате. Следващият списък описва атрибутите . Обикновено идентификатори на оператор (доставчик ID, VID) и продукт (продукт ID, PID), ако искате да се филтрират конкретно устройство и се използва клас, подклас и протокол, ако е желателно филтърни групи (класове) USB устройства като устройства за съхранение (маса съхранение устройства, MSD) или цифров фотоапарат. Не можете да определите някой от тези атрибути, в този случай, филтърът е подходящ за всяко USB устройство, а не само това, което ви трябва. Ето имената на атрибутите за USB устройства:

продавач-ID
продуктов номер
клас
подклас
протокол (устройство или интерфейс)

Запазване на ресурсите на XML-файлове в RES / XML / директория. име на файла ресурс (без .xml разширение) трябва да бъде същото, както е описано в точка . XML файлов формат ресурс е показано в примера по-долу (пример на файла на манифеста и съответните ресурси за нея):

В този случай, файлът с ресурс ще бъде записан в RES / XML / device_filter.xml файл (посочен тук, което трябва да се филтрира от всяко USB устройство с посочените параметри):

Забележка: в текста наричана тук стойността на VID (продавач-ID) и PID (продуктов номер) трябва да е в шестнадесетичен и десетични дроби. По този начин, ако например имате VID = 0x16C0, PID = 0x05DF, тогава трябва да конвертирате стойностите на шестнадесетични да е десетична и в текстов формат, определен в XML:

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

Ако искате да попадат в обхвата на филтъра, без изключение, свържете USB устройството, а след това просто да премахнете елемент USB-устройство атрибути:

[Как да се работи с USB устройства, свързани с Android]

Когато един потребител се свързва с USB устройство за Android, системата Android може да се идентифицира чудех дали свързано USB устройство за вашата кандидатура. Ако е така, можете да настроите обмен с устройството, ако е необходимо. За да направите това, приложението трябва да изпълни:

1. Определяне на свързани USB устройства, използвайки намерения филтри, за да ви предупреди за ситуации, когато даден потребител се свързва с USB устройство, или чрез изброяването на USB устройства, които вече са свързани.
2. да иска разрешение за употреба, за да се свържете към USB устройство, ако то не е получил.
3. Освен това е възможно да взаимодействат с USB устройството чрез четене и писане на данни чрез съответните крайни точки на интерфейса (интерфейс крайни точки).

[Определяне дали свързан USB устройство]

Вашата кандидатура може да разпознае USB устройство, или чрез използване на умисъл-филтър, който ще предупреждава потребителя за свързване на устройствата, или чрез изброяването на USB устройства, които вече са свързани. Използването на филтър за намерения е полезна, ако искате да имате в прилагането възможност за автоматично откриване (свързване) на желаното устройство. Преброяване на свързани USB устройства е полезна, ако искате да получите списък на всички свързани устройства, или ако вашата кандидатура не филтрира за намерение.

Използване намерение филтър

За заявление за откриване на някои единични USB устройство, можете да зададете филтър за намерения, за да филтрирате android.hardware.usb.action.USB_DEVICE_ATTACHED намерение. В същото намерение филтъра Трябва да посочите ресурс файл, който определя свойствата на USB устройство, като например VID и / или PID. Когато потребителят се свързва устройството, което съответства на състоянието на устройството филтър, системата представя диалогов пита потребителя дали иска да стартирате програмата. Ако потребителят потвърждава начало, приложението ви автоматично ще имат право на достъп (разрешение за достъп) на устройството, докато устройството е изключено.

Следният пример показва как да се декларира намерение филтър:

Следният пример показва как да обяви съответния файл ресурс, който показва, че вие ​​се интересувате от USB устройство:

Приложението за дейност, можете да извлечете обект UsbDevice. което е свързано USB устройство от намерението така:

Ако вашето приложение изисква проверка на всички USB устройства, които вече са свързани към момента на заявлението, то може да доведе до изброявам устройства на USB шината. Използвайте метод getDeviceList (), за да изтеглите карти на всички USB устройства (хеш карта), които вече са свързани. Списъкът с хашиш карта има имена на USB устройства, които можете да използвате, за да получат достъп до устройството.

Ако е необходимо, просто можете да получите итератор, от картата на хашиш и лечение на всяко устройство, един след друг:

[Получаване на права да взаимодействат с USB устройство]

Преди да можете да започнете да споделяте с USB устройство, приложението ви трябва да поиска разрешение от страна на потребителя.

Забележка: Ако вашето приложение използва филтър за намерения, за да се признае свързаното USB устройство, той автоматично получава разрешение, ако потребителите имат право да обработим кандидатурата Ви намерения. Ако не, тогава ще трябва да в приложението изрично да поиска разрешение преди да се свържете с устройството.

Може да е необходима изрична молба за разрешение в някои ситуации, като например дали приложението ви се Изброените вече е свързан с USB устройства, а след това иска да комуникира с тях. Трябва да се провери правото на достъп до устройството, преди да се направи опит да общува с него. Ако не го направите, ще получите грешка по време на работа (по време на работа грешка), когато потребителят не е дал разрешение за достъп до устройството.

За да изрично да поиска разрешение първо да създадете предавател (предавател). Този приемник е слушане намерение, което получава на предаването, когато се обадите requestPermission (). Обадете requestPermission () показва диалогов прозорец, потребителят да поиска разрешение да се свърже с USB устройството. Следният код пример показва как да създадете приемник на предаване:

За да се регистрирате предаването приемник добавете метода onCreate () на вашата дейност следния код:

За да се появи прозорец, подсказва на потребителя за разрешение да се свърже с устройството, обадете метод requestPermission ():

Когато потребителят отговаря на този диалогов прозорец, излъчването ви приемник ще получи намерение, което съдържа разширение EXTRA_PERMISSION_GRANTED. Тя представлява същността на отговора в двоичен. Проверете го, за да е вярно, преди да се свържете с устройството.

[Размяна на USB устройство]

Exchange с USB устройството може да бъде или синхронна или асинхронна. Във всеки случай, трябва да се създаде нова тема, която ще се справят с всички на движението на данните, да не блокира нишка UI на очакване (UI нишката) на. За да зададете правилно обмена с устройството, което трябва да получи съответните обекти и UsbInterface UsbEndpoint устройството, с което искате да се обменят, и да изпрати тези крайни точки, използвайки UsbDeviceConnection. Като цяло, кода си, трябва да направите следното:

• Необходимо е да се провери качествата на UsbDevice на обекта. като продукт ID (ID на продукта, PID) на, продавач ID (идентификатор на производителя, VID) или клас на устройството - за да се определи дали искате да го свържете с USB устройството.

• При положително решение на борсата с USB устройство, намерете подходящ UsbInterface (), който искате да използвате (както е определено в USB дескрипторите на крайните точки и свързването им с интерфейса) да се разменят с подходящ UsbEndpoint интерфейс.

Прибл. Превод: интерфейса - това е един вид логически субект, който описва метода на взаимодействие с USB устройството. И интерфейс прикрепен крайни точки - друго логично лице, което въплъщава някои буферирани данни в USB устройството. Наличието на конкретен интерфейс (обикновено е в USB устройство, но интерфейс може да бъде няколко), неговата тип, свързване към интерфейса крайни точки, крайни точки тип - всичко това зависи от Характеристиката на USB устройство (вж. [2]). Описания USB устройства автоматично се четат от системата Android, когато изброяване и свързване на USB устройства.

Интерфейс може да принадлежи към една или повече крайни точки (крайна точка). Обикновено има две крайни точки за двупосочна комуникация - една крайна точка, работещи на информация от устройството (IN крайна точка), а от друга да се възпроизвежда в устройството (OUT крайна точка).

• Когато сте намерили правилния крайната точка, с отворен UsbDeviceConnection към тази крайна точка.

• Предоставяне на данните, които искате да прехвърлите в крайната точка bulkTransfer () метод или controlTransfer (). Трябва да се извърши тази операция за предаване на данни в друга нишка, която не блокира основната нишка на потребителския интерфейс (UI основната нишка). За повече информация относно използването на конци в Android, вижте. [3].

В следния код показва тривиален начин за осъществяване на синхронни трансфер на данни. Вашият реална работна код трябва да съдържа повече логика да намерите правилния интерфейс и крайни точки за обмен, както и да предава данни към отделна нишка (така че да не блокират централния UI нишката, както и че приложението не е визуално инхибира [4]):

За изпращане на данни асинхронно (без забавяне), използвайте UsbRequest клас за инициализиране на опашката за асинхронна заявка и след това чакаме резултата, като се обадите requestWait ().

За повече информация, виж. Пример AdbTest. която показва как се прави асинхронен трансфер насипно състояние, и пример MissleLauncher. който показва как да слушате асинхронно прекъсване крайна точка.

[Прекратяване на комуникация с USB устройство]

Когато завършите размяна с USB устройство или USB устройство е изключен и в близост UsbInterface UsbDeviceConnection предизвикателство releaseInterface () и в близост (). За да слушате пусковото събитие, създайте приемник на предаване по този начин:

Създаване на предавател в приложението, а не в манифеста, позволява заявлението Ви за показване време обработва само пусковото събитие. С този метод пусковото събитие ще бъде изпратено само до приложението, което се изпълнява в момента, а не всички приложения.