Android USB開發麻煩還是比較多的。
第一種:host模式

這種模式比較不錯,由Android設備提供電源,然后與外部設備通信。舉個例子來說:電腦連接USB設備,都是這個模式,非常常見的模式。
但是有一個萬惡的問題,android接外部USB設備的時候,驅動怎么辦?又有那款芯片敢說Android系統支持他們家的芯片,又有哪個廠家說不動android系統裝上他們家的驅動,他們家的設備就可以在Android上使用,或許這點上Android很難超越windows。
造成想現狀:想加外部設備,都要:重新自己做底層驅動程序--->編譯系統--->刷機--->編寫android程序--->接入硬件實現功能。
整個一套下來飯都吃好幾頓了。還是希望以后android發展發展能向window一樣支持多設備驅動吧。
第二種:Accessory模式

這個模式比較揪心,外部設備要供給電源,數據間通信:電腦---手機就是這種模式,手機作為Accessory設備,電腦供給它電源,同時進行數據通信。
恰巧我也是用了這種模式:
程序需要做的:
(1)添加Action BoardCast
private static final String ACTION_USB_PERMISSION ="com.ukey.USB_PERMISSION";
/***********USB broadcast receiver*******************************************/ private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ACTION_USB_PERMISSION.equals(action)) { synchronized (this) { UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { Toast.makeText(global_context, "Allow USB Permission", Toast.LENGTH_SHORT).show(); OpenAccessory(accessory); }else{ Toast.makeText(global_context, "Deny USB Permission", Toast.LENGTH_SHORT).show(); } mPermissionRequestPending = false; } } else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)){ DestroyAccessory(true); }else{ Log.d("LED", "...."); } } };
android每次使用Accessory的時候都會詢問你是否允許設備訪問,這會點擊是或否的結果又(2)中代碼
啟動請求。
(4)openAccessory功能
public int OpenAccessory() { // Intent intent = getIntent(); if (inputstream != null && outputstream != null) { return 1; } UsbAccessory[] accessories = usbmanager.getAccessoryList(); if(accessories != null){ Toast.makeText(global_context, "Accessory Attached", Toast.LENGTH_SHORT).show(); }else{ // return 2 for accessory detached case return 2; } UsbAccessory accessory = (accessories == null ? null : accessories[0]); if (accessory != null) { if( -1 == accessory.toString().indexOf(ManufacturerString)){ Toast.makeText(global_context, "Manufacturer is not matched!", Toast.LENGTH_SHORT).show(); return 1; } if( -1 == accessory.toString().indexOf(ModelString1) && -1 == accessory.toString().indexOf(ModelString2)) { Toast.makeText(global_context, "Model is not matched!", Toast.LENGTH_SHORT).show(); return 1; }if( -1 == accessory.toString().indexOf(VersionString)) { Toast.makeText(global_context, "Version is not matched!", Toast.LENGTH_SHORT).show(); return 1; } Toast.makeText(global_context, "Manufacturer, Model & Version are matched!", Toast.LENGTH_SHORT).show(); if (usbmanager.hasPermission(accessory)) { OpenAccessory(accessory); }else{ synchronized (mUsbReceiver) { if (!mPermissionRequestPending) { Toast.makeText(global_context, "Request USB Permission", Toast.LENGTH_SHORT).show(); usbmanager.requestPermission(accessory,mPermissionIntent); mPermissionRequestPending = true; } } } } return 0; }
