1.首先设置获取各种代理
defaultAdapter = BluetoothAdapter.getDefaultAdapter();
//获取A2DP代理对象
defaultAdapter.getProfileProxy(mContext, mListener, BluetoothProfile.A2DP);
//获取HEADSET代理对象
defaultAdapter.getProfileProxy(mContext, mListener, BluetoothProfile.HEADSET);
private BluetoothProfile.ServiceListener mListener = new BluetoothProfile.ServiceListener() {
@Override
public void onServiceDisconnected(int profile) {
if(profile == BluetoothProfile.A2DP){
mBluetoothA2dp = null;
}else if(profile == BluetoothProfile.HEADSET){
bluetoothHeadset = null;
}
}
@Override
public void onServiceConnected(int profile, BluetoothProfile proxy) {
if(profile == BluetoothProfile.A2DP){
mBluetoothA2dp = (BluetoothA2dp) proxy; //转换
connectedBluetooth();//得到连接设备
}else if(profile == BluetoothProfile.HEADSET){
bluetoothHeadset = (BluetoothHeadset) proxy;
}
}
};
2.连接一个蓝牙的时候需要断开其他的蓝牙
List<BluetoothDevice> connectedDevices = mBluetoothA2dp.getConnectedDevices();
if (connectedDevices != null && connectedDevices.size() > 0) {
for (BluetoothDevice bluetoothDevice2 : connectedDevices) {
BluetoothUtils.disConnectA2dp(bluetoothDevice2, mBluetoothA2dp);
BluetoothUtils.disConnectHeadset(bluetoothDevice2, bluetoothHeadset);
}
}
BluetoothUtils.connectA2dp(device,mBluetoothA2dp);
连接跟断开连接的方法
/**
* 连接蓝牙设备
*
* @param device
* @param mA2dp
*/
public static boolean connectA2dp(BluetoothDevice device, BluetoothA2dp mA2dp) {
boolean state = false;
if (mA2dp == null) {
return false;
}
setPriority(device, 100, mA2dp); //设置priority
try {
//通过反射获取BluetoothA2dp中connect方法(hide的),进行连接。
Method connectMethod = BluetoothA2dp.class.getMethod("connect",
BluetoothDevice.class);
state = (boolean) connectMethod.invoke(mA2dp, device);
} catch (Exception e) {
e.printStackTrace();
}
return state;
}
/**
* 断开 A2dp 连接
*
* @param device 设备
* @param mA2dp
*/
public static boolean disConnectA2dp(BluetoothDevice device, BluetoothA2dp mA2dp) {
if (mA2dp == null) {
return false;
}
setPriority(device, 0, mA2dp);
boolean connect = false;
try {
//通过反射获取BluetoothA2dp中connect方法(hide的),断开连接。
Method connectMethod = BluetoothA2dp.class.getMethod("disconnect", BluetoothDevice.class);
connect = (boolean) connectMethod.invoke(mA2dp, device);
} catch (Exception e) {
e.printStackTrace();
}
return connect;
}
/**
* 断开 Headset 连接
* @param bluetoothDevice
* @param bluetoothHeadset
* @return
*/
public static boolean disConnectHeadset(BluetoothDevice bluetoothDevice, BluetoothHeadset bluetoothHeadset) {
if (bluetoothHeadset == null) {
return false;
}
boolean result = false;
setHeadsetPriority(bluetoothDevice, 0, bluetoothHeadset);
try {
result = ((Boolean) BluetoothHeadset.class.getMethod("disconnect", new Class[]{BluetoothDevice.class}).invoke(bluetoothHeadset, new Object[]{bluetoothDevice})).booleanValue();
} catch (Exception ex) {
ex.printStackTrace();
}
return result;
}
public static void setHeadsetPriority(BluetoothDevice bluetoothDevice, int i, BluetoothHeadset bluetoothHeadset) {
try {
BluetoothHeadset.class.getMethod("setPriority", new Class[]{BluetoothDevice.class, Integer.TYPE}).invoke(bluetoothHeadset, new Object[]{bluetoothDevice, Integer.valueOf(i)});
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* 设置优先级
*
* @param device 设备
* @param priority 优先级
* @param mA2dp
*/
public static void setPriority(BluetoothDevice device, int priority, BluetoothA2dp mA2dp) {
try {//通过反射获取BluetoothA2dp中setPriority方法(hide的),设置优先级
Method connectMethod = BluetoothA2dp.class.getMethod("setPriority",
BluetoothDevice.class, int.class);
connectMethod.invoke(mA2dp, device, priority);
} catch (Exception e) {
e.printStackTrace();
}
}
(注:发现如果只是代理了BluetoothA2dp,没有代理BluetoothHeadset ,那么也可以断开蓝牙,但是你再连接其他蓝牙音箱后,可能会出现两个音箱都是连接状态,只不过一个在播放音乐一个没有播放,重启设备后自动连接上的蓝牙音箱也并不一定是关机前正在播放的)