我正在为Android OS 4.0.3(ICS)编写一个Android应用程序.问题是我没有从BroadcastReceive的onReceive()方法获取Log.d()的输出,这意味着我的应用程序没有正确处理广播.
我已经阅读了关于如何在单击ACTION_MEDIA_BUTTON时运行代码的无数问题.当我的工作不起作用时,我甚至复制+粘贴代码,只是为了看看它是否可行.
我想要处理的ACTION_MEDIA_BUTTON是耳机上的单个按钮,允许用户接听/结束通话,播放/暂停音乐.当我点击它时,而不是我的应用程序处理此按钮,我的Nexus S Android上的股票音乐播放器开始播放一首歌曲.
我没有将我的代码放在另一个类中,也许这就是为什么它不起作用?
这是在onCreate()方法上找到的代码(这个特定的代码是在我编写的代码无效后从网站上复制的):
IntentFilter mediaButtonFilter = new IntentFilter(
Intent.ACTION_MEDIA_BUTTON);
mediaButtonFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
BroadcastReceiver brMediaButton = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
Log.d("Event", "Media button!");
this.abortBroadcast();
KeyEvent key = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if(key.getAction() == KeyEvent.ACTION_UP) {
int keycode = key.getKeyCode();
if(keycode == KeyEvent.KEYCODE_MEDIA_NEXT) {
Log.d("TestApp", "Next Pressed");
} else if(keycode == KeyEvent.KEYCODE_MEDIA_PREVIOUS) {
Log.d("TestApp", "Previous pressed");
} else if(keycode == KeyEvent.KEYCODE_HEADSETHOOK) {
Log.d("TestApp", "Head Set Hook pressed");
}
}
} …Run Code Online (Sandbox Code Playgroud) 目标是拦截来自耳机的广播以及最终的蓝牙,以响应来自耳机的不同类型的点击以改变媒体播放器.此解决方案适用于ICS之前的所有版本.这是我尝试过的一些代码和事情:
....
private BroadcastReceiver mediaButtonReceiver = new MediaButtonIntentReceiver();
....
public void onCreate() {
...
IntentFilter mediaFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
mediaFilter.setPriority(2147483647); // this is bad...I know
this.registerReceiver(mediaButtonReceiver, mediaFilter);
...
}
public class MediaButtonIntentReceiver extends BroadcastReceiver {
private KeyEvent event;
public MediaButtonIntentReceiver() {
super();
}
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
return;
}
event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (event == null) {
return;
}
try {
int action = event.getAction();
switch(action) {
case KeyEvent.ACTION_UP …Run Code Online (Sandbox Code Playgroud) android media-player android-intent android-4.0-ice-cream-sandwich
我试着花时间System.currentTimeMillis(),而不是用户按下媒体按钮.但回调是在媒体按钮再次上升时执行的action == KeyEvent.ACTION_UP.
我不想在我的解决方案中使用BroadcastReceiver.
这是我的代码:
MediaSession audioSession = new MediaSession(getApplicationContext(), "TAG");
audioSession.setCallback(new MediaSession.Callback() {
@Override
public boolean onMediaButtonEvent(final Intent mediaButtonIntent) {
String intentAction = mediaButtonIntent.getAction();
if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction))
{
KeyEvent event = (KeyEvent)mediaButtonIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (event != null)
{
int action = event.getAction();
if (action == KeyEvent.ACTION_DOWN) {
long stopTimeOfGame_millis = System.currentTimeMillis();
UtilsRG.info("time stopped: " +stopTimeOfGame_millis);
}
if (action == KeyEvent.ACTION_UP) {
long test = System.currentTimeMillis();
UtilsRG.info("time stopped up: " +test);
}
}
}
return super.onMediaButtonEvent(mediaButtonIntent);
}
}); …Run Code Online (Sandbox Code Playgroud)