赞
踩
上一章中,我们已经学习了传统蓝牙的开发,这一章,我们来学习如何让手机与蓝牙耳机、音箱等连接配对,并实现音频传输。
前面在 Android 蓝牙开发(一) – 传统蓝牙聊天室 的文章中,我们已经对蓝牙知识有个基本认识。而且从 Android 3.0 开始,Bluetooth API 支持蓝牙配置文件,蓝牙配置文件是适用于设备间蓝牙通信的无线接口规范。
举个例子:免提配置文件。如果手机要与无线耳机进行连接,则两台设备都必须支持免提配置文件。
而这一章中,我们要学习的就是 A2DP 配置文件
同时,A2DP 也定义了两个角色:
那么如何去连接一个蓝牙配置文件呢?你需要遵循以下几个步骤:
那么,我们可以这样写:
bluetooth = BluetoothAdapter.getDefaultAdapter() //拿到代理对象 bluetooth.getProfileProxy(this, object : BluetoothProfile.ServiceListener { override fun onServiceConnected(profile: Int, proxy: BluetoothProfile?) { if (profile == BluetoothProfile.A2DP) { //拿到 BluetoothA2dp bluetoothA2dp = 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~30 socket = 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 已经帮我们实现好了。
当然,如果你想自己编码且传输数据,再进行解码也是可以的,自己去搞吧。。。
转载:https://blog.csdn.net/u011418943/article/details/107849830
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。