zoukankan      html  css  js  c++  java
  • usbmanger android 底下USB的工作模式

    Android USB开发麻烦还是比较多的。

    第一种:host模式

    这种模式比较不错,由Android设备提供电源,然后与外部设备通信。举个例子来说:电脑连接USB设备,都是这个模式,非常常见的模式。

    但是有一个万恶的问题,android接外部USB设备的时候,驱动怎么办?又有那款芯片敢说Android系统支持他们家的芯片,又有哪个厂家说不动android系统装上他们家的驱动,他们家的设备就可以在Android上使用,或许这点上Android很难超越windows。

    造成想现状:想加外部设备,都要:重新自己做底层驱动程序--->编译系统--->刷机--->编写android程序--->接入硬件实现功能。

    整个一套下来饭都吃好几顿了。还是希望以后android发展发展能向window一样支持多设备驱动吧。

    第二种:Accessory模式

    这个模式比较揪心,外部设备要供给电源,数据间通信:电脑---手机就是这种模式,手机作为Accessory设备,电脑供给它电源,同时进行数据通信。

    恰巧我也是用了这种模式:

    程序需要做的:

    (1)添加Action BoardCast

    private static final String ACTION_USB_PERMISSION ="com.ukey.USB_PERMISSION";

    [java]
            /***********************USB handling******************************************/
            usbmanager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
            mPermissionIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0);
            IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
            
            filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);        
            context.registerReceiver(mUsbReceiver, filter);
            inputstream = null;
            outputstream = null;
    (2)编写对应的boradCaset信息
        /***********USB broadcast receiver*******************************************/
        private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() 
        {
            @Override
            public void onReceive(Context context, Intent intent) 
            {
                String action = intent.getAction();
                if (ACTION_USB_PERMISSION.equals(action)) 
                {
                    synchronized (this)
                    {
                        UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
                        if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false))
                        {
                            Toast.makeText(global_context, "Allow USB Permission", Toast.LENGTH_SHORT).show();
                            OpenAccessory(accessory);    
                            
                        }else{
                            Toast.makeText(global_context, "Deny USB Permission", Toast.LENGTH_SHORT).show();
                        }
                        mPermissionRequestPending = false;
                    }
                } 
                else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)){
                    DestroyAccessory(true);
                }else{
                    Log.d("LED", "....");
                }
            }
        };
     
    (3)又来一个比较麻烦的事

    android每次使用Accessory的时候都会询问你是否允许设备访问,这会点击是或否的结果又(2)中代码

    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false))

    启动请求。

    (4)openAccessory功能

        public int OpenAccessory()
        {
            // Intent intent = getIntent();
            if (inputstream != null && outputstream != null) {
                return 1;
            }
            UsbAccessory[] accessories = usbmanager.getAccessoryList();
            if(accessories != null){
                Toast.makeText(global_context, "Accessory Attached", Toast.LENGTH_SHORT).show();
            }else{
                // return 2 for accessory detached case
                return 2;
            }
            UsbAccessory accessory = (accessories == null ? null : accessories[0]);
            if (accessory != null) {
                if( -1 == accessory.toString().indexOf(ManufacturerString)){
                    Toast.makeText(global_context, "Manufacturer is not matched!", Toast.LENGTH_SHORT).show();
                    return 1;
                }
                if( -1 == accessory.toString().indexOf(ModelString1) && -1 == accessory.toString().indexOf(ModelString2))
                {
                    Toast.makeText(global_context, "Model is not matched!", Toast.LENGTH_SHORT).show();
                    return 1;
                }if( -1 == accessory.toString().indexOf(VersionString))
                {
                    Toast.makeText(global_context, "Version is not matched!", Toast.LENGTH_SHORT).show();
                    return 1;
                }
                Toast.makeText(global_context, "Manufacturer, Model & Version are matched!", Toast.LENGTH_SHORT).show();
                if (usbmanager.hasPermission(accessory)) {
                    OpenAccessory(accessory);
                }else{
                    synchronized (mUsbReceiver) {
                        if (!mPermissionRequestPending) {
                            Toast.makeText(global_context, "Request USB Permission", Toast.LENGTH_SHORT).show();
                            usbmanager.requestPermission(accessory,mPermissionIntent);
                            mPermissionRequestPending = true;
                        }
                    }
                }
            }
            return 0;
        }

    跟设备一起工作

    当用户把USB设备接入到Android设备上时,Android系统能够判断你的应用程序是否对接入的设备感兴趣。如果是你的应用程序感兴趣的设备,你就可以跟你期望的设备建立通信。以下是你的应用程序必须要做的工作:

    1.使用以下两种方法之一来发现接入的UDB设备:

    A.使用Intent过滤器,过滤用户接入USB设备时所发出的通知;

    B.列举已经接入的USB设备。

    2.如果没获取接入USB设备的权限,会向用户请求接入USB设备的权限。

    3.通过读写对应接口端点上的数据来跟USB设备通信。

    发现设备

    用户既可以通过使用用户接入USB设备时所发出Intent过滤通知,也可以通过列举已经接入的USB设备,来发现USB设备。如果你希望你的应用程序能够自动的检测到你所期望的USB设备,那么要使用Intent过滤器。如果你想要过的接入的所有的已经接入的设备列表,或者是你的应用程序没有过滤对应的Intent对象,那么要使用列举的方法。

    使用Intent过滤器

    为了让你的应用程序发现一个特殊的USB设备,你可以指定一个android.hardware.usb.action.USB_DEVICE_ATTACHED类型的Intent过滤器。跟这个Intent过滤器一起,你还需要指定一个指定了USB设备属性的资源文件,如果产品和供应商ID。当用户接入的设备跟你的设备过滤器匹配的时候,系统会显示一个对话框,询问你是否允许它们启动你的应用程序。如果用户接收,应用程序会自动的被授予访问设备的权限,一直到设备断开连接。

    以下示例演示了如何声明Intent过滤器:

    <activity ...>
    
    ...
    
    <intent-filter>
    
    <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
    
    </intent-filter>
    
     
    
    <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
    
    android:resource="@xml/device_filter" />
    
    </activity>

    以下示例演示了如何声明对应的你感兴趣的USB设备的资源文件:

    <?xml version="1.0" encoding="utf-8"?>
    
     
    
    <resources>
    
    <usb-device vendor-id="1234" product-id="5678" />
    
    </resources>

    在你的Activity中,按照如下的方法,你可以从Intent对象中获得一个代表接入的设备的UsbDevice对象:

    UsbDevice device=(UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

    列举设备

    当你的应用程序要在运行时检测当前接入的所有的USB设备时,它可以列举总线上的设备。使用getDeviceList()方法来获取已经接入的所有的USB设备的hash map。该hash map使用USB设备的名称做key:

    UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
    
    ...
    
    HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
    
    UsbDevice device = deviceList.get("deviceName");

    如果你愿意,也可以使用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()
    
    //your code
    
    }

    跟设备一起工作

    当用户把USB设备接入到Android设备上时,Android系统能够判断你的应用程序是否对接入的设备感兴趣。如果是你的应用程序感兴趣的设备,你就可以跟你期望的设备建立通信。以下是你的应用程序必须要做的工作:

    1.使用以下两种方法之一来发现接入的UDB设备:

    A.使用Intent过滤器,过滤用户接入USB设备时所发出的通知;

    B.列举已经接入的USB设备。

    2.如果没获取接入USB设备的权限,会向用户请求接入USB设备的权限。

    3.通过读写对应接口端点上的数据来跟USB设备通信。

    发现设备

    用户既可以通过使用用户接入USB设备时所发出Intent过滤通知,也可以通过列举已经接入的USB设备,来发现USB设备。如果你希望你的应用程序能够自动的检测到你所期望的USB设备,那么要使用Intent过滤器。如果你想要过的接入的所有的已经接入的设备列表,或者是你的应用程序没有过滤对应的Intent对象,那么要使用列举的方法。

    使用Intent过滤器

    为了让你的应用程序发现一个特殊的USB设备,你可以指定一个android.hardware.usb.action.USB_DEVICE_ATTACHED类型的Intent过滤器。跟这个Intent过滤器一起,你还需要指定一个指定了USB设备属性的资源文件,如果产品和供应商ID。当用户接入的设备跟你的设备过滤器匹配的时候,系统会显示一个对话框,询问你是否允许它们启动你的应用程序。如果用户接收,应用程序会自动的被授予访问设备的权限,一直到设备断开连接。

    以下示例演示了如何声明Intent过滤器:

    <activity ...>
    
    ...
    
    <intent-filter>
    
    <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
    
    </intent-filter>
    
     
    
    <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
    
    android:resource="@xml/device_filter" />
    
    </activity>
    
     

    以下示例演示了如何声明对应的你感兴趣的USB设备的资源文件:

    <?xml version="1.0" encoding="utf-8"?>
    
     
    
    <resources>
    
    <usb-device vendor-id="1234" product-id="5678" />
    
    </resources>

    在你的Activity中,按照如下的方法,你可以从Intent对象中获得一个代表接入的设备的UsbDevice对象:

    UsbDevice device=(UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

    列举设备

    当你的应用程序要在运行时检测当前接入的所有的USB设备时,它可以列举总线上的设备。使用getDeviceList()方法来获取已经接入的所有的USB设备的hash map。该hash map使用USB设备的名称做key:

    UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
    
    ...
    
    HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
    
    UsbDevice device = deviceList.get("deviceName");

    如果你愿意,也可以使用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()
    
    //your code
    
    }
  • 相关阅读:
    Java基础-3y
    对线面试官面试系列-3y
    从零单排学Redis【青铜】
    mock官方文档
    route路由组件传递参数
    axios拦截器与vue代理设置
    Sass使用方法
    Less使用方法
    Vue-cli
    Vue-组件注册
  • 原文地址:https://www.cnblogs.com/Anita9002/p/5684231.html
Copyright © 2011-2022 走看看