本文是接着上一篇的的usb-host与外设通信(一)接着写的
3.枚举设备
当你的程序运行时,如果应用程序对当前连接的USB设备都感兴趣的,程序可以枚举所以当前的设备。使用getDeviceList()方法去获得包含当前所有连接设备的hash map对象,如果你想要从map中获得一个设备,那么得到的hash map是USB设备名称键控的。(英文水平差,原文是: The hash map is keyed by the USB device's name if you want to obtain a device from the map.)
<span style="font-family:Hiragino Sans GB, Microsoft YaHei, 微软雅黑;color:#666666;">UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);//获得一个UsbManager对象 ... HashMap<String, UsbDevice> deviceList = manager.getDeviceList(); UsbDevice device = deviceList.get("deviceName");</span>
如果需要的话,你也可以从hash map中获得一个迭代器来处理每一个设备,比如下面的代码:
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); ... HashMap<String, UsbDevice> deviceList = manager.getDeviceList(); Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); while(deviceIterator.hasNext()){ UsbDevice device = deviceIterator.next() //你的代码 }4.获取权限与设备进行通信
在与USB设备通信之前,你的程序必须从用户那里获取权限
注:如果你的程序时用意图过滤器发现USB设备的(当他们连接时),程序可以自动的获取权限,前提是用户容许程序处理意图。如果不是,连接设备前你必须在你的程序中显示要求获取权限。
在一些情况下显示要求获取权限可能是必须的,比如:你的程序已经枚举当前已连接的USB设备并且你想要和他们中的一个进行 通信。在试着与设备进行通信之前,你必须检查是否有连接设备的权限(有点废话了)。如果不这样或者用户拒绝提供权限,你会获得一个run time错误。
为了显示获取权限。需要创建一个广播接收器(broadcastcast receiver),当你调用requestPermission()方法时,这个receive监听广播获取到的意图。调用requestPermission()会显示一个对话框(dialog)给用户要求需要权限连接该设备,样例代码如下:
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";//定义常量 private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ACTION_USB_PERMISSION.equals(action)) { synchronized (this) { UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { if(device != null){ //call method to set up device communication } } else { Log.d(TAG, "permission denied for device " + device); } } } } };为了注册广播接收器,需要在你的Activity中onCreate()方法中添加如下代码:
UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; ... mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); registerReceiver(mUsbReceiver, filter);为了显示连接设备需要用户权限的对话框,需要调用
requestPermission()方法:
UsbDevice device; ... mUsbManager.requestPermission(device, mPermissionIntent);当用户答复对话框中的选项,广播接收器就会接收包含额外的
EXTRA_PERMISSION_GRANTED
意图,它表示答复的布尔值。连接设备之前检查该值是否为真。