关于安卓(Android)手机,安卓(Android)平板电脑,是否支持USB主机(USB Host)功能

关于安卓(Android)手机,安卓(Android)平板电脑,是否支持USB主机(USB Host)功能

背景

1:公司开发一个项目要读取U盘数据。

2:首先搞清楚,什么样的android设备才能读取U盘。

3:能读取U盘数据的android设备必须支持usb host(即android设备为主机)也就是俗话说的otg功能。

总结安卓Android手机能够使用USB Host的必备条件

官网的解释更清楚:

USB Host and Accessory

参考之前别人的解释,和后来看到的官网的解释,总结如下:

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的打印机,把照片传输到打印机上,打印出来 软件

Android系统,必须是Android 3.1(API Level 12)本身手机常见给你预装的Android系统,本身是有对应的USB(OTG)的驱动 4:经项目结束后得到的经验可知,电视盒子(例如小米,百度,开博尔),智能电视肯定都支持。

手机价格在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();

}

}

相关推荐

如何摆脱心魔掌控,过上自由人生?
det365娱乐场

如何摆脱心魔掌控,过上自由人生?

📅 07-20 👁️ 8499
材料科学SCI期刊推荐:CARBON
best365登陆

材料科学SCI期刊推荐:CARBON

📅 07-09 👁️ 6725
哔哩哔哩缓存在哪个文件夹-哔哩哔哩缓存的视频位置介绍