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;
    }

Android的联通性---USB主机模式(二)

跟设备一起工作

当用户把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

}
时间: 2024-10-19 13:02:43

usbmanger android 底下USB的工作模式的相关文章

android里面的USB功能-----Accessory模式

USB Accessory 原文链接地址  http://developer.android.com/intl/zh-cn/guide/topics/connectivity/usb/accessory.html#manifest USB附件模式允许用户连接 USB主机硬件专门为android设备. 配件必须遵循 Android附属协议中列出 Android配件开发工具包文档. 这允许android设备仍不能作为USB主机与USB接口进行交互 硬件. 当一个Android设备在USB附件模式中,

IOS 与ANDROID框架及应用开发模式对比一

IOS 和ANDROID操作系统都是目前流行的移动操作系统,被移动终端和智能设备大量采用,两者都采用了先进的软件技术进行设计,为了方便应用开发两者都采用了先进的设计模式.两者在框架设计上都采用了什么技术?都采用了什么设计模式?两者设计思路和应用开发模式有什么异同呢? 两者都采用了框架模式. IOS 的框架称为Cocoa Touch. 框架提供两个作用,一是类的集合,每个类构建一个问题空间,并提供完整的解决方案和服务:二更重要的是框架中的类相互依赖构成一个整体,制订并实现整个应用程序的结构.框架定

【嵌入式开发】ARM 芯片简介 (ARM芯片类型 | ARM处理器工作模式 | ARM 寄存器 | ARM 寻址)

作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42375701 相关资源下载 :  -- 三星 ARM Architecture Reference Manual 文档 : http://download.csdn.net/detail/han1202012/8324641 一. ARM 芯片类型 1. ARM 分类 (1) ARM 分类类型(芯片 | 核 | 指令架构) ARM 分类 : -- ARM 芯片类型

LVS原理详解(3种工作模式及8种调度算法)

2017年1月12日, 星期四 LVS原理详解(3种工作模式及8种调度算法) LVS原理详解及部署之二:LVS原理详解(3种工作方式8种调度算法) 作者:woshiliwentong  发布日期:2014-01-06 09:31:20 一.集群简介 什么是集群 计算机集群简称集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台计算机.集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式.集

CAP脚电容调节灵敏度/I2C接口设置工作模式---永嘉高抗干扰VK38系列

产品品牌:VINTEK/元泰/VINKA -- ?原厂直销,样品免费,技术支持,大量现货!产品型号:VK3809IP 封装形式:SOP16贴片 产品年份:新年份 原厂直销触摸触控感应芯片,多种形式选择更专业,原装正品保障,价格更具优势!概述VK3809IP 是一款9感应通道高抗干扰的触摸IC,工作电压:2.5V-5.5V,工作电流:1.1MA-3V,IIC/INT通讯口.可设置为9个独立按键或者最多3组滑条,可通过IIC设置工作模式和参数,可以通过CAP脚电容调节灵敏度.封装是SOP16.应用于

LVS负载均衡(LVS简介、三种工作模式、、调度原理以及十种调度算法)

LVS简介 LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中.该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然

分析Android中View的工作流程

在分析View的工作流程时,需要先分析一个很重要的类,MeasureSpec.这个类在View的测量(Measure)过程中会用到. MeasureSpec MeasureSpec是View的静态内部类,可以理解为是一种测量规格,是一个32位int值,高2位代表SpecMode,低30位代表SpecSize,SpecMode是指测量模式,而SpecSize是指在某种测量模式下的规格大小.SpecMode有三种模式,分别为: UNSPECIFIED:父容器不对View做限制 EXACTLY:父容器

apache 工作模式

我主要来说一下prefork和worker工作模式.      prefork的工作原理 如果不用"--with-mpm"显式指定 某种MPM,prefork就是Unix平台上缺省的MPM.它所采用的预派生子进程方式也是Apache1.3中采用的模式.prefork本身并没有 使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为 最稳定的MPM之一. prefork的工作原理是,控制进程在最 初

ARM处理器工作模式

++++++++++++++++++++++++++++++++++++++++++ 本文转载自mr_raptor的专栏,感谢mr_raptor大神. http://blog.csdn.net/mr_raptor/article/details/6556157 ++++++++++++++++++++++++++++++++++++++++++ 1.1 ARM处理器工作模式 CPU的模式可以简单的理解为当前CPU的工作状态,比如:当前操作系统正在执行用户程序,那么当前CPU工作在用户模式,这时网