Your SlideShare is downloading. ×
Android ADK
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Android ADK

10,659

Published on

http://www.ittraining.com.tw/workshop/workshop.html

http://www.ittraining.com.tw/workshop/workshop.html

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
10,659
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Android IO Workshop 作者: Jarey
  • 2. 關於艾鍗• 艾鍗學院為艾鍗科技所設立的一所專業的嵌入式系統軟 韌體開發教育訓練中心,提供產業之研發人員所需的專 業軟韌體訓練課程• 與 共同合作開設 嵌入式處理器/機器人軟體開發工程師訓練課程
  • 3. 艾鍗學院的會員已累計40多家科技公司 3
  • 4. 講師介紹-Jarey捷銳行動科技有限公司/ 創辦人學經歷:  東華大學資訊工程碩士  訊舟科技股份公司/SW Leader 專長  網通科技公司/PM 產品管理 Java/C/C++程式語言  Catcan機器人設計領域科技公司/Firmware工程師 Android 程式設計  艾鍗學院專任講師(Android應用程式開發、Java) 人機介面設計  經濟部工業局99年度數位內容產業發展躍進計畫 Linux程式設計 -Android手機應用程式開發A班講師。 單晶片程式設計(Atmel、  經濟部工業局99年度數位內容產業發展躍進計畫 Arduino、Renesas) -Embedded Linux行動應用加值開發就業班講師。 ARM9嵌入式系統  經濟部工業局99年度數位內容產業發展躍進計畫 網路程式設計 -Android手機應用程式開發B班講師。 網路通訊協定  台中技術學院-Android應用程式開發應用 講師 無線區域網路 著作:  Ajile程式設計開發手冊(java硬體化平台設計)  Java + Android開發課程(艾鍗教材) 4
  • 5. Agenda Android USB週邊裝置應用發展  Android USB 週邊商機  Android VS IPhone USB Accessory 開發 Android Open Accessory Development Kit  ADK運作架構介紹  Android Accessory Protocol  ADK開發工具下載與Eclipse環境建置 MicroChip ADK Lib 應用實作  MicroChip Android ADK Lib架構介紹  與ADK進行連線通訊流程  全雙工資料處理設計(多執行緒)  ADK的除錯方式 5
  • 6. Android USB週邊裝置應用發展 早期Android週邊裝置  在Google放出ADK工具之前,SmartPhone的週邊產品不 外乎為手機保護套、車用連接架、喇叭底座、外掛電池。 Android ADK 開放性週邊開發套件  2011年5月10 Google IO 2011大會發布Android3.1平版作 業系統,同時間也正式放出了全新的Android USB週邊設 備開發套件(Android Open Accessory Development Kit)  Android 3.1與手機版Android 2.3.4之後便開始支援ADK開 發套件,開發者可以自行設計相關的USB週邊裝置,這將 為Android Market帶來許多與硬體產品相結合的APP,這 也是個機會能讓你所開發的APP在Market眾多的APP中與 眾不同產生明顯的差異化。 6
  • 7. Android USB週邊裝置應用發展 Android USB週邊設備商機  Gartner研究機構指出,預期從 2011年開始,iPad以及其它媒 體平板將開始取代部分筆記型 電腦產品,這將減緩家庭用PC 的出貨量。  平版與手機將逐侵蝕傳統PC與 USB介面 NB的市場。 遊戲週邊 健康醫療設備  使用者漸漸的會開始期待所購 買USB週邊設備,除了能在PC 上運行之外,也能同時在平版 運動休閒設備 音樂控制介面 電腦上運行。 安全防護應用 工業控制介面 USB KEY 7
  • 8. Android USB週邊裝置應用發展 Android USB週邊設備商機  在Android多樣且開放性的平 台優勢下,其產品的市佔率 將不斷的攀升。  目前支援ADK的手機與平版 佔整體Android的比例不高, 但隨著Android 4.0將手機與 平版系統整合為一後,在不 久的將來經過汰舊換新後, 絕大部份的Android手機與平 版都將支援ADK介面。 8
  • 9. Android USB週邊裝置應用發展 Android IO 2011應用Demo  Android手機透過ADK連接跑步機…健身器材。  Android 遊戲控制(http://youtu.be/GrE_JO5rXKA)  Android機器人控制(http://youtu.be/jwvkJVUECrg) 9
  • 10. Android USB週邊裝置應用發展 艾鍗學院開發之相關應用  Android平版透過ADK連接KTV系統 10
  • 11. Android VS iPhone USB週邊開發 Android  開放H/W平台  Open協定與SourceCode  免審核機制  免授權費 iPhone  需要取得Made for iPhone認證  認證要求高 , 審核時程長  申請成功後需要支付授權費  申請成功才能拿到開發文件技術  Apple擁有隨時終止你產品的權利 11
  • 12. ADK運作架構介紹 ADK於Android的API支援  Android 3.1 平板電腦作業系統已內建 Android Open Accessory Development Kit ( ADK ) 的 Android Open Accessory APIs ,並具備USB Host mode 。  Android 2.3.4 智慧型手機作業系統可以透過 Google APIs 附加函式庫 (Google APIs add-on library ) 的方式運作。) USB Host and Accessory Mode ※USB Host Mode只在 Android 3.1以上版本支援 12
  • 13. ADK運作架構介紹 USB Accessory API(android.hardware.usb) Class Description UsbManager Allows you to enumerate and communicate with connected USB accessories. UsbAccessory Represents a USB accessory and contains methods to access its identifying information. USB Host API(android.hardware.usb Class Description Allows you to enumerate and communicate with connected USB devices. UsbManager Represents a connected USB device and contains methods to access its identifying information, UsbDevice interfaces, and endpoints. Represents an interface of a USB device, which defines a set of functionality for the device. A device can UsbInterface have one or more interfaces on which to communicate on. Represents an interface endpoint, which is a communication channel for this interface. An interface can UsbEndpoint have one or more endpoints, and usually has input and output endpoints for two-way communication with the device. Represents a connection to the device, which transfers data on endpoints. This class allows you to send UsbDeviceConnection data back and forth sychronously or asynchronously. Represents an asynchronous request to communicate with a device through a UsbDeviceConnection. UsbRequest Defines USB constants that correspond to definitions in linux/usb/ch9.h of the Linux kernel. UsbConstants 13
  • 14. ADK運作架構介紹 Android USB 週邊連接架構 Android 手機/平版 MCU控制層 ADK Support IO資料傳輸 14
  • 15. Android Accessory Protocol Android Accessory Protocol  任何Android USB Accessory皆必須實作Accessory Protocol,該 Protocol為開放協定,其定義了裝置偵測(detects)與通訊連線初始化 流程(包含mode切換機制)。 Accessory Protocol通訊流程  等待偵測裝置連線  確認裝置支援Accessory mode  如果該裝置支援USB Accessory mode,則建立兩者之間的通訊通道。 ADK開發版運作於Host Mode  由開發版供電給手機/平版  手機端運作於Accessory Mode 透過Accessory API與開發版通訊  開發版需偵測Android裝置的PID與VID,以確保連線的裝置為 Google 手機/平版  Google vendor ID:(0x18D1) Product ID: 0x2D00 or 0x2D01 15
  • 16. Android Accessory Protocol Android Accessory 初始化流程(USB H/W與手機內部溝通交握程序) 1. USB 線路之連接確認:當《 USB 週邊設備》與 《 Android 裝置》之間的 USB 線路連接與裝置偵測無誤後,彼此才會開始進行溝通動作。 2. 識別代碼之產生:在此過程中,《 Android 裝置》會先依製造商與設備型號 等資料,去產生一個屬於自己的新 VID/PID 識別代碼。 3. 設備模式 ( Accessory Mode ) 之支援確認:然後,《 USB 週邊設備》則需發 送一個控制交易訊息 ( Control Transaction ) 給《 Android 裝置》,詢問它是 否支援設備模式 ( Accessory Mode ) 。 4. 應用程式之相容確認:一旦《 Android 裝置》向《 USB 週邊設備》確認支援 設備模式 Accessory Mode ) 時,《 USB 週邊設備》會透過控制交易訊息傳 送一連串的字串給《 Android 裝置》。這些字串是提供《 Android 裝置》去 確認它的系統中是否有相容於該《 USB 週邊設備》的應用程式。 5. 下載安裝相容應用程式:假若,它沒有找到合適的應用程式時,該訊息也會 提供一個 URL 網址,以供《 Android 裝置》的用戶至網路下載安裝相容於該 《 USB 週邊設備》的應用程式。(註:該 URL 網址可以是該應用程式在 Android Market 之中的下載網址) 6. 設備模式 ( Accessory Mode ) 開始運作:這個步驟完成後,《 USB 週邊設備》 會再傳送一個控制交易訊息給《 Android 裝置》,以告知《 Android 裝置》 可以進入設備模式 ( Accessory Mode ) 16
  • 17. Android Open Accessory Development Kit 開發環境所需工具  Java JDK 1.6以上  http://www.oracle.com/technetwork/java/javase/downloads/ index.html  Eclipse IDE開發工具  http://www.eclipse.org/  Android 開發工具ADT  http://developer.android.com/sdk/eclipse-adt.html  Android SDK (2.3.4以上版本)  http://developer.android.com/sdk/index.html  Microchip pic24 Development kit for android  http://www.microchip.com/stellent/idcplg?IdcService=SS_G ET_PAGE&nodeId=1406&dDocName=en553673  Android 實體手機(2.3.4以上/平版3.1以上)  ADK開發版H/W 17
  • 18. Android開發環境建置-JDK6下載 下載JDK環境  http://www.oracle.com/technetwork/java/javase/downloads/inde x.html為你把關每一道 學習品質 18
  • 19. Android開發環境建置-Eclipse 下載 下載安裝Eclipse開發工具  http://www.eclipse.org/downloads/為你把關每一道 學習品質 19
  • 20. Android開發環境建置-安裝ADT 安裝Android ADT開發環境為你把關每一道 學習品質 20
  • 21. Android開發環境建置-安裝ADT 透過Eclipse plugin安裝工具下載ADT  http://dl-ssl.google.com/android/eclipse/為你把關每一道 學習品質 21
  • 22. Android開發環境建置-下載SDK 下載Android SDK(也可透過ADT自動下載)  http://developer.android.com/intl/zh-TW/sdk/index.html為你把關每一道 學習品質 22
  • 23. Android開發環境建置-設定SDK 指定Android SDK所在路徑為你把關每一道 學習品質 23
  • 24. Android開發環境建置-更新SDK為你把關每一道 學習品質 24
  • 25. Android開發環境建置-更新SDK為你把關每一道 學習品質 25
  • 26. MicroChip ADK Lib 架構介紹 MicroChip提供更高階包裝的LIB  MicroChip提供一層更高階的warp類別,將複雜的 USB 連線,斷線,初始化,資料快取,Thread管 理.等等機制包裝起來,讓開發者可以更專注在資料 封包的制定與UI的互動設計上。  外包的類別分別為: USBAccessoryManager與 USBAccessoryManagerMessage 26
  • 27. MicroChip ADK Lib 架構介紹 USBAccessoryManager 類別  USB Accessory管理層,處理連線、斷線處理、資料的讀、寫  支援Buffer快取從USB讀入的資料  讀取部份使用單獨的work thread,可全雙工進行資料IO USBAccessoryManager 高階函式庫 handleravailable() Buffer Messagedisable()enable() ReadThreadisConnected()peek(byte[]) Create USBread(byte[]) Accessory InputStreamwrite(byte[]) 連線管理 OutputStream 27
  • 28. MicroChip ADK Lib 架構介紹 USBAccessoryManagerMessage 類別  提供Android Read Thread用來與UI Thread函式通訊用的封包  資料透過Java的封裝特性被封裝在USBAccessoryManagerMessage 中  最終資料將被掛在 android.os.message物件中(object欄位)透過 Handler傳送至UI Thread中處理。  USBAccessoryManagerMessage所所定義的封裝資料為: public enum MessageType { READ, ERROR, CONNECTED, DISCONNECTED, READY }; 28
  • 29. 與ADK進行連線通訊開發流程 STEP1:建立新的Android專案  SDK 目標版本需選擇在Level 10(含Google API版本)以上 29
  • 30. 與ADK進行連線通訊開發流程 STEP 2:載入所需的USB Lib  編輯AndroidManifest.xml,使用uses-library tag,輸入所需使用的usb函式庫 <uses-library android:name="com.android.future.usb.accessory" /> 4 1 5 6 3 2 30
  • 31. 與ADK進行連線通訊開發流程 STEP 3:撰寫USB Plug&Play 自動偵測USB裝置並開啟APP  於AndroidManifest.xml中利用intent-filter,濾出當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" />  另外需要外掛一個meta-data欄位,指定過濾的條件需為一個xml檔: <resources> <usb-accessory manufacturer=“Ittraining Technology Inc." model="Basic Accessory Demo"version="1.0"/> </resources> 31
  • 32. 與ADK進行連線通訊開發流程 STEP 4:滙入IT_ADK_LIB專案  IT_ADK_LIB專案中包含了USBAccessoryManager與 USBAccessoryManagerMessage 兩個高階函式類別, IT_ADK_LIB專 案己經宣告為Library型式的專案,可供其他Android Project直接引用。  在你的練習範例中宣告引入IT_ADK_LIB專案(專案上按右鍵點選內容) 32
  • 33. 與ADK進行連線通訊開發流程 STEP 5:於Activity中撰寫Handler類別  Handler, Message, Looper, MessageQueue 為Android設計在 不同Thread/Process之間互相通訊與傳遞訊息的機制,為 Android核心設計中相當重要的一環。 private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); } }; handleMessage handleMessagemessage 主執行緒 message Looper UI Thread 子執行緒 Looper MQ Push MQ Handler 33
  • 34. 與ADK進行連線通訊開發流程 STEP 6:建構USBAccessoryManager物件  建構式需帶入二個參數: Handler handler物件與int what 其中what指的是當USBAccessoryManager讀取到來至ADK開發 版的事件代碼,可供在handlerMessage函式中識別用。 private final static int USBAccessoryWhat = 0; private USBAccessoryManager accessoryManager public void onCreate(Bundle savedInstanceState) { ….略 accessoryManager = new USBAccessoryManager(handler, USBAccessoryWhat); ….略 } 34
  • 35. 與ADK進行連線通訊開發流程 STEP 6:依Activity生命週期啟動與關閉USBAccessoryManager  於onResume()中啟動USBAccessoryManager  於onPause()或onStop()函式關閉USBAccessoryManager public void onResume() { super.onResume(); accessoryManager.enable(this); } public void onStop () { super.onPause(); accessoryManager.disable(this); } 35
  • 36. 與ADK進行連線通訊開發流程 STEP 7:寫入資料至ADK開發版  包裝message封包,並透過handler物件將message封包送往UI Thread的Message Queue中排程,排程時間到時會交由 handlerMessage函式進行處理。  Message物件可以透過obtain取得快取中先前用過的message來 重複使用,可有效節省記憶體消耗。 public final Message obtainMessage (int what, int arg1, int arg2, Object obj)  透過Handler物件中的sendMessage將message推入 MessageQueue Message msg=handler.obtainMessage(1,0,0,null); handler.sendMessage(msg); 36
  • 37. 與ADK進行連線通訊開發流程 STEP 8:覆寫Handler中的handlerMessage函式  無論是從ADK開發版送上來的資料,或是準備要被寫入到ADK 開發版的資料,最終都會被送到MessageQueue中排程被處理。  系統的Looper物件會自動檢查MessageQueue中是否有資料需 要處理,若有則會自動呼叫handlerMessage函式。 public void handleMessage(Message msg) { switch(msg.what){ case USBAccessoryWhat: //從ADK開發版讀到的資料,資料被封裝在msg.obj物件中 switch(((USBAccessoryManagerMessage)msg.obj).type) { case READ: if(accessoryManager.isConnected() == false) return; break; case CONNECTED: break; case READY: setTitle("Ittraining Demo: Device connected."); break; case DISCONNECTED: disconnectAccessory(); break; } break; default: break; } } 37
  • 38. 與ADK進行連線通訊開發流程 STEP 9:ADK資料的讀、寫  ADK資料的讀寫可以透過USBAccessoryManager中的read與write函式 呼叫來完成處理。  其中read資料並不是直接和ADK開發版要求資料,而是直接向系統中的 Buffer取得資料(Manager中有實作Buffer快取) //回傳目前buffer中還有多少資料可以被讀取 int available() //從buffer中讀取 array大小的資料,回傳實際讀取了多少資料 int read(byte[] array) //從buffer中讀滿array的資料,回傳實際讀取了多少資料 int peek(byte[] array) //從buffer中丟棄指定大小的資料 void ignore(int num) 38
  • 39. 全雙工資料處理設計 提升ADK資料讀、寫效率  建立兩個執行緒,一個負責寫入資料,一個負責讀取資料。  子執行緒本身不具有Looper與MQ,因必須先為子執行緒建立Looper與MQ物件。 Activity USBAccessory Activity Activity Manager readHandler writeHandler handleMessage handleMessagemessage 讀取 寫入 message Looper Looper 執行緒 執行緒 MQ MQ 39
  • 40. 全雙工資料處理設計 替子執行緒產生Looper與MQ public static final void prepare() { if (sThreadLocal.get() != null) { throw new RuntimeException(Class subThread implements Runnable{ "Only one Looper may be created public void run(){ per thread"); } Looper.prepare(); 框架原始碼 sThreadLocal.set(new Looper()); workLooper = Looper.myLooper(); } h = new Handler(){ public handlerMessage(Message msg){ //處理message } }; private Looper() { Looper.loop(); 框架原始碼 mQueue = new MessageQueue(); mRun = true; } mThread = Thread.currentThread();} } 40
  • 41. 全雙工資料處理設計 如何於子執行緒中變更UI內容  在Android中非UI Thread是不能直接去控制UI,一但違反此條件,系統 將會造成應用強制結束。  在Android子執行緒要進入UI Thread去變更UI內容,有以下的四種方法• 透過掛Handler Push Message/Runnable於UI Thread 處理UI內容• 透過Activity.runOnUIThread(),直接指定進入UI Thread內處理• 透過View.Post(Runnable)介面處理• 透過AsncTask類別協助處理,需1.5版後的Android才有支援。 41
  • 42. ADK的除錯方式 ADK Debug方式  由於USB線被USB Accessory裝置給佔用,因此將無法使利用ADB透過 USB線做Debug的連線。  需改使用WiFi ADB連線,此功能需要root權限 WiFi ADB  可於market搜尋adb wifi 可以找到許多相關的軟體。  或是先利用USB 連接電腦透過adb 輸入以下指令: adb shell setprop service.adb.tcp.port 8000 stop adbd start adbd  在透過adb connect指令進行連線 //透過wifi進行adb連接 adb connect 192.168.1.103:8000 //讓手機進入監聽usb連線狀態 adb usb 42

×