转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/71106622
本文已授权微信公众号 fanfan程序媛 独家发布 扫一扫文章底部的二维码或在微信搜索 fanfan程序媛 即可关注
五一过后,接着研究Android蓝牙hfp相关技术。本文主要内容是蓝牙手机音频的连接、断开流程分析,对应蓝牙HFP profile。
该文章是基于Android源码4.3的
1 hfp简单介绍 |
HFP (Hands-free Profile),让蓝牙设备(如蓝牙耳机)可以控制电话,如接听、挂断、拒接、语音拨号等,拒接、语音拨号要看蓝牙耳机及电话是否支持。
HFP定义了音频网关(AG)和免提组件(HF)两个角色:
音频网关(AG) – 该设备为音频(特别是手机)的输入/输出网关。
免提组件(HF) – 该设备作为音频网关的远程音频输入/输出机制,并可提供若干遥控功能。
2 手机音频连接 |
对于手机音频的使用,首先连接的蓝牙设备需要支持hfp协议,并且需要与该设备进行配对,如何进行蓝牙配对这里就不细说了,可以参照我的其他文章。主要分析下其连接过程。
对于系统自带应用Settings中已配对的蓝牙设备界面(如下图所示),
其对应文件路径:
packages/apps/Settings/src/com/android/settings/bluetooth/DeviceProfilesSettings.java
点击手机音频进行连接,调用onPreferenceChange。
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (preference == mDeviceNamePref) { //重命名
mCachedDevice.setName((String) newValue);
} else if (preference instanceof CheckBoxPreference) {
//check box
LocalBluetoothProfile prof = getProfileOf(preference); //获取对应的profile
onProfileClicked(prof, (CheckBoxPreference) preference);
return false; // checkbox will update from onDeviceAttributesChanged() callback
} else {
return false;
}
return true;
}
接着看onProfileClicked()函数处理
private void onProfileClicked(LocalBluetoothProfile profile, CheckBoxPreference profilePref) {
BluetoothDevice device = mCachedDevice.getDevice(); //获取配对的蓝牙设备
int status = profile.getConnectionStatus(device); //获取profile的连接状态
boolean isConnected =
status == Bluetooth