Java Android BroadcastReceiver赢得';t寄存器

Java Android BroadcastReceiver赢得';t寄存器,java,android,android-intent,broadcastreceiver,Java,Android,Android Intent,Broadcastreceiver,我正在尝试在我的音频应用程序中添加一个简单的广播接收器,这样当用户单击耳机上的“动作\媒体\按钮”时,我就可以将所有内容静音。我已经读到,您可以在清单中注册它,也可以在代码中动态注册它。我已经在代码中注册了它,因为我需要在我的主活动类中调用方法来响应媒体按钮的按下。然而,由于某种原因,我的广播接收器无法注册,我也找不到任何解释原因的东西(白发增多) 以下是MainActivity.java中的内容: public class MainActivity extends Activity {

我正在尝试在我的音频应用程序中添加一个简单的广播接收器,这样当用户单击耳机上的“动作\媒体\按钮”时,我就可以将所有内容静音。我已经读到,您可以在清单中注册它,也可以在代码中动态注册它。我已经在代码中注册了它,因为我需要在我的主活动类中调用方法来响应媒体按钮的按下。然而,由于某种原因,我的广播接收器无法注册,我也找不到任何解释原因的东西(白发增多)

以下是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没有注册,因为按如下方式包装注册会让我举杯确认它为空:

  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();
  }
编辑: 根据目前的建议,我还尝试了以下方法:

通读- 我试着在舱单上注册我的接收人,就像这样

<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);
然后它抱怨“mContext.getSystemService(Context.AUDIO_SERVICE)”部分,说“类型不匹配:无法从对象转换到AudioManager”

所以我给AudioManager添加了一个演员阵容:

public AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
然后添加建议的接收者注册码:

am.registerMediaButtonEventReceiver(MediaButtonIntentReceiver);
对此,它抱怨“registerDiaButtoneVentReceiver”说“AudioManager类型中的方法registerDiaButtoneVentReceiver(ComponentName)不适用于参数(BroadcastReceiver)”

很明显我做错了什么。我已经输入了他们的示例代码,如图所示,但它甚至没有编译

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


希望有人能帮助我。如果我需要提供更多信息,请告诉我。

用于
操作
媒体按钮操作的接收器应注册到
AudioManager的
RegisterDiaButtoneVentreceiver()
方法,而不是
活动中的常规
registerReceiver()
方法。但是,与普通的动态接收器注册不同,此方法将类作为参数,而不是类的实例。最简单的方法是为其创建单独的类文件:

public class MediaButtonIntentReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        ...
    }
}
我们还需要清单上列出的接收人:

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

而且,正如我们所确定的,您不需要
mContext
字段,因为您处于
活动
上下文中,可以无条件地使用
getSystemService()
。您还可以取消
IntentFilter
对象,因为清单中的列表已经解决了这一问题。

由于
操作\u媒体\u按钮
广播不是粘性意图,
registerReceiver()
将返回null。你查阅过这一页吗?谢谢你的回复。是的,我读了很多其他的页面,但我对广播的方式和意图缺乏理解似乎是我最大的问题。嗨,迈克,我编辑了我的原始帖子,将我尝试遵循你建议的链接中的示例的输出包括在内。有什么想法吗?嗯,目前的主要问题是,您正在尝试注册MediaButtonEntreceiver的实例,但它只需要类。使MediaButtonEntreceiver成为一个
扩展BroadcastReceiver
的类。另外,去掉
mContext
声明,使用
this.getSystemService()
,或者只使用
getSystemService()
,因为它在活动上下文中。
<receiver android:name=".MediaButtonIntentReceiver" >
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>
AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
am.registerMediaButtonEventReceiver(
    new ComponentName(this, MediaButtonIntentReceiver.class));