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



  • 相关阅读:
    箭头函数和普通函数的区别是什么?
    前端如何优化网站性能?
    instanceof原理
    call、apply区别
    函数的节流和防抖
    关于this的指向性问题
    undefined 和null的区别?
    浅谈堆和栈的理解?
    关于vue中watch和computed
    简单说一下什么是回流和重绘
  • 原文地址:https://www.cnblogs.com/sowhat4999/p/4439876.html
Copyright © 2020-2023  润新知