經典藍牙的配置文件攻略

經典藍牙的配置文件攻略

1. 介紹

這裏講講經典藍牙的規範使用,平時我們使用藍牙電話、語音、文件傳輸等等都是建立在藍牙技術聯盟,一個以制定藍牙規範,與推動藍牙技術爲宗旨的跨國組織,所建立的規範中使用的,根據谷歌的基本api文檔啓動藍牙,根據不同的需求建立相應的協議連接就ok啦!

2. 源碼結構 (API 22)


如果想了解具體的藍牙源碼,可以到以下標記的源碼位置去一探究竟:
- 藍牙協議所在:/packages/apps/Bluetooth/src/com/android/bluetooth/

  • 藍牙設置所在:/packages/apps/Settings/src/com/android/settings/bluetooth
  • 電話管理所在: /packages/services/Telecomm/src/com/android/server/telecom/
    • 基本流程:settings界面發起,LocalBluetoothAdapter.java過渡,去framework的(BluetoothAdapter.java)轉消息後回到packages的AdapterService.java,再走JNI來的external控制藍牙

3. 藍牙協議解釋

  • Headset profile 提供了移動電話上的Bluetooth耳機支持。Android提供了BluetoothHeadset類,它是一個協議,用來通過IPC(interprocess communication)控制Bluetooth Headset Service。BluetoothHeadset既包含Bluetooth
    Headset profile也包含Hands-Free profile,還包括對AT命令的支持。
  • HFP (Hands-free Profile),免提模式,讓藍牙設備可以控制電話,如接聽、掛斷、拒接、語音撥號等,拒接、語音撥號要視藍牙耳機及電話是否支持。
  • HDP(Health Device Profile.),藍牙醫療設備模式,可以創建支持藍牙的醫療設備,使用藍牙通信的應用,例如心率監視器,血液,溫度計和秤。
  • AVRCP,音頻/視頻遠程控制配置文件,是用來聽歌時暫停,上下歌曲選擇的。
  • A2DP(Advanced Audio Distribution Profile),高級音頻傳輸模式。Android提供了BluetoothA2dp類,這是一個通過IPC來控制Bluetooth A2DP的協議。
  • HID (The Human Interface Device),人機交互接口,藍牙鼠標鍵盤什麼的就是這個了。該協議改編自USB HID Protocol。
  • OPP (Object Push Profile),對象存儲規範,最爲常見的,文件的傳輸都是使用此協議。
  • PAN (Personal Area Network),描述了兩個或更多個藍牙設備如何構成一個即時網絡,和網絡有關還有串行端口功能(SPP),撥號網絡功能(DUN)。
  • PBAP (Phonebook Access Profile),電話號碼簿訪問協議。

4. 實際操作

演示一下藍牙電話Headset profile

  • 首先添加權限
    <manifest ... >
      <uses-permission android:name="android.permission.BLUETOOTH" />
      <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
      ...
    </manifest>
  • 啓動藍牙
    val mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
    mBluetoothAdapter.enable()
  • 設置藍牙協議監聽器,按照藍牙協議連接連接打開或斷開的時候會走該回調,成功會建立一個協議的句柄,用以控制協議所規定的功能。
    var mServiceListener: BluetoothProfile.ServiceListener = object : BluetoothProfile.ServiceListener {

        override fun onServiceDisconnected(profile: Int) {
            Log.d("just2lab","profile onServiceDisconnected:$profile")
            if (profile == getHFPProfileIndex()) {
                mBluetoothHeadset = null
            }
        }

        override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
            Log.d("just2lab","profile onServiceConnected:$profile,$proxy")
            if (profile == getHFPProfileIndex()) {
                mBluetoothHeadset = proxy
                L.d("proxy: $profile,mheadset:$mBluetoothHeadset")
            }
        }
    }
  • 開始建立協議,啓動協議監聽器的回調。如此就可以使用mBluetoothHeadset的各種功能了
    mBluetoothAdapter.getProfileProxy(context, mServiceListener, getHFPProfileIndex())
  • 注意大多數時候回調的協議句柄可能是隱藏類,這時可以考慮反射調用了。
  • 最後別忘了關閉協議
    mBluetoothAdapter.closeProfileProxy(mBluetoothHeadset)

5. BluetoothHeadsetClient的常用方法(反射/拷貝類)

  • connect 連接設備
  • disconnect 斷開連接
  • getAudioState 獲取音頻連接狀態
  • connectAudio 連接音頻
  • disconnectAudio 斷開音頻
  • dial 撥號
  • acceptCall 接聽
  • rejectCall 拒接
  • terminateCall 結束通話
  • sendDTMF DTMF(Dual Tone Multi Frequency),雙音多頻,發送給被叫號碼的用戶信號,就是我們經常使用的“按1,xxx;按2,xxx…”

6. 一些事件廣播的監聽

  • BluetoothAdapter.ACTION_STATE_CHANGED:監聽藍牙打開與否的狀態
  • BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED:監聽藍牙設備連接狀態
  • BluetoothDevice.ACTION_PAIRING_REQUEST :監聽藍牙設備配對請求,可以設置自動配對等等
  • BluetoothDevice.ACTION_BOND_STATE_CHANGED:監聽藍牙設備綁定狀態
  • “android.bluetooth.headsetclient.profile.action.AG_CALL_CHANGED” :監聽藍牙電話狀態,隱藏類,使用字符串比較方便。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章