usb-host与外设通信(二)

本文是接着上一篇的的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 意图,它表示答复的布尔值。连接设备之前检查该值是否为真。



posted @ 2014-08-23 08:53  tomi_mint  阅读(622)  评论(0编辑  收藏  举报