跳到主要內容
黯羽輕揚每天積累一點點

Android 藍牙連線 Demo 解析

免費2015-03-16#Android#Solution#蓝牙联机#BluetoothChat

最近和朋友一起搗鼓一個手遊,有雙人對戰部分的設計,初步計劃用藍牙實現連線,找到了官方 Demo 以及相關資料,分析理解後做了詳細注釋,資源可供下載。

寫在前面:

手遊的雙人對戰實現方式有很多,比如:

  • 連網對戰(需要一個伺服器負責轉發用戶端請求,各種大型手遊的做法)
  • 分屏對戰(手機上下分屏,典型的例子就是切水果的雙人對戰)
  • 藍牙連線對戰(透過藍牙連線,典型的例子是三國 Kill 連線版)

首先,連網對戰不考慮(成本高,伺服器貴..),而分屏對戰侷限性太大(兩個人用一個手機玩,太不方便了)

所以藍牙連線對戰是不錯的選擇,低成本,可實現(三國 Kill 就是最好的例子,至少證明了這是可行的)

一. 資源蒐集

搜尋「安卓開發藍牙連線」,找到很多有用的資訊,經過篩選發現大多資訊都是與 BluetoothChat 有關的,了解後發現 BluetoothChat 是一個官方 Demo,這就好辦了

先把原始碼 down 過來,又順便找到了前輩的原始碼解析,省了好多事兒,簡單整理了一下,資源如下:(前兩個來自網路,後兩個是新鮮出爐的)

二. Demo 測試

拿到 Demo 先確定可以用:

  1. 匯入 Eclipse,出現紅叉叉,修改 AndroidManifest.xml 中的 SDK 版本,紅叉叉沒了
  2. 連接手機,安裝執行,程式異常終止,檢查 Log,錯誤訊息為 you can not combine custom titles with other title
  3. 最後更改資源檔案解決了這個問題,問題詳細及解決方案如下:
  4. 測試成功,真機連線聊天沒問題

使用 Demo 中可能遇到的問題:

  • you can not combine custom titles with other title 錯誤原因以及怎麼解決?
原因:xml 裡面定義的 activity 的 theme 和程式碼定義的 theme 不一致,即 title 樣式衝突
解決方案:把 xml 裡對應的 activity 裡的 theme 改成 @android:style/Theme
注意:如果 xml 裡 activity 沒有 theme 標籤,應該添加 theme 標籤並設置為上面的值

真機執行效果如下:

三. 藍牙連線過程

  1. 宣告藍牙相關權限(關於權限的詳細見前輩的原始碼解析,不在此贅述)
  2. 獲取本機藍牙配接器(BluetoothAdapter 是系統提供的藍牙介面,透過配接器操作本機藍牙)
  3. 掃描可連接的外部藍牙設備(透過接收藍牙模組回傳的廣播訊息得到外部設備的相關資訊)
  4. 獲取外部設備的 MAC 位址
  5. 透過 MAC 位址建立 Socket 連接(有了 Socket 連接就好辦了,下面的工作和一般的 Socket 聊天程式沒什麼區別了)
  6. 透過 Socket 連接收發訊息

簡單的說,連線過程就是上面幾個步驟,筆者對原始碼進行理解分析後(參照了前輩的原始碼解析),補充了更易讀的注釋,如:

四. 總結

原始碼分析是一件耗時耗力的事情,但如果有時間的話,這樣的付出絕對是值得的,比單純的 copy-modify 要好很多,在分析別人的程式碼過程中,我們可以得到這些東西:

  • 實現原理(比如用來實現功能的各個組件的分工、互動,而不只是簡單的了解程式碼區塊的功能)
  • 編碼規範(比如一開始會很好奇為什麼要分方法,分類,分層...)
  • 編碼風格(變數、方法、類別、套件的命名規則,縮排風格...)
  • 小技巧/常識(比如為了避免發佈前刪除偵錯資訊的工作,可以定義一個標識變數表示處於偵錯階段,把所有輸出偵錯資訊的程式碼包裹在 if 區塊中,發佈前只需要把標識變數改為 false 即可)

評論

暫無評論,快來發表你的看法吧

提交評論