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

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

android里面的USB功能-----Accessory模式相关推荐

  1. sql server2016里面的json功能 - 转

    测试一下基本的,从查询结果里面构造一个json 的格式 create table t1(ID int identity,name nvarchar(50),Chinese int ,Math int) ...

  2. android里面的Activity体系结构(3)_ActivityRecord和Activity状态变化分析说明

    ActivityRecord是运行在system_server进程里面的,Activity是运行在应用进程里面的,虽然内部有个变量ActivityInfo info来代表Activity的所有信息,但 ...

  3. 关于 android 里面的 AndroidX 和 annotation 冲突的解决方式

    这里我使用的是Android Studio 之前项目接入的SDK 都没有依赖AndroidX 最近接入了一个SDK 必须依赖AndroidX后就发现各种报错了 其中一个就是 程序包 android.s ...

  4. Android里面的settext作用,Android性能优化-TextView的setText方法会导致界面重绘?

    问题现象 大概就是我们在自定义一个视频组件的ui时,发现了一段异常的效果. 我简述一下: 视频的控制器 底部一般都是 显示时间(textview)和进度条(seekbar)的 一般要实现这个效果 都是 ...

  5. 使用go来实现类似erlang otp里面的gen_server功能

    erlang比go要成熟,其中一大原因就是拥有otp工程,进程的管理可以通过专门的行为 模式去处理,例如gen_server,里面包含的6个回调函数init/1, handle_call/3, han ...

  6. Android里面的settext作用,Android EditText setText方法踩坑实录

    1.平平常常中就这样开始 某一天,我准备做一个搜索功能,这个搜索功能呢大概是在主活动A中,用EditText接收输入,当EditText监听到输入框中内容有变化,跳转到活动B中,活动B中准备有搜索历史 ...

  7. Android里面的settext作用,android TextView setText无效

    我知道有很多类似的线程,但我已经完成了它们仍然无法弄清楚问题.我的程序到达处理程序,但它总是返回捕获异常"消息未处理". 我声明了TextView私有TextView聊天框; 在o ...

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

    首先先来测试数据,数据是使用之前的,就 不要在意这些细节了啊~ 借用上一篇的测试数据 create table t1(ID int identity,name nvarchar(50),Chinese ...

  9. 用c语言 简单实现JAVA里面的ArryList 功能,实现内存自动扩展

    #include<stdio.h> #include<stdlib.h> struct Arr{     int * pbase;//数组首地址     int len;//数 ...

  10. 《Quaternion》自己实现Quaternion里面的FromToRotation功能

    先看代码. /// <summary>/// Handles smaller values better than Unity's version./// </summary> ...

最新文章

  1. 智源社区 2021 AI 大调查开启!
  2. 一文读懂PyTorch张量基础(附代码)
  3. 11.13. Highslide
  4. ASP.NET SignalR增加Azure支持
  5. ubuntu18安装python3.6.8_ubuntu 18.04 + Python 3.6.8 更换软件安装源
  6. 认识 UML 类关系——依赖、关联、聚合、组合、泛化
  7. sql语句 isnull(列名,'')='' /STUFF的意思
  8. 100%在CSS中是什么意思?
  9. ORACLE SQL - UPDATE、DELETE、INSERT优化和使用技巧
  10. std在汇编语言是什么指令_汇编语言STD CLD的用法
  11. 如何通过Facebook主页获得用户的邮箱
  12. Python 批量转化doc文件为docx文件
  13. 人似秋鸿来有信,事如春梦了无痕
  14. echart 环形饼图设置中心固定信息
  15. 像素是什么意思?一个像素有多大? 告诉你像素和分辨率的关系!
  16. 用好图片,让PPT富有冲击力
  17. 巨人10Q4财报:营收3.6亿元环比增8.7%
  18. 机械革命无线网消失解决办法
  19. win10没有计算器怎么办【系统天地】
  20. 【数据中心管理】服务器的1U、2U是什么意思?42U机柜可以放多少台服务器

热门文章

  1. 华为网络设备 display 命令
  2. 奇异矩阵和非奇异矩阵 行列式矩阵简单理解 代数意义 几何意义 行列式的定义: 二阶行列式的几何意义: 三阶行列式的几何意义: 行列式化为对角形的几何解释: 二阶行列式乘积项的几何意
  3. 苹果手机无法解析html,苹果手机故障全解析
  4. 完美解决python3.6环境下,使用pyinstaller打包.exe时报错的情况。
  5. 【python面向对象】技能系统
  6. 怎么缩小照片的kb大小?
  7. vulhub-activemq-cve-2015-5254
  8. 产品设计 - AARRR模型,增长和变现
  9. 飞鱼星路由器端口映射/端口转发的设置步骤及注意事项
  10. MySQL临时表的使用