Получение списка устройств USB из Android Печать
Добавил(а) microsin   

Общие принципы получения доступа к устройствам USB на платформе Android описаны в документации API [1]. В этой статье будет на практическом примере показано, как программно получить список подключенных устройств USB.

Для того, чтобы можно было физически подключить к Android устройство USB (флешку, клавиатуру, мышку, или любое другое устройство USB HID или USB CDC) нужно иметь как минимум 2 вещи:

1. Современное устройство Android, у которого операционная система не старее Android 3.1.x (API Level 12 или выше). Более старые системы не поддерживают режим хоста USB, т. е. они принципиально не способны опознавать USB-устройства.
2. Переходник "Android OTG micro usb cable".

Android-OTG-cable-black Android-OTG-cable-white

На фото показан внешний вид такого переходника, который на ebay, dealextreme или aliexpress продается по цене порядка 2 долларов, или даже дешевле. Конечно, его можно купить также на рынке или в магазине, но несколько дороже. Дешевизна переходника легко объяснима - у него внутри ничего, кроме проводов, нет [2]. На переходнике с одной стороны имеется штеккер microUSB, который втыкается в Android, а на другой стороне стандартное гнездо USB type A, куда можно воткнуть любой шнур USB.

Android-Findusbdev-connect-USB-MSD-Transcend-64Gb Android-Findusbdev-connect-AVR-USB-MEGA16

Примеры программ Android, описанных в этой статье, можно скачать в архиве [3]. Программы были написаны в среде Eclipse, и испытывались на смартфоне Samsung Galaxy Note GT-N7000, версия Android 4.1.2 (API Level 16).

[Как программно узнать, какие USB-устройства подключены к устройству Android]

Для начала разберем, как получить список USB-устройств, подключенных к Android.

1. Создайте в Eclipse проект приложения Android при помощи стандартного мастера. На этом шаге выберите минимальную версию целевого SDK API 12. Target SDK и Compile With можете выставить по максимуму, на самую последнюю поддерживаемую версию Android. Так же задайте, как обычно, имя приложения, имя проекта и имя пакета.

2. Бросьте на форму приложения кнопку и виджет TextView. Кнопку будем использовать для запуска опроса устройств, а TextView для вывода информации. Создайте для них глобальные переменные в теле класса, и в обработчике onCreate сделайте привязку этих переменных к соответствующим ресурсам. Добавьте также глобальную переменную типа UsbManager:

public class MainActivity extends Activity
{
   TextView console;
   Button btn;
   UsbManager mUsbManager;
   @Override
   protected void onCreate(Bundle savedInstanceState)
   {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      console = (TextView)findViewById(R.id.txtconsole);
      console.setText("");
      console.setMovementMethod(new ScrollingMovementMethod());
      btn = (Button)findViewById(R.id.button1);
   }
   
   ...

Для вывода в TextView создайте процедуру clog, принимающую строку. Для упрощения код процедуры не привожу, подробнее, как делать вывод в текстовый лог, можете посмотреть в FAQ [4], или загрузите готовый код в виде проекта Eclipse [3].

private void clog(String text);

3. Добавьте в манифест приложения секцию uses-feature android:name="android.hardware.usb.host". Вот пример файла манифеста:

< ?xml version="1.0" encoding="utf-8"? >
< manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.findusbdev"
    android:versionCode="1"
    android:versionName="1.0" >
< uses-feature android:name="android.hardware.usb.host" /> < uses-sdk android:minSdkVersion="12" android:targetSdkVersion="19" />
< application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > < activity android:name="com.findusbdev.MainActivity" android:label="@string/app_name" > < intent-filter > < action android:name="android.intent.action.MAIN" /> < category android:name="android.intent.category.LAUNCHER" /> < /intent-filter > < /activity > < /application > < /manifest >

4. Создайте обработчик клика на кнопке:

   public void btnClick(View v)
   {
      UsbDevice device;
      boolean nodevices = true;
mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE); HashMap <String, UsbDevice> deviceList = mUsbManager.getDeviceList(); Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); while(deviceIterator.hasNext()) { nodevices = false; device = deviceIterator.next(); clog("getDeviceName: " + device.getDeviceName()); clog("toString: " + device.toString()); } if (nodevices) { clog("Устройства USB не найдены"); } }

Программа готова. Вот пример её вывода, когда ничего не подключено, когда подключена флешка и когда подключено устройство USB HID (макетная плата AVR-USB-MEGA16).

Android-Findusbdev-no-USB-devices Android-Findusbdev-USB-MSD-Transcend-64GB-info Android-Findusbdev-USB-HID-AVR-USB-MEGA16-info

[Ссылки]

1. Android как хост USB.
2. Как сделать для смартфона Android кабель microUSB OTG.
3140419android-USB-devices-access.zip - проекты Eclipse с примерами управления макетной платой AVR-USB-MEGA16 из Android, проект устройства USB HID с исходными кодами и готовыми прошивками.
4. Eclipse, Android Studio: FAQ, устранение ошибок.