日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 蓝牙开发(二) --手机与蓝牙音箱配对,并播放音频

發布時間:2024/1/18 Android 71 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 蓝牙开发(二) --手机与蓝牙音箱配对,并播放音频 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android 藍牙開發(一) – 傳統藍牙聊天室
Android 藍牙開發(三) – 低功耗藍牙開發
項目工程BluetoothDemo

上一章中,我們已經學習了傳統藍牙的開發,這一章,我們來學習如何讓手機與藍牙耳機、音箱等連接配對,并實現音頻傳輸。

一、基礎知識

前面在 Android 藍牙開發(一) – 傳統藍牙聊天室 的文章中,我們已經對藍牙知識有個基本認識。而且從 Android 3.0 開始,Bluetooth API 支持藍牙配置文件,藍牙配置文件是適用于設備間藍牙通信的無線接口規范
舉個例子:免提配置文件。如果手機要與無線耳機進行連接,則兩臺設備都必須支持免提配置文件。
而這一章中,我們要學習的就是 A2DP 配置文件

  • A2DP:藍牙立體聲音頻傳輸配置文件 (A2DP) ,定義了如何通過藍牙連接和流式傳輸,將高質量音頻從一個設備傳輸至另一個設備。Android 提供 BluetoothA2dp 類,該類是用于控制藍牙 A2DP 服務的代理。

同時,A2DP 也定義了兩個角色:

  • Audio Source :(音頻源) 音頻的輸入端對音頻數據進行編碼,發送到Sink端,一般指手機或者其他多媒體設備
  • Audio Sink : (音頻接收器) 接收到音頻數據后,進行解碼操作還原出音頻,常見為藍牙音箱或耳機

二、連接設備

那么如何去連接一個藍牙配置文件呢?你需要遵循以下幾個步驟:

  • 獲取 BluetoothAdapter
  • 設置 BluetoothProfile.ServiceListener,它會監聽 BluetoothProfile 客戶端連接到服務或斷開服務時回調
  • 通過 BluetoothAdapter 的 getProfileProxy() 方法,傳入上面的BluetoothProfile.ServiceListener 和 BluetoothProfile.A2DP ,拿到 BluetoothA2dp 對象。
  • 使用 BluetoothDevice 去配置或者直接連接
  • 使用 bluetoothAdapter.closeProfileProxy() 關閉代理對象
  • 那么,我們可以這樣寫:

    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 蓝牙开发(二) --手机与蓝牙音箱配对,并播放音频的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。