Android usb Host

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();
                    }
                }
            }
        }
    };

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章