Android設備支持otg功能,把Android手機當成Host通過otg轉接線連接usb設備(u盤,usb轉串口設備)
Android Host模式在Android3.1以上就直接支持了
1.Android系統端
1)確定內核驅動是否支持usb host
查看system/lib/目錄下是否有libusbhost.so
system/lib/libusbhost.so
2)配置文件
是否有配置文件
$ cat /system/etc/permissions/android.hardware.usb.host.xml
<permissions>
<feature name="android.hardware.usb.host" />
</permissions>
$ cat android.hardware.usb.accessory.xml
<permissions>
<feature name="android.hardware.usb.accessory" />
<library name="com.android.future.usb.accessory"
file="/system/framework/com.android.future.usb.accessory.jar" />
</permissions>
在/system/etc/permissions下的handheld_core_hardware.xml或者tablet_core_hardware.xml文件的段中添加
<permissions>
<feature name="android.hardware.usb.host" />
</permissions>
2.Android 應用端
添加 標籤申明應用將使用 android.hardware.usb.host特性
<uses-feature android:name="android.hardware.usb.host" />
在<activity中增加android.hardware.usb.action.USB_DEVICE_ATTACHED
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
</activity>
device_filter只是一個過濾設備的文件,裏面有usb id號,當有相應id的設備設別到應用就會彈出
檢測到usb設備
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 0x0403 / 0x6001: FTDI FT232R UART -->
<usb-device vendor-id="1027" product-id="24577" />
<!-- 0x0403 / 0x6015: FTDI FT231X -->
<usb-device vendor-id="1027" product-id="24597" />
<!-- 0x10C4 / 0xEA60: CP210x UART Bridge -->
<usb-device vendor-id="4292" product-id="60000" />
</resources>
2)應用程序申請權限
當識別到usb從設備後,apk會彈出”xx應用訪問usb設備”這裏一定要選擇
接收,進行授權處理,如果不接受不能進行usb通信,需要在代碼中進行申請
private static final String ACTION_USB_PERMISSION = "com.bshui.androidserial.USB_PERMISSION";
private PendingIntent mPermissionIntent;
mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
//註冊USB設備權限管理廣播
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(usbReceiver, filter);
private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_USB_PERMISSION.equals(action)) {
synchronized (this) {
UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
if (device != null) {
}
} else {
showTmsg("用戶不允許USB訪問設備,程序退出!");
finish();
}
}
}
}
};