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