关于安卓(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();

	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值