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 —————————–
希望有人可以帮助我。 如果我需要进一步供应,请告诉我。
应该使用AudioManager
的registerMediaButtonEventReceiver()
方法注册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
对象,因为清单中的列表已经处理了这一点。