2011-12-12 26 views

回答

3

我想出了解决方案:

private static final String ACTION_BT_HEADSET_STATE_CHANGED = "android.bluetooth.headset.action.STATE_CHANGED"; 
private static final int STATE_CONNECTED = 0x00000002; 
private static final int STATE_DISCONNECTED = 0x00000000; 
private static final String EXTRA_STATE = "android.bluetooth.headset.extra.STATE"; 

private BroadcastReceiver mBlueToothHeadSetEventReceiver = new BroadcastReceiver() { 

@Override 
public void onReceive(Context context, Intent intent) { 
    try { 
     String action = intent.getAction(); 

     if(action == null) 
      return; 

     if(action.equals(ACTION_BT_HEADSET_STATE_CHANGED)){ 
      int extraData = intent.getIntExtra(EXTRA_STATE , STATE_DISCONNECTED); 
      if(extraData == STATE_CONNECTED){ 

       //TODO : 

      }else if(extraData == STATE_DISCONNECTED){ 

       //TODO: 
      } 
     } 
     } catch (Exception e) { 

     //TODO: 

     } 
} 
}; 
+0

在我的设备(摩托罗拉里程碑2亦称Droid 2的)这个意图(android.bluetooth.headset.action.STATE_CHANGED)似乎不是STICKY,这意味着在应用程序启动时,为此意图注册BroadcastReceiver时,即使头戴式耳机处于连接状态,它总是返回NULL。我还为android.media.SCO_AUDIO_STATE_CHANGED注册了一个过滤器,并且它在启动时报告音频状态,这当然是不够的,因为这在大多数情况下是SCO_AUDIO_STATE_DISCONNECTED,并不意味着没有连接耳机。这是一个设备特定的行为? – Schlangi

0

这不会在应用程序启动真正的工作,但作为意向性过滤器会自动注册,你可能有一个有效的价值,一旦你的应用程序被启动:

声明如下意图过滤

 <intent-filter > 
      <action android:name="android.bluetooth.headset.action.AUDIO_STATE_CHANGED" /> 
     </intent-filter> 

,并在检查的onReceive您的接收器为:

if ("android.bluetooth.headset.action.AUDIO_STATE_CHANGED".equals(intent.getAction())) { 
    headsetAudioState = intent.getIntExtra("android.bluetooth.headset.extra.AUDIO_STATE", -2); 
} 

并将int保存为静态变量。只要您想知道BT音频是否连接(1)/断开连接(0),就可以随时访问它。不漂亮,但完成工作。

还检查了: https://github.com/android/platform_frameworks_base/blob/gingerbread/core/java/android/bluetooth/BluetoothHeadset.java

+0

在我看来,这不会有帮助。它告诉,如果有活动的音频连接。如果耳机已连接,则音频连接不会自动建立。但是,当您自己获取音频连接时(通过入侵startBluetoothSco()),您应该最新注册此事件,因为那样您可以在AUDIO_STATE_CONNECTED上响应以开始音频通道准备使用时需要执行的任何操作。 – Schlangi

0

从封装/应用/电话/ src目录/ COM /安卓/电话/ PhoneGlobals.java:1449

 } else if (action.equals(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED)) { 
      mBluetoothHeadsetState = intent.getIntExtra(BluetoothHeadset.EXTRA_STATE, 
                 BluetoothHeadset.STATE_DISCONNECTED); 
      if (VDBG) Log.d(LOG_TAG, "mReceiver: HEADSET_STATE_CHANGED_ACTION"); 
      if (VDBG) Log.d(LOG_TAG, "==> new state: " + mBluetoothHeadsetState); 
      updateBluetoothIndication(true); // Also update any visible UI if necessary 
相关问题