您的位置:首页 > 其它

经典蓝牙的配置文件攻略

2017-06-21 14:07 274 查看

经典蓝牙的配置文件攻略

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” :监听蓝牙电话状态,隐藏类,使用字符串比较方便。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  蓝牙