如何使用Android BluetoothHeadset类发送/接收基本AT命令?

时间:2016-04-07 19:17:53

标签: android-bluetooth

我正在开发一个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命令。

对此的任何帮助都将非常感激。 谢谢!

0 个答案:

没有答案