我正在开发一个VOIP客户端,并希望使用AT命令提供蓝牙呼叫控制功能。与本地电话拨号程序的内容相同。
问题陈述:
我有蓝牙耳机设备配对并连接到Android智能手机。
我已经使用了getProfileProxy(Context, BluetoothProfile.ServiceListener, int)
http://developer.android.com/reference/android/bluetooth/BluetoothHeadset.html
实施例: 获取BluetoothHeadset Proxy对象,
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if ( null != mBluetoothAdapter ) {
mBluetoothAdapter.getProfileProxy( BizRTCContextProvider.getContext(), mProfileListener, BluetoothProfile.HEADSET );
}
实施了一个监听器。
private BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() {
@Override
public void onServiceConnected(int profile, BluetoothProfile proxy) {
if (profile == BluetoothProfile.HEADSET) {
mBluetoothHeadset = (BluetoothHeadset) proxy;
}
}
@Override
public void onServiceDisconnected(int profile) {
if (profile == BluetoothProfile.HEADSET) {
mBluetoothHeadset = null;
}
}
};
此外,我尝试注册特定于供应商的事件,如下所示:
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction( BluetoothDevice.ACTION_ACL_CONNECTED );
intentFilter.addAction( BluetoothDevice.ACTION_ACL_DISCONNECTED );
intentFilter.addAction( BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED );
intentFilter.addAction( BluetoothHeadset.ACTION_VENDOR_SPECIFIC_HEADSET_EVENT );
//BluetoothHeadset.
//intentFilter.
intentFilter.addCategory( BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_COMPANY_ID_CATEGORY + "." + BluetoothAssignedNumbers.PLANTRONICS );
我能够在广播接收器内接收供应商特定的 AT 命令,并且能够解析命令,如下所示
public class BTReceiver extends BroadcastReceiver {
@Override
public void onReceive( Context context, Intent intent ) {
if( null == intent ) {
return;
}
String action = intent.getAction();
if ( BluetoothHeadset.ACTION_VENDOR_SPECIFIC_HEADSET_EVENT.equals( action ) ) {
String Command = intent.getStringExtra( BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD );
int type = intent.getIntExtra( BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD_TYPE, -1 );
}
}
问题在于,我无法接收标准AT命令(不是供应商特定的AT命令)。
我想使用 mBluetoothHeadset 代理对象发送/接收Basic AT命令
示例:
我希望从耳机接收AT命令 AT + BRSF = 123 ,并使用BluetoothHeadset对象将响应结果代码作为 + BRSF:219 发送回耳机。< / p>
我只能找到方法:
sendVendorSpecificResultCode (BluetoothDevice device, String command, String arg)
此方法仅限于使用 VENDOR_RESULT_CODE_COMMAND_ANDROID 作为命令。
出人意料地, 我可以使用 bluetoothSocket 成功发送和接收AT命令。课程如下
BluetoothDevice device;
private BluetoothSocket bthHandsfreeSocket_;
private InputStream bthInputStream_;
private OutputStream bthOutputStream_;
.......
....
//create socket
bthHandsfreeSocket_ = device.createRfcommSocketToServiceRecord( UUID );
.......
To create client connection
try{
bthHandsfreeSocket_.connect();
}
catch( exception exp) {
}
.........
//to get the input output streams
bthInputStream_ = bthHandsfreeSocket_.getInputStream();
bthOutputStream_ = bthHandsfreeSocket_.getOutputStream();
......
....
//to read the AT commands
bthInputStream_.read( buffer );
......
//to write the AT commands back.
bthOutputStream_.write( Commands );
从上面的方法,我可以发送/接收基本AT命令。
但这里的问题是
每当我尝试使用Android AudioManager路由音频时,蓝牙路由都会失败!!!!!
audioManager_.setBluetoothScoOn( true );
try{
Thread.sleep( delay );
audioManager_.startBluetoothSco();
}
catch( Exception e ){
}
我甚至尝试了几种模式
audioManager_.setMode( AudioManager.MODE_IN_CALL );
audioManager_.setMode( AudioManager.MODE_IN_COMMUNICATION );
依旧......
音频路线失败!因为这种方法。
但是当我使用 BluetoothHeadset 类作为代理配置文件对象时。 我不有任何音频路径问题。
但我无法使用此代理方法发送和接收Basic AT命令。
对此的任何帮助都将非常感激。 谢谢!