Общие принципы получения доступа к устройствам 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".
На фото показан внешний вид такого переходника, который на ebay, dealextreme или aliexpress продается по цене порядка 2 долларов, или даже дешевле. Конечно, его можно купить также на рынке или в магазине, но несколько дороже. Дешевизна переходника легко объяснима - у него внутри ничего, кроме проводов, нет [2]. На переходнике с одной стороны имеется штеккер microUSB, который втыкается в Android, а на другой стороне стандартное гнездо USB type A, куда можно воткнуть любой шнур USB.
Примеры программ 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).
[Ссылки]
1. Android как хост USB. 2. Как сделать для смартфона Android кабель microUSB OTG. 3. 140419android-USB-devices-access.zip - проекты Eclipse с примерами управления макетной платой AVR-USB-MEGA16 из Android, проект устройства USB HID с исходными кодами и готовыми прошивками. 4. Eclipse, Android Studio: FAQ, устранение ошибок. |
Комментарии
microsin: скачайте пожалуйста архив по ссылке [3].
С фильтрацией игрался, в итоге оставил в таком виде: . Может у кого есть мысли, в чем проблема?
microsin: скорее всего проблема с текущей версией прошивки Android. Хост USB на нем поддерживает только класс USB MSD. Установите с Google Play программу проверки функций хоста Android (прогуглите Android USB host test), и проверьте на ней работу разных устройств USB.
RSS лента комментариев этой записи