MyException - 我的异常网
当前位置:我的异常网» Access » android里面的USB效能-Accessory模式

android里面的USB效能-Accessory模式

www.MyException.Cn  网友分享于:2013-05-02  浏览:0次
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
            }
        }
    }
};

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

文章评论

程序员和编码员之间的区别
程序员和编码员之间的区别
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
那些争议最大的编程观点
那些争议最大的编程观点
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
一个程序员的时间管理
一个程序员的时间管理
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员应该关注的一些事儿
程序员应该关注的一些事儿
总结2014中国互联网十大段子
总结2014中国互联网十大段子
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
如何成为一名黑客
如何成为一名黑客
代码女神横空出世
代码女神横空出世
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
Java程序员必看电影
Java程序员必看电影
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员必看的十大电影
程序员必看的十大电影
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
我是如何打败拖延症的
我是如何打败拖延症的
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
为什么程序员都是夜猫子
为什么程序员都是夜猫子
每天工作4小时的程序员
每天工作4小时的程序员
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
漫画:程序员的工作
漫画:程序员的工作
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
旅行,写作,编程
旅行,写作,编程
鲜为人知的编程真相
鲜为人知的编程真相
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
10个调试和排错的小建议
10个调试和排错的小建议
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
程序员都该阅读的书
程序员都该阅读的书
 程序员的样子
程序员的样子
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
编程语言是女人
编程语言是女人
我的丈夫是个程序员
我的丈夫是个程序员
中美印日四国程序员比较
中美印日四国程序员比较
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有