Android 蓝牙开发(二) --手机与蓝牙音箱配对,并播放音频
Android 藍牙開發(一) – 傳統藍牙聊天室
Android 藍牙開發(三) – 低功耗藍牙開發
項目工程BluetoothDemo
上一章中,我們已經學習了傳統藍牙的開發,這一章,我們來學習如何讓手機與藍牙耳機、音箱等連接配對,并實現音頻傳輸。
一、基礎知識
前面在 Android 藍牙開發(一) – 傳統藍牙聊天室 的文章中,我們已經對藍牙知識有個基本認識。而且從 Android 3.0 開始,Bluetooth API 支持藍牙配置文件,藍牙配置文件是適用于設備間藍牙通信的無線接口規范。
舉個例子:免提配置文件。如果手機要與無線耳機進行連接,則兩臺設備都必須支持免提配置文件。
而這一章中,我們要學習的就是 A2DP 配置文件
- A2DP:藍牙立體聲音頻傳輸配置文件 (A2DP) ,定義了如何通過藍牙連接和流式傳輸,將高質量音頻從一個設備傳輸至另一個設備。Android 提供 BluetoothA2dp 類,該類是用于控制藍牙 A2DP 服務的代理。
同時,A2DP 也定義了兩個角色:
- Audio Source :(音頻源) 音頻的輸入端對音頻數據進行編碼,發送到Sink端,一般指手機或者其他多媒體設備
- Audio Sink : (音頻接收器) 接收到音頻數據后,進行解碼操作還原出音頻,常見為藍牙音箱或耳機
二、連接設備
那么如何去連接一個藍牙配置文件呢?你需要遵循以下幾個步驟:
那么,我們可以這樣寫:
bluetooth = BluetoothAdapter.getDefaultAdapter() //拿到代理對象bluetooth.getProfileProxy(this, object : BluetoothProfile.ServiceListener {override fun onServiceConnected(profile: Int, proxy: BluetoothProfile?) {if (profile == BluetoothProfile.A2DP) {//拿到 BluetoothA2dpbluetoothA2dp = proxy as BluetoothA2dp}}override fun onServiceDisconnected(profile: Int) {if (profile == BluetoothProfile.A2DP) {bluetoothA2dp = null}}}, BluetoothProfile.A2DP)接著,需要使用到 BluetoothDevie,這個可以通過 BluetoothAdapter 拿到已配對或直接發現周圍設備區拿到,如果你對這個不熟悉,可以查看這篇文章 Android 藍牙開發(一) – 傳統藍牙聊天室。
首先,當還未配對時,先執行配對方法:
//未配對if (device.bondState != BluetoothDevice.BOND_BONDED) {val createSocket =BluetoothDevice::class.java.getMethod("createRfcommSocket",Int::class.java)createSocket.isAccessible = true//找一個通道去連接即可,channel 1~30socket = createSocket.invoke(device, 1) as BluetoothSocket//阻塞等待socket?.connect()//延時,以便于去連接sleep(2000)}可以看到,這里使用了反射,用 createRfcommSocket() 方法去建立 RFCOMM 通道,為啥不用 createRfcommSocketToServiceRecord(UUID) ?因為不知道藍牙音箱或耳機等的 UUID 啊,所以我們用這個方法,用某個通道去嘗試連接他們。
當配對之后,只是綁定了設備,還未連接,所以要執行連接的操作:
//連接 a2dp val connect =BluetoothA2dp::class.java.getMethod("connect", BluetoothDevice::class.java) connect.isAccessible = true val isSuccess = connect.invoke(bluetoothA2dp, device) as Boolean if (isSuccess) {listener.onConnected()break } else {listener.onFail("Blue connect fail ") }可以看到,也是用到了反射的方法的 connect ,它可以通過配置文件去連接設備,這樣執行只有,你就能聽到的藍牙音箱或耳機提示 “連接已成功” 的提示音了。
然后你播放一下手機的音視頻,發現聲音已經傳輸過去了。
我們無需自己去實現音頻的數據傳輸,BluetoothA2DP 已經幫我們實現好了。
當然,如果你想自己編碼且傳輸數據,再進行解碼也是可以的,自己去搞吧。。。
下一章,我們將學習低功耗藍牙
總結
以上是生活随笔為你收集整理的Android 蓝牙开发(二) --手机与蓝牙音箱配对,并播放音频的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何更新npm版本
- 下一篇: 禁止Mac自动打开Android Fil