活动开始时收到Intent.ACTION_HEADSET_PLUG

我试图暂停拔下耳机时正在播放的音乐。

我创build了一个侦听ACTION_HEADSET_PLUG意图的BroadcastReceiver,并在状态额外为0(对于拔出)时对其执行操作。 我的问题是ACTION_HEADSET_PLUG意图是由我的BroadcastReceiver每当活动启动时收到。 这不是我所期望的行为。 我期望的意图只有当耳机插入或拔出插入。

在使用IntentFilter注册接收者之后,是否有理由立即捕获ACTION_HEADSET_PLUG Intent? 有没有一种清晰的方式可以解决这个问题?

我会假设,因为默认的音乐播放器实现类似的function,当耳机拔出,这将是可能的。

我错过了什么?

这是注册码

registerReceiver(new HeadsetConnectionReceiver(), new IntentFilter(Intent.ACTION_HEADSET_PLUG)); 

这是HeadsetConnectionReceiver的定义

 public class HeadsetConnectionReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Log.w(TAG, "ACTION_HEADSET_PLUG Intent received"); } } 

Solutions Collecting From Web of "活动开始时收到Intent.ACTION_HEADSET_PLUG"

谢谢杰克的回复。 我应该更新原来的post,以表明我发现了我所遇到的问题。 经过一番研究,我发现使用Context中的sendStickyBroadcast方法广播ACTION_HEADSET_PLUG Intent。

粘滞的意图在广播后由系统保存。 无论何时注册一个新的BroadcastReceiver来接收它,这个Intent都会被捕获。 包含最后更新值的注册后立即触发。 就耳机而言,当您首次注册接收机时,可以确定耳机已插入。

这是我用来接收ACTION_HEADSET_PLUG Intent的代码:

  private boolean headsetConnected = false; public void onReceive(Context context, Intent intent) { if (intent.hasExtra("state")){ if (headsetConnected && intent.getIntExtra("state", 0) == 0){ headsetConnected = false; if (isPlaying()){ stopStreaming(); } } else if (!headsetConnected && intent.getIntExtra("state", 0) == 1){ headsetConnected = true; } } } 

耳机拔出时,我使用其他方法停止播放。 我不希望你使用它,因为你已经很好,但其他一些人可能会觉得它有用。 如果你掌握了audio焦点,那么Android会发送一个事件audio变得嘈杂,所以如果你为这个事件写一个接收器,它会看起来像

  public void onReceive(Context context, Intent intent) { if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) { if (isPlaying()){ stopStreaming(); } } } 

我遇到了同样的问题。 我不确定是什么原因造成的,但至less在我的testing中,它似乎是一致的,这意味着你可以解决它。 我只是通过添加一个开始为true的布尔成员variables,并在第一次onReceive(Context, Intent)调用时设置为false。 这个标志然后控制我是否实际处理拔掉事件。

下面是我用来做这个的代码,可以在这里看到 。

 private boolean isFirst; public void onReceive(Context context, Intent intent) { if(!isFirst) { // Do stuff... } else { Log.d("Hearing Saver", "First run receieved."); isFirst = false; } }