Android USB配件模式

原文:http://android.eoe.cn/topic/android_sdk

USB配件模式允许用户连接那些专门搭载Android设备的USB主机硬件。这些配件必须遵守Android配件开发工具包文档中所列出的Android附件协议。这使得搭载Android系统的设备在不充当USB主机的情况之下,仍然可以和USB硬件进行交互。当一台搭载Android系统的设备处于USB配件模式时,所依附的Android USB配件作为主机为USB总线提供能源以及列举出相连的设备。Android3.1(API12级)提供了USB配件模式并且这一特点也继承了Android2.3.4(API10级)以此来支持更多设备。

选择正确的USB附件APIs

尽管USB附件API在Android3.1平台才开始介绍,但是也可以在Android2.3.4API中通过附加类库使用。因为这些APIs都是通过额外的类库来使用的,你可以导入两个包来支持USB配件模式。取决于你想支持什么样的搭载Android系统的设备,你也许不得不在一个的基础上使用另外一个:

com.android.feature.usb:为了支持Android2.3.4的USB配件模式,Google APIs附加类库包括了USB外设APIs并且它们就是包含在这个命名空间的后面。Android3.1还支持导入和调用这个命名空间的类来支持附加类库编写的应用程序。这个附加的类库只是关于android.hardware.usb外设APIs的一个简单的封装并且它不支持USB主机模式。如果你希望更大范围支持USB配件模式的设备,使用附加类库并且导入改包就行。需要注意的是,并不是所有搭载Android2.3.4的设备都需要拥有USB外设这一特色。每个设备生产商在决定是否具有这个特色,这也就是为什么你必须要在manifest文件中声明的原因了。

android.hardware.usb:这个命名空间包含在Android3.1版本中支持USB附件模式的类。因为这个包是框架APIs中的一部分,所以Android3.1版本可以在不用附加类库的前提之下支持USB附件模式。使用这个包时,如果你只关心Android3.1或者更新的支持USB附件模式的硬件的设备,你可以在mainfest文件中进行声明。

安装谷歌APIs的附加类库

如果你想安装这个附加类库,你可以通过在SDK管理器上面安装谷歌APIs中的Android API10包的方式来做。更多关于安装附加类库的信息请参见安装谷歌APIs附加元件。

API 概述

因为附加类库是一个框架APIs的封装,和那些支持USB附件功能的类是相似的。即使你在用附加类库的时候,你也可以用android.hardware.usb参考文档作为参考。

* 注意:* 然而,你要注意在附加类库和框架APIs之间还是有一些细微的使用差别的。

下面的表格为您描述了那些支持USB外设APIs的类:
{|style="border-spacing: 0px;margin: 4px 4px; width: 90%; border-left:1px solid #ccc;border-top:1px solid #ccc
|-style="background:#DEE8F1; "
! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" | 类
! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" | 详细描述
|- style=" vertical-align:top;"
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
UsbManager
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
允许您用已连接的USB配件直接进行枚举和交流
|- style=" vertical-align:top;"
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
UsbAccessory
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
可以表示一个USB配件并且包含来连接识别信息的方法
|}

关于平台APIs和附加类库之间的用法差异

在分别使用谷歌APIs附加类库和平台APIs的时候,通常会有两种差异。

如果您正在使用附加类库,则肯定会通过下列方式来创建UsbManager对象:

1
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Open Accessory (AOA) 是 Android 3.1 及以上版本中引入的一种协议,用于让 Android 设备与 USB 外设通信。其中,AOA 分为两种模式:Accessory 模式和 Host 模式。 在 Accessory 模式下,Android 设备作为一个 USB 主机,外接一个 USB 外设,如 Arduino 或者 PIC 单片机等,通过 USB 接口进行通信。在 Host 模式下,Android 设备作为一个 USB 从设备,连接到 PC 上,与 PC 进行通信。 对于 51 单片机的 AOA 开发,需要实现 USB 设备的相关硬件电路,并编写相应的固件程序。具体步骤如下: 1. 首先,需要了解 Android 设备与外设的通信协议,了解 AOA 协议的数据格式、命令以及响应的数据包格式。 2. 在单片机中实现 USB 设备的硬件电路,包括 USB 转串口、USB 控制器等。 3. 在单片机中编写 AOA 协议的固件程序,根据协议格式,实现设备的握手、命令响应、数据传输等功能。 4. 在 Android 应用程序中,使用 USB Host API 进行设备的检测和数据传输,根据协议格式,封装命令和数据,发送给单片机。 下面是一个简单的 Android 应用程序,演示如何使用 USB Host API 实现与 51 单片机的通信: ``` public class MainActivity extends Activity implements UsbManager.OnUsbDeviceConnectionListener { private UsbManager mUsbManager; private PendingIntent mPermissionIntent; private UsbDevice mDevice; private UsbEndpoint mEndpoint; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 获取 UsbManager 实例 mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); // 注册 USB 设备权限 mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); registerReceiver(mUsbReceiver, filter); } @Override public void onResume() { super.onResume(); // 枚举所有连接的 USB 设备 for (UsbDevice device : mUsbManager.getDeviceList().values()) { // 判断是否为目标设备 if (device.getVendorId() == VENDOR_ID && device.getProductId() == PRODUCT_ID) { // 请求设备权限 mUsbManager.requestPermission(device, mPermissionIntent); break; } } } 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) { mDevice = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { // 获取 USB 设备接口 UsbInterface intf = mDevice.getInterface(0); // 获取 USB 设备端点 mEndpoint = intf.getEndpoint(0); // 打开 USB 设备连接 UsbDeviceConnection connection = mUsbManager.openDevice(mDevice); if (connection != null) { connection.claimInterface(intf, true); // 发送命令给单片机 byte[] command = new byte[]{0x01, 0x02, 0x03}; connection.bulkTransfer(mEndpoint, command, command.length, TIMEOUT); } } else { Log.d(TAG, "permission denied for device " + mDevice); } } } } }; @Override public void onUsbDeviceConnection(UsbDevice device, UsbDeviceConnection connection) { // USB 设备连接成功回调 } @Override public void onUsbDeviceDisconnection(UsbDevice device, UsbDeviceConnection connection) { // USB 设备断开连接回调 } } ``` 51 单片机的固件程序实现比较复杂,需要涉及到 USB 设备的控制、数据传输、命令响应等方面,需要根据 AOA 协议的具体要求实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值