首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在活动开始时接收到Intent.ACTION_HEADSET_PLUG

在活动开始时接收到Intent.ACTION_HEADSET_PLUG
EN

Stack Overflow用户
提问于 2010-11-03 23:03:28
回答 3查看 17.9K关注 0票数 16

当耳机拔掉时,我试着暂停正在播放的音乐。

我已经创建了一个BroadcastReceiver,它侦听ACTION_HEADSET_PLUG意图,并在状态extra为0时对它们执行操作(用于拔出)。我的问题是,每当活动启动时,BroadcastReceiver都会接收到BroadcastReceiver的意图。这不是我所期望的行为。我希望只有当耳机插上或拔掉插头时,才会触发它的意图。

是否有理由在向该ACTION_HEADSET_PLUG注册接收方之后立即捕获IntentFilter意图?我有明确的方法处理这个问题吗?

我认为,由于默认的音乐播放器实现了类似的功能,当耳机拔出时,这将是可能的。

我遗漏了什么?

这是注册码

代码语言:javascript
复制
registerReceiver(new HeadsetConnectionReceiver(), 
                 new IntentFilter(Intent.ACTION_HEADSET_PLUG));

这是HeadsetConnectionReceiver的定义

代码语言:javascript
复制
public class HeadsetConnectionReceiver extends BroadcastReceiver {

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

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-15 16:18:38

谢谢你的回复,杰克。我应该更新原来的帖子,以表明我发现了我的问题。经过一些研究,我发现ACTION_HEADSET_PLUG意图是在上下文中使用sendStickyBroadcast方法广播的。

系统在广播后保持粘稠的意图。只要注册了一个新的BroadcastReceiver来接收它,这个意图就会被捕获。在包含最后更新的值的注册后立即触发。在耳机的情况下,这是有用的,能够确定耳机已经插入当你第一次注册你的接收器。

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

代码语言:javascript
复制
 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;
         }
     }
 }
票数 22
EN

Stack Overflow用户

发布于 2013-09-06 19:15:59

当耳机拔掉时,我会使用不同的方法来停止播放。我不想让你使用它,因为你已经很好,但其他一些人可能会发现它是有用的。如果你控制了音频焦点,那么Android会给你发送一个事件音频变得嘈杂,所以如果你为这个事件写了一个接收器,它看起来就像

代码语言:javascript
复制
 public void onReceive(Context context, Intent intent) {
if  (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) { 
       if (isPlaying()){
            stopStreaming();
        }
    }
 }
票数 1
EN

Stack Overflow用户

发布于 2010-12-14 22:27:59

我遇到了同样的问题。我不知道是什么原因造成的,但至少在我的测试中,它似乎是一致的,这意味着您可以绕过它。为此,我添加了一个布尔成员变量,该变量从true开始,并在第一个onReceive(Context, Intent)调用中设置为false。然后,此标志控制是否实际处理拔出事件。

作为参考,下面是我使用的代码,它可以在上下文这里中使用。

代码语言:javascript
复制
private boolean isFirst;

public void onReceive(Context context, Intent intent)
{
    if(!isFirst)
    {
        // Do stuff...
    }
    else
    {
        Log.d("Hearing Saver", "First run receieved.");
        isFirst = false;
    }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4092438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档