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