背景
1:公司開發一個項目要讀取U盤數據。
2:首先搞清楚,什麼樣的android設備才能讀取U盤。
3:能讀取U盤數據的android設備必須支持usb host(即android設備爲主機)也就是俗話說的otg功能。
總結安卓Android手機能夠使用USB Host的必備條件
參考之前別人的解釋,和後來看到的官網的解釋,總結如下:
Android中,USB方面,分兩種模式:
- USB accessory== USB Device == Android手機作爲一個Device設備
- 把手機連到電腦上,電腦就是Host,手機就是Device,手機就是類似於U盤,可以從主機電腦中操作U盤,拷貝U盤資料了
- 此種模式,可以說所有手機都支持,就像都可以當做一個U盤接到電腦上一樣
- USB host == Android手機作爲一個Host主機
- Android手機就是主控制器,可以外接/外掛,USB鼠標,USB鍵盤,U盤,USB攝像頭,遊戲手柄等被控制的設備
- 此種USB Host模式,需要軟硬件都支持才能工作:
- 硬件:確保手機本身的USB模塊是OTG的,即USB的硬件是那種,既可以被配置爲Device的,也可以被配置爲Host的
- 與此相對應的是,有些USB的硬件模塊,是固定的USB Device,或者是USB Host
- 比如普通的U盤中的USB模塊,就是固定的USB Device
- 比如你把U盤接到電腦上的那個USB接口,就是主板上的USB Host的接口,可以掛載你的U盤
- 與此類似的是,有些數碼相機,就是USB OTG的
- 即可以當做U盤接到電腦上,電腦上就可以把相機裏面照片拷貝出來了
- 也可以當做USB 主機,連接USB的打印機,把照片傳輸到打印機上,打印出來
- 與此相對應的是,有些USB的硬件模塊,是固定的USB Device,或者是USB Host
- 軟件
- Android系統,必須是Android 3.1(API Level 12)
- 本身手機常見給你預裝的Android系統,本身是有對應的USB(OTG)的驅動
- 硬件:確保手機本身的USB模塊是OTG的,即USB的硬件是那種,既可以被配置爲Device的,也可以被配置爲Host的
手機價格在2000元以上的絕大部分都支持(因爲這些手機不會節約成本把那個芯片去掉)。平板電腦(三星,小米可以。)
5:安卓(Android)支持otg功能設備列表圖
6:既然是搞開發的,先提供一段android代碼用來測試,該設備是否支持otg
a,運行該程序到手機
b,關閉程序,插上U盤,打開程序,看Toast中的vid是否爲空,不爲空則支持。
@SuppressLint("NewApi")
public class MainActivity extends Activity {
private static UsbManager mUsbManager;
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mUsbManager = (UsbManager) this.getSystemService(this.USB_SERVICE);
setContentView(R.layout.activity_main);
openUsbDevice(MainActivity.this);
}
/**
* 初始化獲取U盤信息
*/
public void openUsbDevice(Context context) {
this.context = context;
// 打開U盤的device前必須申請權限
tryGetUsbPermission();
}
/**
* 獲得讀取U盤設備信息權限。
*/
private void tryGetUsbPermission() {
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
context.registerReceiver(mUsbPermissionActionReceiver, filter);
PendingIntent mPermissionIntent = PendingIntent.getBroadcast(context,
0, new Intent(ACTION_USB_PERMISSION), 0);
Toast.makeText(context, "U盤設備個數" + mUsbManager.getDeviceList().size(),
Toast.LENGTH_SHORT).show();
for (final UsbDevice usbDevice : mUsbManager.getDeviceList().values()) {
if (mUsbManager.hasPermission(usbDevice)) {
Toast.makeText(context, "得到授權", Toast.LENGTH_SHORT).show();
UsbDeviceConnection connection = mUsbManager
.openDevice(usbDevice);
String upanidString = connection.getSerial();
if (null != upanidString && upanidString.length() > 4) {
// 得到權限
afterGetUsbPermission(usbDevice);
}
} else {
// 是否勾選所有usb設備都用這個app打開
mUsbManager.requestPermission(usbDevice, mPermissionIntent);
}
}
}
/**
* 監聽我的U盤插入廣播
*/
private final BroadcastReceiver mUsbPermissionActionReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_USB_PERMISSION.equals(action)) {
synchronized (this) {
UsbDevice usbDevice = (UsbDevice) intent
.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (intent.getBooleanExtra(
UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
if (null != usbDevice) {
afterGetUsbPermission(usbDevice);
}
} else {
Toast.makeText(context, String.valueOf("沒有得到授權!"),
Toast.LENGTH_LONG).show();
}
}
}
}
};
/**
* 得到U盤信息,並存儲
*/
private void afterGetUsbPermission(UsbDevice usbDevice) {
Log.v("ceshi", "++" + usbDevice.getVendorId());
Log.v("ceshi", "--" + usbDevice.getProductId());
UsbDeviceConnection connection = mUsbManager.openDevice(usbDevice);
Toast.makeText(context,
"" + "USB_VID爲:" + "\t" + usbDevice.getVendorId(),
Toast.LENGTH_SHORT).show();
}
}