原文连接:http://android.eoe.cn/topic/android_sdk java
2012年的Android辅助设备开发工具包(ADK)是Android开放设备协议(AOA)设备的最新参考实现,它被用于帮助Android硬件辅助设备开发者
和软件开发者开发制造Android辅助设备。ADK2012基于Arduino开源电子产品原型设计平台,并增长了一些软硬件方面的扩展,而这些扩展可以使该工具包开发的产品与Android设备进行通讯。 android
在2012年的Google I/O开发者大会上只有数量不多的工具包被发行。若是你没有获得其中的一个工具包,不要着急,关于硬件的规范和设计文件将由生产商和业余爱好者发布。你将看到有类似功能的工具包,你能够经过购买获得它们,固然你也能够本身开发一套工具包。 oracle
这个ADK中一个重要的新功能是你能够经过USB链接播放音频文件。若是你对在Android平台上开发与音频相关的USB辅助设备感兴趣,请肯定这个
ADK中包含了对USB音频扩展坞的参考实现。 app
ADK2012基于Arduino开源电子产品原型设计平台,同时也是开放的硬件设计。其硬件设计文件和固件源代码包含在了下载的ADK软件包中。
此ADK包含了两个重要的物理硬件组件: socket
1.主板包括了微处理器,USB链接,电源接口和输入输出针口。这个主板能够被移除而后独立于余下的硬件单独使用。 ide
2.屏蔽传感器,发光二极管(LED),输入控制,音频放大器和扬声器输出,把它们包含在一个自定义的多边形盒外壳中。 工具
如下是主要的ADK硬件特性:
* 一个32位的ARM Cortex M3 微处理器。
* 将Android设备的USB链接和程序设计和调试的电脑链接分离。
* 灯光,颜色,距离,温度,湿度,气压,加速传感器
* 微SD卡插槽
* 支持蓝牙 oop
此ADK预载了一个你能够当即使用的闹钟固件程序。ADK 2012是一个Android伴随程序,你能够在Google Play上下载它。Android应用程序和ADK固件(一个Arduino的草图)的源代码均可以在此页下载。 开发工具
与ADK 2012一块儿发布的还有其余的部件,这些部件能够帮助你开发辅助设备,包括:
* AC能源适配器
* USB A 到 微型USB B的链接电缆
* 微型USB B到微型USB AB链接器(小的,矩形的插头)
* 微型 SD卡,在ADK的SDK卡槽中已经预装 测试
ADK中预载了一个闹钟程序。这个固件程序容许你像使用闹钟同样使用这个ADK。
一下是ADK使用步骤:
1.轻轻按压外壳两个最宽的面来打开ADK
2.将提供的AC电源适配器(圆形插头)链接到ADK主板上,或者将一根USB电缆链接到端口标记的电脑和你的电脑的USB端口上。
3.将你的指尖持续放在控制面板的闹钟符号上。
注意:你可能须要将你的手指持续放在适当的地方1-2秒。
4.使用时钟数字内部的+、-符号来设置正确的时间。
5.将你的指尖放在闹钟符号上来激活闹钟。
6.使用时钟数字内部的+、-符号来设置闹钟时间。
7.使用最近两个时钟数字内部的+、-符号来开启或关闭闹钟。
8.将你的指尖持续放在闹钟符号上,而后点击外壳上方的滑动控制来改变闹钟的音调。
使用ADK2012版伴随应用中的闹钟的步骤:
1.在你的Android设备中下载伴随应用,Android版本须要3.1(API等级12)或更高:
:* 用一个有NFC功能的Android设备,解锁,并按住ADK外壳左侧,按照提示安装应用。
:-或者-
:* 在你的设备上启动Google Play搜索ADK 2012应用并安装。若是你找不到应用程序,你的设备多是不兼容的,请尝试在另外一个设备上安装。
2.用下面其中的一种方法将你的Android设备链接到ADK上:
:* 用蓝牙链接:
:1.将AC电源适配器的插头插入ADK中
:2.将你的Android设备中的蓝牙功能开启(设置-蓝牙)
:3.在设置页面中,按蓝牙选项来查看匹配的设备
:4.选择搜索设备来找到ADK2012辅助设备,而后根据屏幕上的指示进行链接
:5.匹配完成后,在你的Android设备上开启ADK2012医用程序
:6.在启动画面中,选择使用蓝牙按钮
:7.在匹配设备的列表中,选择ADK 2012设备
:8.ADK 2012应用程序应该切换到菜单画面中,你能够开始与ADK辅助设备进行交互。
:* 用USB进行链接:
1.将AC电源适配器的插头插入ADK中
2.将微型USB AB的链接插头(小的矩形插头)链接到ADK板上端口标记的听筒上。
3.解锁你的Android设备,将微型USb B的链接插头链接到你的设备上。
注意:你的设备必须支持Android usb辅助设备模式。支持这种模式的设备包括Google Nexus设备。
4.在Android设备上,你应该看见链接到ADK DemoKit 2012的提示,选择 是 。
5.ADK 2012应用程序应该自动启动,而后你能够与ADK进行交互。
注意:当以USB链接Android设备来使用ADK的时候,要确保AC电源适配器已经插入。链接到电脑的USb链接插头不提供充足的电压来给ADK以及链接到设备的USb链接插头提供电力。
ADK2012带有音频输出功能,包括一个放大器和扬声器。你能够经过蓝牙或者usb链接使用它让你的Android设备播放音频。
经过蓝牙播放音频:
1.根据上一节的指示,经过蓝牙将你的Android设备链接到ADK上
2.在你的Android设备上,操做到设置-蓝牙页面来查看匹配的设备列表,并确认与ADK链接
3.选择ADK2012边上的设置图标
4.确保媒体音频功能已启用
5.打开一个播放音乐或其余音频的应用程序
6.播放歌曲或声音,并经过ADK扬声器来聆听他!
经过USB来播放音频,你必须使用Android4.1(API等级16)或者更高版本的设备:
1.将AC电源适配器的插头插到ADK中
2.将微型USb AB的链接插头(小的矩形插头)链接到ADK板上端口标记的听筒上。
3.解锁你的Android设备,将微型USb B的链接插头链接到你的设备上。
注意:你的设备必须支持Android USb辅助设备模式。支持这种模式的设备包括Google Nexus设备。
4.在Android设备上,你应该看见一个链接到ADK Deomkit 2012的提示,选择取消使ADK仅做为媒体设备链接。
5.打开一个播放音乐或其余音频的应用程序
6.播放歌曲或声音,并经过ADK扬声器来聆听它!
注意:当以USb链接Android设备来使用ADK的时候,要确保AC电源适配器已经插入。链接到电脑的USb链接插头不提供充足的电压来给ADK以及链接到设备的USb链接插头提供电力。
ADK 2012是一个硬件平台,也是一套以原型设计Android辅助设备的软件库。这个部分讨论如何为ADK变成创建开发环境,来使它作你想作的事以及为创建你本身的Android辅助设备进行软件测试。
ADK2012支持的软件和硬件能够在Android源码库。按照如下的指示为ADK获取源材料。
下载ADK2012软件,源码,硬件设计说明书:
1.给你的开发系统下载并安装Git
2.按照Android open source project网站上的说明下载并安装回购工具
3.在终端窗口中,给所下载的资源文件创建一个新的指南,初始化并同步本地存储库:
$> mkdir android-accessories
$> cd android-accessories
$> repo init -u https://android.googlesource.com/accessories/manifest
$> repo sync
在成功完成这个步骤后,你应该拥有利用ADK2012工做的源码和工具。
ADK2012带有集成开发环境(IDE),你可使用它来开发软件并未ADK2012辅助设备编写程序。下面的指示解释了如何创建并运行 ADK2012的IDE。
创建和运行ADK2012的IDE:
1从java.oracle.com上下载并安装JDK6或者更高的版本
2.为你的开发平台下载ADK2012的IDE
:* Windows
:* Mac
:* Linux32bit,64bit
3.解压下载的文件
4.解压ADK2012_IDE文件夹并执行arduino文件来运行应用程序
在你成功安装并运行ADK2012 IDE后,你必须配置它以使用ADK2012资源库。
使用ADK类库配置ADK2012 IDE:
1.启动ADK2012 IDE ,而后选择File>Preferences.
2.在Preferences对话框中,记下Sketchbook location这个目录
3.复制 /adk2012/board/library/ADK2这个目录和它的内容到你的sketchbook/libraries/目录,如此,你就能够建立一个sketchbook/libraries/ADK2目录。
4.中止而后重启ADK2012 IDE。
5.在IDE中,选择File>Examples>ADK2,而后选择其中一个例子
* clock-预载在ADK2012中的示例
* BluetoothScan-一个将辅助设备与Android设备经过蓝牙链接的示例演示代码
* usbaccessory-一个将辅助设备与Android设备经过USB电缆链接的示例演示代码
6.将ADK板上的电脑端口与你的用于开发的电脑用微型USB电缆相链接。
7.在ADK2012 IDE中,用ADK创建一个串行端口链接。选择Tools>Serial Port而后选择用于ADK的端口。
8.在ADK2012 IDE中,经过Tools>Board>GoogleADK2选择ADK
9.修改一个示例或新建一个
10.经过File>Upload上传示例到ADK。当ADK2012 IDE提示Done uploading,示例已经上传并且ADK已经准备好于你的Android设备通讯。
一个替代的,基于文件生成和上传的系统也能够在ADK2012中使用。这个系统基于命令行,也是为当使用IDE环境去装载软件到辅助设备不太方便时的生产环境设计的。
创建环境:
1.下载ADK2012源码文件
2.在一个终端窗口中,进入/adk2012/board/MakefileBasedBuild
3.运行一下命令,而后跟着指示:
$> ./setup
为你的辅助设备创建一个程序
1.将你的辅助设备的代码放到MakefileBasedBuild/app这个目录中,包括全部的类库文件。将app/main.c这个文件的格式做为你的标准格式
2.运行如下命令,而后跟着指示:
$> ./build
在你的辅助设备上载入程序:
1.运行构建程序,并确保你的程序编译成功
2.将辅助设备与你的电脑用USB链接
3.检查你的辅助设备链接到哪个端口上,而后在flash脚本中修改UART这个变量以修正端口地址。在Linux机器上,端口地址通常是/dev/ttUSB0
4.运行如下命令以在辅助设备上载入程序
$> ./flash
Android辅助设备的核心特性是它的与Android设备链接及通讯的能力。在你的辅助设备和Android设备被之间链接一个快速稳定的链接是构建一个应用于辅助设备被的软件的第一步。这个部分介绍ADK2012中使用链接和通讯的要领,而后,你就能够应用它们去开发你本身的Android辅助设备。
ADK2012应用和硬件部分的辅助设备使用蓝牙串行端口配置文件(SPP)链接来通讯。这种链接容许ADK辅助设备和Android设备之间的双向通讯。
注意:ADK硬件的实现容许使用其余配置文件和多种链接方式。然而,ADK2012与Android应用之间的基本通讯是基于SPP。
辅助设备的蓝牙代码
为了使用蓝牙进行通讯,ADK2012辅助设备的clock.ino示例在执行setup()方法时调用一个btStart()方法以使使用无线电频率通讯成为可能和开启蓝牙的监听模式。
ADK L;
void setup() {
L.adkInit();
L.btStart();
}
...
void btStart(){
uint8_t i, dlci;
int f;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
L.btEnable(adkBtConnectionRequest, adkBtLinkKeyRequest, adkBtLinkKeyCreated, adkBtPinRequest, NULL); dlci = L.btRfcommReserveDlci(RFCOMM_DLCI_NEED_EVEN); if(dlci) dbgPrintf("BTADK: failed to allocate DLCIn"); else{ //change descriptor to be valid... for(i -1; i < sizeof(sdpDescrADK); i++){ if(sdpDescrADK[i] == MAGIX){ if(f i; else break; } } if(i != -1){ dbgPrintf("BTADK: failed to find a single marker in descriptorn"); L.btRfcommReleaseDlci(dlci); return; } sdpDescrADK[f] = dlci >> 1; dbgPrintf("BTADK has DLCI %un", dlci); L.btRfcommRegisterPort(dlci, btAdkPortOpen, btAdkPortClose, btAdkPortRx); L.btSdpServiceDescriptorAdd(sdpDescrADK, sizeof(sdpDescrADK)); } |
}
请注意,sdpDescrADK这个对象包括了一个通用的惟一标识符(UUID)在变量BT_ADK_UUID中。这个标识符必须与在bluetoothSocket链接请求中提供的设备的UUID匹配。这个链接请求在Android应用的代码中能够找到。
一旦蓝牙能够与以上代码一块儿使用,辅助设备监听链接请求。ADK类库处理监听和链接详情,而后,辅助设备在每个循环运行时调用
ADK::adkEventProcess()方法:
void loop(void)
{
...
L.adkEventProcess(); //let the adk framework do its thing
...
}
若是一个蓝牙链接已经被创建了,任何命令都被路由到btAdkPortRx()这个回调方法(这个回调方法在ADK类库中做为btStart()方法的一部分注册)而后根据状况执行。ADK辅助设备经过蓝牙链接用ADK::btRfcommPortTx()方法发回消息。若是你想了解更多细节,仔细看在clock.ino中这些方法的实现。
在ADK2012Android应用中,处理蓝牙链接的代码封装在一个BTConnection类中。在这个类中,应用的请求访问蓝牙适配器而后与ADK2012辅助设备创建一个链接。一下是相关代码的摘要:
mAdapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = mAdapter.getRemoteDevice(address);
mSocket = device.createInsecureRfcommSocketToServiceRecord(ADK_UUID);
mSocket.connect();
注意第二行中的ADK_UUID参数。这个标识符必须辅助设备输出的标识符(就是以前提到的BT_ADK_UUID)相符。不然,协议将会失效,而后BluetoothSocket链接不会创建。一旦链接创建了,你从socket链接得到了一个InputStream和OutputStream对象以与辅助设备通讯。
mInStream = mSocket.getInputStream();
mOutStream = mSocket.getOutputStream();
仔细阅读BTConnection.java文件,这个文件由下载的ADK2012软件提供,你能够从中获取更多的详情。
ADK2012应用和辅助设备也能够那个USB链接来通讯,这一点与最原始ADK相似。
ADK类库拥有大部分USB链接的实现细节,辅助设备的代码必须调用一些方法以初始化USB链接,其中包括设置辅助设备的标示符字符串:
ADK L;
void setup() {
L.adkInit();
L.usbSetAccessoryStringVendor(...);
L.usbSetAccessoryStringName(...);
L.usbSetAccessoryStringLongname(...);
L.usbSetAccessoryStringVersion(...);
L.usbSetAccessoryStringUrl(...);
L.usbSetAccessoryStringSerial(...);
L.usbStart();
}
注意:标识符字符串必须与所链接的Android应用的USB辅助设备过滤设置相符,不然,应用将不会与辅助设备创建链接。
一旦USB与以上代码一块儿工做了,辅助设备开始监听链接请求。ADK类库处理监听到的事件和链接细节,而后辅助设备在每一次循环执行时调用ADK::adkEventProcess()方法:
void loop(void)
{
...
L.adkEventProcess(); //let the adk framework do its thing
...
}
辅助设备必须检查一个正在使用的USB链接以处理命令和发送消息。如下是相关代码的摘要:
void loop() {
if (L.accessoryConnected()) {
int recvLen = L.accessoryReceive(msg, sizeof(msg));
if (recvLen > 0) {
... // process message
}
1 |
L.accessorySend(outmsg, outmsgLen); |
}
L.adkEventProcess();
}
想得到更多详情,请仔细阅读这些方法在clock.ino示例中的实现代码。
ADK2012的Android应用中,处理USB链接的代码被封装在一个UsbConnection类中,这个类创建一个BroadcastReceiver以监听USB事件而后在一个符合条件的链接事件被接收到是试图进行链接。如下是相关代码的摘要:
import com.android.future.usb.UsbAccessory;
import com.android.future.usb.UsbManager;
mUSBManager = UsbManager.getInstance(this);
UsbAccessory acc = mUSBManager.getAccessoryList()[0];
if (mUSBManager.hasPermission(acc)) return;
ADK2012应用使用支持库来实现USB辅助设备链接,这么作是为了支持Android2.3.4(API等级为10)的设备。若是你只须要支持Android3.1(API等级为12)和更高版本的设备,你能够替换如下代码中的前四行:
import android.hardware.usb.UsbAccessory
import android.hardware.usb.UsbManager
mUSBManager = (UsbManager) getSystemService(Context.USB_SERVICE);
UsbAccessory acc = (UsbAccessory)
1 |
intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);</java> |
注意,此应用只在USB辅助设备标识符信息与res/xml/usb_accessory_filter.xml文件中的信息相符时才接受事件,这些在应用的清单文件中有记录:
ADK2012辅助设备不会接受来自其余USB设备的链接。
一旦链接被创建了,应用能够经过文件输入输出流与辅助设备通讯,这一点在一下代码中能够见到:
ParcelFileDescriptor mFD = mUSBManager.openAccessory(acc);
if (mFD != null) {
FileDescripter fd = mFD.getFileDescriptor();
mIS = new FileInputStream(fd); // use this to receive messages
mOS = new FileOutputStream(fd); // use this to send commands
}
仔细阅读UsbConnection.java文件,这个文件在ADK2012源码中能够找到,你能够从中得到更多的实现细节。
ADK2012中一个重要的新特性是可使用USB链接播放音频。这个创新举动做为Android开放辅助设备(AOA)协议2.0的一个更新被介绍,它能够在Android4.1(API等级16)或更高的设备上使用。 ADK2012为开发者提供了一个关于这个功能的参考实现。你不须要在Android设备上安装任何应用,辅助设备开发者须要支持AOAv2.这个实现演示了将16位,44.1kHz立体声PCM源数据的音频输出压缩到一个单通道中。而这一切都是基于辅助设备上的音频硬件。 使用由ADK类库提供的音频输出特性只要求调用一些方法。第一个调用的是辅助设备中的常规的setup()方法,这个方法使辅助设备准备好进行USB链接和音频输出,如下为示例代码的摘要: ADK L; void setup() { L.audioInit(); L.usbh_init() L.usbStart(); } 想要获取更多的关于ADK::audioInit()方法的信息,请查看libraries/ADK/Audio.c类库文件。想要获取更多关于ADK::usbh_init()方法的信息,请查看libraries/ADK/Usbh.c类库文件。 完成setup这个方法后,loop()方法调用ADK::adkEventProcess()方法以处理音频输出和其余ADK的方法: void loop(void) { ... L.adkEventProcess(); //let the adk framework do its thing ... } 这个调用运行ADK的任务队列,而后做为运行过程的一部分,任务队列运行libraries/ADK/Usbh_c中的usbh_work()方法,这个方法处理音频输出请求。仔细阅读这个方法的实现细节。想要得到更多的关于音频输出的实现细节,请查看libraries/ADK/accessroy.c这个类库文件。