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附件模式中,附加的Android USB 附件作为主机,提供了USB总线,并列举了连接设备。 Android 3.1(API级别12)支持USB附件模式和特性也是补丁 安卓2.3.4(API级别10)能够支持更广泛的设备。

    选择正确的USB配件api



    虽然介绍了USB配件api在Android 3.1平台,他们还 可以在安卓2.3.4使用Google api插件库。 因为这些api 补丁使用外部库,有两个包,您可以导入支持USB 附件模式。 取决于安卓设备你想支持,你可能需要 使用一种:

    • com.android.future.usb :在安卓2.3.4,支持USB附件模式 谷歌api的插件
      图书馆
      包括补丁USB配件api和它们包含在这 名称空间。 Android 3.1还支持导入和调用的类在这个名称空间 支持插件库编写的应用程序。 这个附加组件库是一个瘦包装器 在android.hardware.usb附件的api和不支持USB主机模式。
      如果 你想支持广泛的设备支持USB附件模式,使用插件 图书馆和导入这个包。 重要的是要注意,并非所有的安卓2.3.4设备 需要支持USB附件功能。 每个设备制造商决定 是否支持这一功能,这就是为什么你必须声明你的清单 文件。
    • android.hardware.usb:该命名空间包含的类支持USB
      附件模式在Android 3.1。 这个包包含作为框架api的一部分,所以 Android 3.1支持USB附件模式不使用一个附加的库。 使用这个包 如果你只关心Android 3.1或更新的硬件支持USB设备 辅助模式,您可以声明你的清单文件。

    安装谷歌api的插件库

    如果你想要安装附加组件,可以通过安装Google API Android API 10 与SDK包管理器。 看到 安装谷歌api
    附加组件
    有关安装附加组件库的更多信息。

    API概述



    因为框架api的插件库是一个包装器,支持的类 USB附件功能是相似的。 您可以使用的参考文档android.hardware.usb即使你是使用插件库。

    下表描述了USB配件api支持的类:

    描述
    UsbManager 允许你列举和与连接USB通信配件。
    UsbAccessory 代表一个USB配件和包含的方法来访问它的识别 信息。

    使用附加组件库和平台api之间的区别

    有两种用法区别使用Google api插件库平台 api。

    如果你是使用插件库,你必须获得 UsbManager对象以下列方式:

    UsbManager manager = UsbManager.getInstance(this);

    如果你不使用附加组件库,你必须获得 UsbManager对象以下列方式:

    UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);

    当你为一个连接过滤器配件意图过滤器, UsbAccessory对象包含在意图传递给你
    应用程序。 如果你是使用插件库,你必须获得 UsbAccessory对象以下列方式:

    UsbAccessory accessory = UsbManager.getAccessory(intent);

    如果你不使用附加组件库,你必须获得 UsbAccessory对象以下列方式:

    UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);

    Android清单要求



    下面的列表描述了您需要添加到您的应用程序的清单文件 使用USB accesory api。 的 清单和资源文件
    例子
    演示如何声明这些项目:

    • 因为不是所有的android设备保证支持USB配件api, 包括一个 <
      uses-feature > 
      您的应用程序使用的元素声明 的 android.hardware.usb.accessory 特性。
    • 如果您正在使用 插件库,
      添加 < uses-library > 元素指定 com.android.future.usb.accessory 为图书馆。
    • 设置最低SDK应用程序的API级别10如果使用插件库 如果您正在使用或12 android.hardware.usb包中。
    • 如果你想让你的应用程序连接USB附件的通知,指定一个 <意图过滤器> 和 <元数据> 元素对的android.hardware.usb.action.USB_ACCESSORY_ATTACHED 你的主要活动的意图。
      的 <元数据> 元素指向外部的XML资源文件 声明确认附件的信息你想检测。

      在XML资源文件中,申报的东西 <
      usb-accessory > 
      元素的 配件要过滤。 每一个 < usb-accessory > 可以有
      以下属性:

      • 制造商
      • 模型
      • 版本

      节省的资源文件 res / xml
      目录中。 资源文件名称 (没有。 xml扩展)必须与你指定的相同 <元数据> 元素。
      格式为XML资源文件所示 的 例子在下面。

    清单和资源文件的例子

    下面的示例显示了一个示例清单和相应的资源文件:

    <manifest ...>
        <uses-feature android:name="android.hardware.usb.accessory" />
       
        <uses-sdk android:minSdkVersion="<version>" />
        ...
        <application>
          <uses-library android:name="com.android.future.usb.accessory" />
            <activity ...>
                ...
                <intent-filter>
                    <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
                </intent-filter>
    
                <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
                    android:resource="@xml/accessory_filter" />
            </activity>
        </application>
    </manifest>

    在这种情况下,应该保存在下面的资源文件 res
    / xml / accessory_filter.xml 
    并指定任何配件的 相应的模型中,制造商,应该过滤和版本。 附件发送这些 属性的android设备上:

    <?xml version="1.0" encoding="utf-8"?>
    
    <resources>
        <usb-accessory model="DemoKit" manufacturer="Google" version="1.0"/>
    </resources>

    使用附件



    当用户连接USB配件Android手机,Android系统 确定应用程序是否感兴趣的连接配件。 如果是这样,你可以设置 如果需要沟通与配件。 要做到这一点,您的应用程序有:

    1. 发现连接配件用一个意图过滤器,过滤器的配件 附加事件或通过列举连接配件,找到合适的一个。
    2. 要求用户批准与配件,如果没有了 获得的。
    3. 与附件的读写数据在适当的接口 端点。

    发现一个附件

    您的应用程序可以发现配件通过使用一个意图过滤器时收到通知 用户连接一个附件或通过列举配件已经连接。 使用一个 意图过滤器是非常有用的,如果你想应用程序能够自动检测 所需的配件。 列举相关配件是有用的,如果你想要所有的列表 连接配件或如果您的应用程序没有过滤的目的。

    使用一个意图过滤器

    您的应用程序发现特定USB配件,你可以指定一个意图过滤器 过滤的android.hardware.usb.action.USB_ACCESSORY_ATTACHED 意图。
    沿着 这个意图过滤器,您需要指定一个资源文件,指定属性的USB 配件,如制造商、模型和版本。 当用户连接一个匹配的配件 你的辅助滤波器,

    下面的例子显示了如何声明意图过滤器:

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

    下面的例子展示了如何声明指定相应的资源文件 USB附件你感兴趣:

    <?xml version="1.0" encoding="utf-8"?>
    
    <resources>
        <usb-accessory manufacturer="Google, Inc." model="DemoKit" version="1.0" />
    </resources>

    在你的活动,你可以获得 UsbAccessory代表
    这样的意图的附属配件(附加库):

    UsbAccessory accessory = UsbManager.getAccessory(intent);

    或者像这样的(与平台api):

    UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);

    列举配件

    应用程序可以列举饰品,当你发现了自己 应用程序正在运行。

    使用 getAccessoryList()方法
    得到一个数组的所有USB配件连接:

    UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
    UsbAccessory[] accessoryList = manager.getAcccessoryList();

    注意: 目前,只有一个连接配件支持 一次,但API的设计目的是在未来支持多个附件。

    获得许可与配件

    在与USB通信配件之前,你的应用程序必须得到你的许可 用户。

    注意: 如果您的应用程序 使用一个
    意图过滤器
    发现配件连接,它可以自动接收 如果用户许可允许您的应用程序处理的目的。 如果没有,你必须请求 允许显式地在您的应用程序连接到配件。

    明确要求许可可能是必要的在某些情况下,例如当你 应用列举了已经连接的配件,然后想要沟通 一个。 你必须检查权限访问在试图与之前一个附件。 如果不是,你将收到一个运行时错误,如果用户拒绝访问 配件。

    显式地获得许可,首先创建一个广播接收器。 这个接收器监听 意图让广播时调用 requestPermission()
    调用requestPermission()显示一个对话框
    用户请求权限连接配件。 下面的示例代码显示了如何 创建广播接收机:

    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) {
                    UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
    
                    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                        if(accessory != null){
                            //call method to set up accessory communication
                        }
                    }
                    else {
                        Log.d(TAG, "permission denied for accessory " + accessory);
                    }
                }
            }
        }
    };

    注册广播接收器,把这个在你 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()方法:

    UsbAccessory accessory;
    ...
    mUsbManager.requestPermission(accessory, mPermissionIntent);

    当用户回复的对话框,你的广播接收器接收包含意图 EXTRA_PERMISSION_GRANTED额外的,这是一个布尔值
    代表回答。 之前检查这个额外的价值真正的连接 配件。

    与一个附件

    你可以与附件使用通信 UsbManager
    获得一个文件描述符,您可以设置输入和输出流读写数据 描述符。 流表示附件的输入和输出端点。 你应该设定 之间的通信设备和附属在另一个线程,所以你不锁 主UI线程。 下面的例子显示了如何打开一个与附件:

    UsbAccessory mAccessory;
    ParcelFileDescriptor mFileDescriptor;
    FileInputStream mInputStream;
    FileOutputStream mOutputStream;
    
    ...
    
    private void openAccessory() {
        Log.d(TAG, "openAccessory: " + accessory);
        mFileDescriptor = mUsbManager.openAccessory(mAccessory);
        if (mFileDescriptor != null) {
            FileDescriptor fd = mFileDescriptor.getFileDescriptor();
            mInputStream = new FileInputStream(fd);
            mOutputStream = new FileOutputStream(fd);
            Thread thread = new Thread(null, this, "AccessoryThread");
            thread.start();
        }
    }

    线程的 run() 方法,您可以读取和写入附件使用
    的 FileInputStream或 FileOutputStream对象。
    当阅读 数据从一个附件 FileInputStream对象,确保缓冲
    你使用USB包数据存储足够大。 Android附属协议支持 包缓冲区最多16384个字节,所以你可以选择总是声明你的缓冲区 大小为简单起见。

    注意: 在一个较低的水平,USB的64字节数据包 全速USB高速配件配件和512字节。 Android配件 协议包的包在一起的速度为一个逻辑包为简单起见。

    更多信息在Android使用线程,明白了 流程和
    线程

    终止通信配件

    当你完成通信配件或附件是分离的,关闭 通过调用打开文件描述符 close()
    听独立事件,创建一个广播接收器像下面:

    BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction(); 
    
            if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
                UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
                if (accessory != null) {
                    // call your method that cleans up and closes communication with the accessory
                }
            }
        }
    };

    创建应用程序内的广播接收器,而不是清单,允许你 它运行时应用程序只处理分离事件。 这种方式,分离事件 只发送给当前正在运行的应用程序,而不是广播给所有的应用程序。

    时间: 2024-10-10 08:07:57

    android里面的USB功能-----Accessory模式的相关文章

    [图形图像]---浅析android里面的ImageView的ScaleType属性

    在我们写UI布局的时候,常使用ImageView控件,控件布局写好后,.9.png图片如何填充这个ImageView控件,此时就有ImageView的ScaleType属性决定. ScaleType是ImgeView的一个内部枚举类:ImageView$ScaleType,它决定了图片对View视图的填充结构.API解释如下:Options for scaling the bounds of an image to the bounds of this view.它一共有7种填充模式,下面一个一

    继续说一下2016里面的json功能(1)

    首先先来测试数据,数据是使用之前的,就 不要在意这些细节了啊~ 借用上一篇的测试数据 create table t1(ID int identity,name nvarchar(50),Chinese int ,Math int) insert into t1 values ('张三',90,80),('李四',75,90),('王五',68,100),('赵六',90,null); 然后我们使用这个表里面生成的json 来进行测试,最简单的例子 declare @v nvarchar(600)

    USB Accessory 模式

    USB Accessory 模式USB附件模式允许用户连接专为Android设备设计的USB主机硬件.配件必须遵守Android配件开发套件文档中概述的Android附件协议.这使得无法充当USB主机的Android电源设备仍然可以与USB硬件交互.当Android设备处于USB附件模式时,所附的Android USB附件充当主机,为USB总线供电,并列举连接的设备. Android 3.1(API级别12)支持USB附件模式,并且该功能也被返回到Android 2.3.4(API级别10),以

    Delphi在Android下实现BroadcastReceiver功能(举例在Delphi下获取USB外设拔插消息)

    在Android里,用java通过实现BroadcastReceiver接口,就可以获得Intent消息.可是Delphi程序不能直接实现JBroadcastReceiver,如何能够实现类似Java的BroadcastReceiver功能呢? 幸运的是Delphi提供了TJFMXBroadcastReceiver类实现了BroadcastReceiver,我们便可以以此达到目的. 下面的程序片段举例,实现如何在Delphi下获取USB外设拔插的消息. uses System.SysUtils,

    usbmanger android 底下USB的工作模式

    Android USB开发麻烦还是比较多的. 第一种:host模式 这种模式比较不错,由Android设备提供电源,然后与外部设备通信.举个例子来说:电脑连接USB设备,都是这个模式,非常常见的模式. 但是有一个万恶的问题,android接外部USB设备的时候,驱动怎么办?又有那款芯片敢说Android系统支持他们家的芯片,又有哪个厂家说不动android系统装上他们家的驱动,他们家的设备就可以在Android上使用,或许这点上Android很难超越windows. 造成想现状:想加外部设备,都

    全志Android设备增加Usb host ADK 功能

    全志Android设备增加Usb host ADK 功能 Usb Host ADK是指不采用USB驱动,直接用java与设备编程的 这样让Android 可以无需修改内核和驱动情况下方便与各种USB外设通讯.全志的CPU的资料都是公开的,因此我们在上面开发很多应用.但是发现无法使用usb host 接口. 一.测试 可以简单下载USB Device info 来测试 https://play.google.com/store/apps/details?id=aws.apps.usbDeviceE

    android 获取手机里面的WIFI密码

    获取手机里面的WIFI密码??刚看到的时候我也没明白这个有什么用,自己的手机不会不知道wifi密码吧,所以到现在我也没用到个这个功能 ,在这里权当记录一下,以备以后再找. 话说怎么获取WIFI密码还得从小米手机说起,记得小米推出了个Wifi密码共享的功能:比如在一个咖啡厅,只要一个人向服务员获取了密码,然后他打开wifi密码共享,那么其他人就可以直接连上wifi,而不需要再向服务员询问密码.但是后来安全什么的东西,最后这项功能好像也就无疾而终了.. 不过我们还是可以看一下小米是怎么实现的: 1.

    android 中Xml里面的id重名问题

    情况一:同个一个Xml文件中的同名 在同个一个Xml文件的中若同名了,则前一个有效,而后一个无效 情况二:在不同的Xml 文件中的同名 在不同Xml文件的Id若同名了,两者都有效的. 当android的工程越来越大.xml文件越来越多时,避免不了两个xml文件中同 样的组件使用同样的id名字,gen目录下的R.java文件中,有关id的声明都在id的class中,即public static final class id{}:当两个xml文件中同样的组件,比如Button,有可能很多个文件中,都

    Android Service生命周期 Service里面的onStartCommand()方法详解

    2014-10-21 23:40 32人阅读 评论(0) 收藏 举报 在Demo上,Start一个Service之后,执行顺序:onCreate - > onStartCommand 然后关闭应用,会重新执行上面两步. 但是把代码拷贝到游戏工程发现,关闭游戏后,只执行了onStart,却没有执行onStartCommand! 查找到下面的文章: [plain] view plaincopy Service里面的onStartCommand()方法详解 启动service的时候,onCreate方