我的项目几乎完成,只留下一个关键元素。这就是我现在要问的问题。
有人可以告诉我如何在Android L& S中监听耳机/媒体按键。以上?我准备使用AM.registerReceiver时,我意识到它已被弃用,我没有看到很多关于如何使用MediaSession的文档/示例(我正在尝试使用compat,因为我的minSDK是API 16,有吗有什么不同吗?)。这就是我目前正在做的事情(结果一无所获):
void initReceivers() throws IllegalArgumentException {
final int RC = 1001;
if (!MainActivity.noisyRegistered) {
app.registerReceiver(noisyReceiver, new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY));
MainActivity.noisyRegistered = true;
Intent intent = new Intent(app, AudioReceiver.class);
PendingIntent pending = PendingIntent.getBroadcast(app, RC, intent, PendingIntent.FLAG_UPDATE_CURRENT);
ComponentName name = new ComponentName(app.getPackageName(), AudioReceiver.class.getName());
MediaSessionCompat mediaSession = new MediaSessionCompat(app, "sggTag", name, pending);
mediaSession.setMediaButtonReceiver(pending);
}
}
static public class AudioReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (!intent.getAction().equals(Intent.ACTION_MEDIA_BUTTON))
return;
KeyEvent event = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (event == null || binder == null || player == null)
return;
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_MEDIA_PLAY:
binder.resume();
break;
case KeyEvent.KEYCODE_MEDIA_PAUSE:
binder.resume();
break;
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
if (player.isPlaying())
binder.pause();
else
binder.resume();
break;
case KeyEvent.KEYCODE_MEDIA_NEXT:
binder.next();
break;
case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
binder.prev();
break;
}
}
}
我的清单:
<receiver android:name=".ListenService$AudioReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON"/>
</intent-filter>
</receiver>
我真的很困惑,为什么我需要在有setCallback方法时提供挂起的意图。
非常感谢。
答案 0 :(得分:-1)
我最近开发了一个响应媒体按钮的应用程序。我在三星Galaxy S II上进行了测试,但它确实有效。
首先,在AndroidManifest.xml中,在该区域内,放置以下内容:
<receiver android:name="net.work.box.controller.receivers.RemoteControlReceiver" >
<intent-filter android:priority="1000000000000000" >
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
然后,在另一个文件中创建一个BroadcastReceiver:
公共类RemoteControlReceiver扩展了BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction()) {
KeyEvent event = (KeyEvent) intent .getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (event == null) {
return;
}
if (event.getAction() == KeyEvent.ACTION_DOWN) {
context.sendBroadcast(new Intent(Intents.ACTION_PLAYER_PAUSE));
}
}
}
}
这可能不是最好的解决方案(特别是硬编码的android:优先级以上)。然而,它尝试了其他几种技术,但似乎都没有。所以我不得不求助于这个...我希望我帮助过。