原文連接:http://android.eoe.cn/topic/android_sdkjava
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這個類庫文件。