- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Android 中实现通知播放器。我关注了this实现这一目标的指南。但是,作为我的要求,我需要在后台通知播放器中实现“跳到下一个”和“跳到上一个”。
到目前为止,MediaSessionCompact.Callback 的 onPlay() 和 onPause() 都被触发了。但是,在调试时,我注意到在通知播放器中按下下一个和上一个按钮时,不会触发 onSkipToNext() 和 onSkipToPrevious() 回调方法。
感谢您的意见。我在下面添加了相关代码。
背景音频服务
private void showPlayingNotification() {
NotificationCompat.Builder builder = MediaStyleHelper.from(BackgroundAudioService.this, mMediaSessionCompat);
if (builder == null) {
return;
}
builder.addAction(new NotificationCompat.Action(android.R.drawable.ic_media_previous, "Previous", MediaButtonReceiver.buildMediaButtonPendingIntent(this, PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS)));
builder.addAction(new NotificationCompat.Action(android.R.drawable.ic_media_pause, "Pause", MediaButtonReceiver.buildMediaButtonPendingIntent(this, PlaybackStateCompat.ACTION_PLAY_PAUSE)));
builder.addAction(new NotificationCompat.Action(android.R.drawable.ic_media_next, "Next", MediaButtonReceiver.buildMediaButtonPendingIntent(this, PlaybackStateCompat.ACTION_SKIP_TO_NEXT)));
builder.setStyle(new NotificationCompat.MediaStyle().setShowActionsInCompactView(0).setMediaSession(mMediaSessionCompat.getSessionToken()));
builder.setSmallIcon(R.mipmap.ic_launcher);
NotificationManagerCompat.from(BackgroundAudioService.this).notify(1, builder.build());
}
private void showPausedNotification() {
NotificationCompat.Builder builder = MediaStyleHelper.from(this, mMediaSessionCompat);
if (builder == null) {
return;
}
builder.addAction(new NotificationCompat.Action(android.R.drawable.ic_media_previous, "Previous", MediaButtonReceiver.buildMediaButtonPendingIntent(this, PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS)));
builder.addAction(new NotificationCompat.Action(android.R.drawable.ic_media_play, "Play", MediaButtonReceiver.buildMediaButtonPendingIntent(this, PlaybackStateCompat.ACTION_PLAY_PAUSE)));
builder.addAction(new NotificationCompat.Action(android.R.drawable.ic_media_next, "Next", MediaButtonReceiver.buildMediaButtonPendingIntent(this, PlaybackStateCompat.ACTION_SKIP_TO_NEXT)));
builder.setStyle(new NotificationCompat.MediaStyle().setShowActionsInCompactView(0).setMediaSession(mMediaSessionCompat.getSessionToken()));
builder.setSmallIcon(R.mipmap.ic_launcher);
NotificationManagerCompat.from(this).notify(1, builder.build());
}
private MediaSessionCompat.Callback mMediaSessionCallback = new MediaSessionCompat.Callback() {
@Override
public void onPlay() {
super.onPlay();
if (!successfullyRetrievedAudioFocus()) {
return;
}
mMediaSessionCompat.setActive(true);
setMediaPlaybackState(PlaybackStateCompat.STATE_PLAYING);
Log.d("MyLog", "STATE_PLAYING");
showPlayingNotification();
mMediaPlayer.start();
}
@Override
public void onPause() {
super.onPause();
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
setMediaPlaybackState(PlaybackStateCompat.STATE_PAUSED);
Log.d("MyLog", "STATE_PAUSED");
showPausedNotification();
}
}
@Override
public void onSkipToNext() {
super.onSkipToNext();
setMediaPlaybackState(PlaybackStateCompat.STATE_SKIPPING_TO_NEXT);
Log.d("MyLog", "STATE_SKIPPING_TO_NEXT");
}
@Override
public void onSkipToPrevious() {
super.onSkipToPrevious();
setMediaPlaybackState(PlaybackStateCompat.STATE_SKIPPING_TO_PREVIOUS);
Log.d("MyLog", "STATE_SKIPPING_TO_PREVIOUS");
}
}
public static NotificationCompat.Builder from(
Context context, MediaSessionCompat mediaSession) {
MediaControllerCompat controller = mediaSession.getController();
MediaMetadataCompat mediaMetadata = controller.getMetadata();
MediaDescriptionCompat description = mediaMetadata.getDescription();
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder
.setContentTitle(description.getTitle())
.setContentText(description.getSubtitle())
.setSubText(description.getDescription())
.setLargeIcon(description.getIconBitmap())
.setContentIntent(controller.getSessionActivity())
.setDeleteIntent(
MediaButtonReceiver.buildMediaButtonPendingIntent(context, PlaybackStateCompat.ACTION_STOP))
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
return builder;
}
mMediaBrowserCompat = new MediaBrowserCompat(this, new ComponentName(this, BackgroundAudioService.class),
mMediaBrowserCompatConnectionCallback, getIntent().getExtras());
private MediaBrowserCompat.ConnectionCallback mMediaBrowserCompatConnectionCallback = new MediaBrowserCompat.ConnectionCallback() {
@Override
public void onConnected() {
super.onConnected();
try {
mMediaControllerCompat = new MediaControllerCompat(MainActivity.this, mMediaBrowserCompat.getSessionToken());
mMediaControllerCompat.registerCallback(mMediaControllerCompatCallback);
setSupportMediaController(mMediaControllerCompat);
getSupportMediaController().getTransportControls().playFromMediaId(String.valueOf(R.raw.warner_tautz_off_broadway), null);
} catch( RemoteException e ) {
}
}
};
private MediaControllerCompat.Callback mMediaControllerCompatCallback = new MediaControllerCompat.Callback() {
@Override
public void onPlaybackStateChanged(PlaybackStateCompat state) {
super.onPlaybackStateChanged(state);
if( state == null ) {
return;
}
switch( state.getState() ) {
case PlaybackStateCompat.STATE_PLAYING: {
mCurrentState = STATE_PLAYING;
break;
}
case PlaybackStateCompat.STATE_PAUSED: {
mCurrentState = STATE_PAUSED;
break;
}
case PlaybackStateCompat.STATE_SKIPPING_TO_NEXT: {
mCurrentState = STATE_SKIPPING_TO_NEXT;
break;
}
case PlaybackStateCompat.STATE_SKIPPING_TO_PREVIOUS: {
mCurrentState = STATE_SKIPPING_TO_PREVIOUS;
}
}
}
};
@Override
public boolean onMediaButtonEvent(Intent mediaButtonEvent) {
Log.d("MyLog", "executing onMediaButtonEvent: " + mediaButtonEvent.getAction());
return super.onMediaButtonEvent(mediaButtonEvent);
}
最佳答案
在遵循相同的指南后遇到了这个问题。
寻找一个名为 setMediaPlaybackState(int state)
的方法在您的 BackgroundAudioService 类中。这是您定义 PlaybackStateCompat.Builder 并使用 setActions 定义 session 上可用的当前功能的地方。
除非将 ACTION_SKIP_TO_NEXT 和 ACTION_SKIP_TO_PREVIOUS 作为支持的操作传入,否则不会调用 OnSkipToNext 和 onSkipToPrevious。在将 setActions 更新为以下内容后,我设法让它工作......
private void setMediaPlaybackState(int state) {
PlaybackStateCompat.Builder playbackstateBuilder = new PlaybackStateCompat.Builder();
switch (state) {
case PlaybackStateCompat.STATE_PLAYING: {
playbackstateBuilder.setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE | PlaybackStateCompat.ACTION_PAUSE
| PlaybackStateCompat.ACTION_SKIP_TO_NEXT | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS);
break;
}
default: {
playbackstateBuilder.setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE | PlaybackStateCompat.ACTION_PLAY
| PlaybackStateCompat.ACTION_SKIP_TO_NEXT | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS);
break;
}
}
playbackstateBuilder.setState(state, PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN, 0);
mMediaSessionCompat.setPlaybackState(playbackstateBuilder.build());
}
关于java - MediaSessionCompat.Callback 的 onSkipToNext() 和 onSkipToPrevious() 没有被触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50521959/
我无法导入 MediaSessionCompat。用于导入整个 android.support.v4.media 库的导入语句不会出现在 Android Studio“IntelliSense”中,并
如何使用 MediaSessionCompat?有人可以举一个简单的工作示例吗? 我找到了一些,但他们使用: MediaSessionCompat _mediaSession = new MediaS
将支持库升级到 25.3.1 后遇到此崩溃: Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual me
mediaSessionCompat.setMetadata(new MediaMetadataCompat.Builder() .putStr
我很好奇是否有人遇到过这个问题或有任何建议。我正在编写一个使用 MediaSessionCompat API 的媒体播放器。每隔一段时间,我都会确定播放媒体的当前位置并引发更改事件。我重新设置了播放状
我在使用 Android 的 MediaSession 时遇到了一些困难。 我一直在研究应该从 url 流式传输的原型(prototype) radio 应用程序。 到目前为止,我已经将它与前台服务一
我对 MediaControllerCompat 和 MediaSessionCompat 的导入 import android.support.v4.media.session.MediaContr
社区同胞! 所以我的应用程序遇到问题,那就是使用 MediaSessionCompat。 该崩溃问题仅出现在 Android 8 版本(8.1 也有)上,但主要出现在不同设备上的 8.0.0 上。 致
对于 Lollipop ,我们被告知要更换 registerMediaButtonEventReceiver() 与 setMediaButtonReceiver(PendingIntent)。 这在
我想用一个使用 MediaSession 的新类替换我应用程序中的 android RemoteControlClient 类,但它不适用于 API 级别 < 21,MediaSessionCompa
我想将我的 exoplayer 实现与媒体 session 对象连接起来。我设置了一个 SimpleExoPlayerView 来显示视频。每次单击按钮时,我都希望触发媒体 session 回调。我只
当我尝试在运行 Android 5.0.1 的 HUAWEI P8 lite 设备上显示通知时,我的应用程序崩溃(它在 Nexus 和三星设备上运行良好)。我的大部分代码取自 Ian Lake 的视频
我有一个应用程序可以从服务中复制网络广播(使用 AACDecoder 库)并在 Activity 未恢复时在简单的持续通知中显示正在播放的内容。我想要的是通过 NotificationCompat.M
我正在尝试在 Android 中实现通知播放器。我关注了this实现这一目标的指南。但是,作为我的要求,我需要在后台通知播放器中实现“跳到下一个”和“跳到上一个”。 到目前为止,MediaSessio
我正在尝试将我的应用程序更新到 Android SDK 31,但我遇到了 MediaSessionCompat 的问题。 我有一个扩展 MediaBrowserServiceCompat() 的 Me
我是一名优秀的程序员,十分优秀!