失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > android蓝牙耳机接入 Android跟蓝牙耳机建立连接有两种方式

android蓝牙耳机接入 Android跟蓝牙耳机建立连接有两种方式

时间:2019-11-10 13:16:10

相关推荐

android蓝牙耳机接入 Android跟蓝牙耳机建立连接有两种方式

2. 蓝牙耳机主动跟Android 连首先BluetoothAudioGateway 会在一个线程中收到来自蓝牙耳机的RFCOMM 连接,然后发送消息给BluetoothHeadsetService。

mConnectingHeadsetRfcommChannel = -1;

mConnectingHandsfreeRfcommChannel = -1;

if(waitForHandsfreeConnectNative(SELECT_WAIT_TIMEOUT) == false) {

if (mTimeoutRemainingMs > 0) {

try {

Log.i(tag, "select thread timed out, but " +

mTimeoutRemainingMs + "ms of

waiting remain.");

Thread.sleep(mTimeoutRemainingMs);

} catch (InterruptedException e) {

Log.i(tag, "select thread was interrupted (2),

exiting");

mInterrupted = true;

}

}

}

BluetoothHeadsetService 会根据当前的状态来处理消息,分3 种情况,第一是当前状态是非连接状态,会发送RFCOMM_CONNECTED 消息,后续处理请参见前面的分析。

case BluetoothHeadset.STATE_DISCONNECTED:

// headset connecting us, lets join

setState(BluetoothHeadset.STATE_CONNECTING);

mHeadsetAddress = info.mAddress;

mHeadset = new HeadsetBase(mBluetooth, mHeadsetAddress,info.mSocketFd,info.mRfcommChan,mConnectedStatusHandler);

mHeadsetType = type;

mConnectingStatusHandler.obtainMessage(RFCOMM_CONNECTED).sendToTarget();

break;

如果当前是正在连接状态, 则先停掉已经存在的ConnectThread,并直接调用BluetoothHandsfree 去建立SCO 连接。

case BluetoothHeadset.STATE_CONNECTING:

// If we are here, we are in danger of a race condition

// incoming rfcomm connection, but we are also attempting an

// outgoing connection. Lets try and interrupt the outgoing

// connection.

mConnectThread.interrupt();

// Now continue with new connection, including calling callback

mHeadset = new HeadsetBase(mBluetooth,mHeadsetAddress,info.mSocketFd,info.mRfcommChan,mConnectedStatusHandler);

mHeadsetType = type;

setState(BluetoothHeadset.STATE_CONNECTED,BluetoothHeadset.RESULT_SUCCESS);

mBtHandsfree.connectHeadset(mHeadset,mHeadsetType);

// Make sure that old outgoing connect thread is dead.

break;

如果当前是已连接的状态,这种情况是一种错误case,所以直接断掉所有连接。

case BluetoothHeadset.STATE_CONNECTED:

if (DBG) log("Already connected to " + mHeadsetAddress + ",disconnecting" +info.mAddress);

mBluetooth.disconnectRemoteDeviceAcl(info.mAddress);

break;

蓝牙耳机也可能会主动发起SCO 连接, BluetoothHandsfree 会接收到一个SCO_ACCEPTED消息,它会去调用AudioManager 的setBluetoothScoOn 函数,从而通知音频系统有个蓝牙耳机可用了。到此,蓝牙耳机完成了和Android 的全部连接。

case SCO_ACCEPTED:

if (msg.arg1 == ScoSocket.STATE_CONNECTED) {

if (isHeadsetConnected() && mAudioPossible && mConnectedSco ==null) {

Log.i(TAG, "Routing audio for incoming SCO connection");

mConnectedSco = (ScoSocket)msg.obj;

mAudioManager.setBluetoothScoOn(true);

} else {

Log.i(TAG, "Rejecting incoming SCO connection");

((ScoSocket)msg.obj).close();

}

} // else error trying to accept, try again

mIncomingSco = createScoSocket();

mIncomingSco.accept();

break;

如果觉得《android蓝牙耳机接入 Android跟蓝牙耳机建立连接有两种方式》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。