当耳机拔掉时,我试着暂停正在播放的音乐。
我已经创建了一个BroadcastReceiver,它侦听ACTION_HEADSET_PLUG意图,并在状态extra为0时对它们执行操作(用于拔出)。我的问题是,每当活动启动时,BroadcastReceiver都会接收到BroadcastReceiver的意图。这不是我所期望的行为。我希望只有当耳机插上或拔掉插头时,才会触发它的意图。
是否有理由在向该ACTION_HEADSET_PLUG注册接收方之后立即捕获IntentFilter意图?我有明确的方法处理这个问题吗?
我认为,由于默认的音乐播放器实现了类似的功能,当耳机拔出时,这将是可能的。
我遗漏了什么?
这是注册码
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");
}
}发布于 2010-12-15 16:18:38
谢谢你的回复,杰克。我应该更新原来的帖子,以表明我发现了我的问题。经过一些研究,我发现ACTION_HEADSET_PLUG意图是在上下文中使用sendStickyBroadcast方法广播的。
系统在广播后保持粘稠的意图。只要注册了一个新的BroadcastReceiver来接收它,这个意图就会被捕获。在包含最后更新的值的注册后立即触发。在耳机的情况下,这是有用的,能够确定耳机已经插入当你第一次注册你的接收器。
这是我用来接收ACTION_HEADSET_PLUG意图的代码:
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;
}
}
}发布于 2013-09-06 19:15:59
当耳机拔掉时,我会使用不同的方法来停止播放。我不想让你使用它,因为你已经很好,但其他一些人可能会发现它是有用的。如果你控制了音频焦点,那么Android会给你发送一个事件音频变得嘈杂,所以如果你为这个事件写了一个接收器,它看起来就像
public void onReceive(Context context, Intent intent) {
if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
if (isPlaying()){
stopStreaming();
}
}
}发布于 2010-12-14 22:27:59
我遇到了同样的问题。我不知道是什么原因造成的,但至少在我的测试中,它似乎是一致的,这意味着您可以绕过它。为此,我添加了一个布尔成员变量,该变量从true开始,并在第一个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;
}
}https://stackoverflow.com/questions/4092438
复制相似问题