Android BroadcastReceiver不会注册

我正在尝试在我的音频应用程序中添加一个简单的广播接收器,这样当用户点击他们的耳机上的ACTION_MEDIA_BUTTON时,我可以将所有内容静音。 我已经读过你可以在清单中注册它,也可以在代码中动态注册它。 我已经走了在代码中注册它的路径,因为我需要调用主活动类中的方法来响应媒体按钮按下。 然而,出于某种原因,我的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没有注册,因为如下所示包装寄存器会给我一个确认它为null的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我尝试在清单中注册我的接收器,就像这样……

      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)”部分,说“类型不匹配:无法从Object转换为AudioManager”

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

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

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

 am.registerMediaButtonEventReceiver(MediaButtonIntentReceiver); 

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

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

— END EDIT —————————–

希望有人可以帮助我。 如果我需要进一步供应,请告诉我。

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

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

我们还需要清单中列出的这个Receiver:

      

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

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

而且,正如我们已经建立的那样,您不需要mContext字段,因为您处于Activity上下文中,并且可以无需限定地使用getSystemService() 。 您也可以取消使用IntentFilter对象,因为清单中的列表已经处理了这一点。