我正在尝试向我的音频应用程序添加一个简单的广播接收器,以便当用户在他们的耳机上单击他们的 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
操作的接收器应该使用 AudioManager
的 registerMediaButtonEventReceiver()
方法注册,而不是常规的 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/