这是我努力制作一个工作代码来处理耳机按钮事件的最佳方式。我读了Android developer guide,但这显然是错误的,因为他们要求开始监听注册班级名称。
am.registerMediaButtonEventReceiver(RemoteControlReceiver); // Wrong
因此,我查看其他示例以更正代码。例如,许多秘密建议已在this question中发布,我还尝试了其他代码,例如this,以及另一个解决方案MediaSession,并清理不需要的我编写此代码:
我实现了类 RemoteControlReceiver 。显然,不需要静态内部类,事实上,请参阅this comment:
public class RemoteControlReceiver extends BroadcastReceiver {
public RemoteControlReceiver() {
super();
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "EVENT!!", Toast.LENGTH_SHORT).show();
if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
KeyEvent event = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) {
Toast.makeText(context, "EVENT!!", Toast.LENGTH_SHORT).show();
}
}
}
}
然后我在 MainActivity onCreate(){ ...
中注册了意图 AudioManager am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
ComponentName mReceiverComponent = new ComponentName(this, RemoteControlReceiver.class);
am.registerMediaButtonEventReceiver(mReceiverComponent);
registerMediaButtonEventReceiver已被弃用...
在清单中,我在活动标记之后记录过滤器:
<activity>
...
</activity>
<receiver android:name=".RemoteControlReceiver" android:enabled="true">
<intent-filter android:priority="2147483647">
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
注意:使用静态内部类将是例如“ .MainActivity $ RemoteControlReceiver ”。
我正在努力
compileSdkVersion 24
buildToolsVersion "24.0.0"
...
minSdkVersion 21
targetSdkVersion 24
我的问题在这里:
答案 0 :(得分:4)
API 21更改了整个媒体应用API,现在完全围绕MediaSession。您可以直接在registerMediaButtonEventReceiver(PendingIntent)中接收回调,而不是注册BroadcastReceiver
(在API 18之前需要)或PendingIntent
(通过MediaSession.Callback)。
您可以通过以下代码设置MediaSession
:
MediaSession.Callback callback = new MediaSession.Callback() {
@Override
public void onPlay() {
// Handle the play button
}
};
MediaSession mediaSession = new MediaSession(context,
TAG); // Debugging tag, any string
mediaSession.setFlags(
MediaSession.FLAG_HANDLES_MEDIA_BUTTONS |
MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);
mediaSession.setCallback(callback);
// Set up what actions you support and the state of your player
mediaSession.setState(
new PlaybackState.Builder()
.setActions(PlaybackState.ACTION_PLAY |
PlaybackState.ACTION_PAUSE |
PlaybackState.ACTION_PLAY_PAUSE);
.setState(PlaybackState.STATE_PLAYING,
0, // playback position in milliseconds
1.0); // playback speed
// Call this when you start playback after receiving audio focus
mediaSession.setActive(true);
如果您只想在活动可见的情况下处理媒体按钮,则可以让活动本身处理MediaSession
(这样您的Callback
就可以成为活动中的变量)。
Best practices in media playback talk from I/O 2016会详细介绍构建精彩媒体应用所需的所有详细信息和其他API,但请注意它使用了MediaSessionCompat以及{{3}中详述的其他支持库类}。