java - Android BroadcastReceiver 不会注册

标签 java android android-intent broadcastreceiver

我正在尝试向我的音频应用程序添加一个简单的广播接收器,以便当用户在他们的耳机上单击他们的 ACTION_MEDIA_BUTTON 时我可以将所有内容静音。我读过您可以在 list 中注册它,也可以在代码中动态注册它。我已经沿着在代码中注册它的路径前进,因为我需要在我的主要 Activity 类中调用方法来响应媒体按钮按下。然而,出于某种原因,我的 BroadcastReceiver 不会注册,而且我找不到任何可以解释原因的信息(白发增加)。

以下是我在 MainActivity.java 中的内容:

public class MainActivity extends Activity {

  public IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);

  public BroadcastReceiver MediaButtonIntentReceiver =
            new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {

                    String intentAction = intent.getAction();
                    if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
                        KeyEvent event = (KeyEvent) intent
                                .getParcelableExtra(Intent.EXTRA_KEY_EVENT);
                        int action = event.getAction();
                        if (action == KeyEvent.ACTION_DOWN) {

                            Log.e("INFO", "Media Button Pressed");
                            MuteAll();

                        }


                }
           }
  };

  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);       

      // Register media button event receiver
      intentFilter.addAction("android.intent.action.ACTION_MEDIA_BUTTON");
      intentFilter.setPriority(10000);
      this.registerReceiver(MediaButtonIntentReceiver, intentFilter);

      }

@Override
protected void onDestroy() {
    super.onDestroy();

    // Unregister media button event receiver
    unregisterReceiver(MediaButtonIntentReceiver);

    }
};

我确定 BroadcastReceiver 没有注册,因为如下所示包装寄存器让我 toast 确认它是空的:

  if (registerReceiver(MediaButtonIntentReceiver, intentFilter) == null) 
  {
      Toast.makeText(this, "Could not register receiver", Toast.LENGTH_LONG).show();
  } else {
      Toast.makeText(this, "Receiver registered", Toast.LENGTH_LONG).show();
  }

编辑: 到目前为止,我还根据建议尝试了以下方法:

通读 - http://developer.android.com/training/managing-audio/volume-playback.html 我试过像这样在 list 中注册我的接收器......

<receiver android:name="com.mydomain.myapp.MainActivity$MediaButtonIntentReceiver">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>

And then added the following example code:
public AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
...
// Start listening for button presses
am.registerMediaButtonEventReceiver(RemoteControlReceiver);

Eclipse 提示 mContext 没有解决任何问题,所以我添加了以下内容:

private Context mContext;

然后它提示“mContext.getSystemService(Context.AUDIO_SERVICE)”部分,说“类型不匹配:无法从对象转换为 AudioManager”

所以我向 AudioManager 添加了一个转换:

public AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);

然后添加建议的接收者注册码:

am.registerMediaButtonEventReceiver(MediaButtonIntentReceiver);

它提示“registerMediaButtonEventReceiver”说“类型 AudioManager 中的方法 registerMediaButtonEventReceiver(ComponentName) 不适用于参数 (BroadcastReceiver)”

显然我在这里做错了什么。我已如图所示输入他们的示例代码,但它甚至无法编译。

--- 结束编辑----------------------------

希望有人能帮助我。如果我需要进一步提供任何东西,请告诉我。

最佳答案

ACTION_MEDIA_BUTTON 操作的接收器应该使用 AudioManagerregisterMediaButtonEventReceiver() 方法注册,而不是常规的 registerReceiver () 方法在 Activity 中。然而,与普通的动态 Receiver 注册不同,此方法将类作为参数,而不是类的实例。最简单的方法是为它创建一个单独的类文件:

public class MediaButtonIntentReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        ...
    }
}

我们还需要在 list 中列出此接收器:

<receiver android:name=".MediaButtonIntentReceiver" >
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>

现在,我们提到的链接中的示例是错误的,因为 registerMediaButtonEventReceiver() 方法需要一个 ComponentName 对象,而不仅仅是接收器类本身。我们需要将示例更改如下:

AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
am.registerMediaButtonEventReceiver(
    new ComponentName(this, MediaButtonIntentReceiver.class));

而且,正如我们已经确定的,您不需要 mContext 字段,因为您在 Activity 上下文中,并且可以只使用 getSystemService () 没有资格。您还可以取消 IntentFilter 对象,因为 list 中的列表已经处理了这一点。

关于java - Android BroadcastReceiver 不会注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25105687/

相关文章:

java - 如何为android项目生成不同分辨率的图像?

android - 了解网络连接何时恢复

java - 我的 Android 服务无法继续运行

android - 找不到类异常 Android

java - 鼠标监听器界面和绘画

javascript - Selenium 和 PhantomJS 不解析 Javascript

java - Firebase 数据库和 Firebase Firestore 数据操作和检索数据的问题

java - Android 如何标记一个句子

java - 我的拖放功能在 Android Studio 中不起作用

java.lang.IllegalStateException : No bean class specified on bean definition