Android USB配件模式

|-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
UsbManager manager = UsbManager.getInstance(this);

如果您不是用的附加类,则必须通过下列方式来创建UsbManager对象:

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

当您通过一个意图过滤器来过滤一个已经连接的配件,那么这个UsbAccessory对象就必须包含在传给您应用的这个意图中。如果您正在使用附加类库,您就必须通过下列方式来声明UsbAccessory对象:

UsbAccessory accessory = UsbManager.getAccessory(intent);

如果您不是用的附加类,则必须通过下列方式来声明UsbAccessory对象:

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

Android ManiFest 需求

===================


下面的列表向您描述了在用USB配件APIs工作前需要在您应用中的manifest文件里面添加什么。下面的清单和资源文件例子将教您如何声明这些项:

* 因为并不是所有搭载Android系统的设备都保证支持USB配件APIs,包括一个元素来声明您的应用具有

android.hardware.usb.accessory这个特色。

* 如果你正在使用附加类库,添加com.android.future.usb.accessory。

* 如果您使用附加类库,那么您所设置的最低SDK版本是10级;如果您使用android.harware.usb这个类的话,您所设置最低版本的SDK就应该为12级。

* 如果您希望您的应用带有一个附加USB配件的通知,在您的主activity中为和元素指向一个额外的声明关于你希望探测到的配件的识别信息的XML资源文件。

在这个XML资源文件中,为您希望过滤的配件声明都有下面的属性:

😗 制造商

😗 模式

😗 版本

在元素指定的一样。这个XML资源文件的格式在下面的例子中给出。

清单和资源文件例子


下面的例子就为您展示了一个简单的manifest以及与之相关的资源文件:

 1

2

3

4

5

6

7

8

9

10

11

12

13

14

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

在这种情况之下,下面的资源文件保存在res/xml/accessory_filter.xml文件中,并且指定那些只有与其相关的模式,制造商和版本的配件能够被选择。这个配件把这些属性传递给搭载Android系统的设备:

<?xml version"utf-8"?>

用配件工作

=====


当用户将USB配件连接到搭载Android系统的设备上面时,Android系统会判断您的应用是否适用于已连接的该配件。如果适用,您就可以根据您的喜好为该设备建立连接。要这么做,您的应用必须做下面这些动作:

您需要通过一个可以过滤配件附加事件的意图过滤器或者枚举已连接的配件来发现连接的配件来找到合适的接口。

==================================================

尚未获得许可的用户在适用配件操作时需要验证权限。

========================

通过在接入的端点进行读写数据的操作达到和配件交互的目的。

============================

发现配件


您的应用可以通过两种方式来发现配件,一种是用一个意图过滤器在用户连接一个配件时对其进行通知,另一种则是通过枚举您已经连接的所有配件。如果您希望您的应用能够自动的探测到你想要的配件,请使用一个意图过滤器来做。但是,如果您希望得到一个已连接配件的列表或者您不希望过滤意图,枚举所有的配件会是一个更好的选择。

使用一个意图过滤器

为了让您的应用可以发现一个特定的USB配件,您可以为android.hardware.usb.action.USB_ACCESSORY_ATTACHED这个意图指定一个意图来进行过滤。伴随着这个意图过滤器,您需要指定一个资源文件来特别说明这个USB配件的属性,例如制造商,模式和版本。当用户连接到一个符合您配件过滤条件的配件时,

下面的例子告诉您该如何声明这个意图过滤器:

1

2

<meta-data android:name=“android.hardware.usb.action.USB_ACCESSORY_ATTACHED”

android:resource=“@xml/accessory_filter” />

下面的例子告诉您怎么样声明指定您希望连接的USB配件的相关资源文件:

<?xml version"utf-8"?>

在您的activity文件中,您可以从像这样的意图(有附加类的)中获取UsbAccessory来代表这个相关的配件:

UsbAccessory accessory = UsbManager.getAccessory(intent);

或者像这样(用平台APIs的):

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

枚举所有配件

您可以使您的应用在运行时列举出所有能够被识别的配件。

通过getAccessoryList()方法来获得一个包含所有已连接USB配件的数组:

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

UsbAccessory[] accessoryList = manager.getAcccessoryList();

* 注意:* 现在,只能一次连接一个USB配件操作,但是在以后的API中会支持多配件的操作的。

获得使用一个配件的权限


在您使用一个配件前,您的应用必须从用户那里获得权限。

* 注意:* 如果您的应用在连接配件时通过一个意图过滤器来发现它们,如果用户允许您的应用来处理这个意图,它将自动接收这个权限。如果用户不允许,那么您就必须在连接配件之前详细在您的应用中写明需要请求的权限。

在某些情况下很有必要明确权限的许可要求,例如当您的应用枚举出所有已经连接的配件并且您希望和其中的一个进行“交流”。您必须在和该配件“交流”前检查是否有连接该配件的权限。如果不是这样,您的应用将在用户拒绝您连接该配件的权限之后收到个运行错误。

为了确切地获得权限,首先需要创建个广播接收器。这个接收器在您调用requestPermission()这个方法时从您得到的广播中舰艇这个意图。通过调用requestPermission()这个方法为用户跳出一个是否连接配件的对话框。下面的例子告诉您如何创建一个广播接收器:

private static final String ACTION_USB_PERMISSION =

“com.android.example.USB_PERMISSION”;

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {

 1

2

3

4

5

6

7

8

9

10

11

12

最后

分享一份NDK基础开发资料

详解:Linux网络虚拟化技术

分享内容包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

47039)]

分享内容包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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 协议的具体要求实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值