注册Recevier
IntentFilter audioStateFilter = new IntentFilter(); audioStateFilter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED); audioStateFilter.addAction(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED); mReceiver = new VoiceDialerBroadcastReceiver(); registerReceiver(mReceiver, audioStateFilter);
取消Receiver
unregisterReceiver(mReceiver);
Receiver的实现
private class VoiceDialerBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); int state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1); if (false) Log.d(TAG, "HEADSET STATE -> " + state); if (state == BluetoothProfile.STATE_CONNECTED) { if (device == null) { return; } mBluetoothDevice = device; updateBluetoothParameters(true); } else if (state == BluetoothProfile.STATE_DISCONNECTED) { mBluetoothDevice = null; updateBluetoothParameters(false); } } else if (action.equals(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED)) { int state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1); int prevState = intent.getIntExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, -1); if (state == BluetoothHeadset.STATE_AUDIO_CONNECTED && mWaitingForScoConnection) { // SCO channel has just become available. mWaitingForScoConnection = false; if (mWaitingForTts) { // still waiting for the TTS to be set up. } else { // we now have SCO connection and TTS, so we can start. mHandler.postDelayed(new GreetingRunnable(), FIRST_UTTERANCE_DELAY); } } else if (prevState == BluetoothHeadset.STATE_AUDIO_CONNECTED) { if (!mWaitingForScoConnection) { // apparently our connection to the headset has dropped. // we won't be able to continue voicedialing. if (false) Log.d(TAG, "lost sco connection"); mHandler.post(new ErrorRunnable( R.string.headset_connection_lost)); exitActivity(); } } } } }
蓝牙语音识别
mBluetoothHeadset.startVoiceRecognition(mBluetoothDevice); mBluetoothHeadset.stopVoiceRecognition(mBluetoothDevice);
mAdapter = BluetoothAdapter.getDefaultAdapter(); if (BluetoothHeadset.isBluetoothVoiceDialingEnabled(this) && mAdapter != null) { if (!mAdapter.getProfileProxy(this, mBluetoothHeadsetServiceListener, BluetoothProfile.HEADSET)) { Log.e(TAG, "Getting Headset Proxy failed"); } } mAdapter.closeProfileProxy(BluetoothProfile.HEADSET, mBluetoothHeadset);
private BluetoothProfile.ServiceListener mBluetoothHeadsetServiceListener = new BluetoothProfile.ServiceListener() { public void onServiceConnected(int profile, BluetoothProfile proxy) { if (false) Log.d(TAG, "onServiceConnected"); mBluetoothHeadset = (BluetoothHeadset) proxy; List<BluetoothDevice> deviceList = mBluetoothHeadset.getConnectedDevices(); if (deviceList.size() > 0) { mBluetoothDevice = deviceList.get(0); int state = mBluetoothHeadset.getConnectionState(mBluetoothDevice); if (false) Log.d(TAG, "headset status " + state); // We are already connnected to a headset if (state == BluetoothHeadset.STATE_CONNECTED) { updateBluetoothParameters(true); return; } } updateBluetoothParameters(false); } public void onServiceDisconnected(int profile) { mBluetoothHeadset = null; } };
Detect the connection status of a paired Bluetooth headset to the phone. In Android 3.0 (API level 11) "BluetoothHeadset" class has "isAudioConnected()" method.
adapter = BluetoothAdapter.getDefaultAdapter(); adapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET); private BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() { public void onServiceConnected(int profile, BluetoothProfile proxy) { if (profile == BluetoothProfile.HEADSET) { mBluetoothHeadset = (BluetoothHeadset) proxy; } } public void onServiceDisconnected(int profile) { if (profile == BluetoothProfile.HEADSET) { mBluetoothHeadset = null; } } };
Use mBluetoothHeadset to call the functions on BluetoothHeadset.java
Note: Audio Connection is different from Connection.
BluetoothProfile.ServiceListener b = new BlueToothListener(); boolean profileProxy = BluetoothAdapter.getDefaultAdapter() .getProfileProxy(Handler.bot, b, BluetoothProfile.HEADSET); public class BlueToothListener implements ServiceListener { public static BluetoothHeadset headset; public static BluetoothDevice bluetoothDevice; @Override public void onServiceDisconnected(int profile) {// dont care headset = null; } @Override public void onServiceConnected(int profile, BluetoothProfile proxy) {// dont care try { Debugger.test("BluetoothProfile onServiceConnected "+proxy); if (proxy instanceof BluetoothHeadset) headset = ((BluetoothHeadset) proxy); else// getProfileProxy(Handler.bot, b, BluetoothProfile.HEADSET); return;// ^^ => NEVER List<BluetoothDevice> connectedDevices = proxy .getConnectedDevices(); for (BluetoothDevice device : connectedDevices) { Debugger.log("BluetoothDevice found :" + device); bluetoothDevice = device; int connectionState = headset.getConnectionState(bluetoothDevice); Debugger.log("BluetoothHeadset connectionState "+connectionState);//2 == OK boolean startVoiceRecognition = headset .startVoiceRecognition(device); if (startVoiceRecognition) { Debugger .log("BluetoothHeadset init Listener OK"); return; } else Notify.popup("Bluetooth headset can't start speech recognition"); } } catch (Exception e) { // } } } }
.