我几天来一直在尝试发送像这里这样的富媒体控制通知。我目前正在使用 ExoPlayer 对象来播放音频文件,但如果有必要,我会更改它。
我已经尝试了很多东西,但似乎有些不同。
我想通了,混蛋
安卓清单:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
你必须像这样创建类 PlaybackService
package yourshittypackage;
import android.content.Intent;
import androidx.annotation.Nullable;
import androidx.media3.common.AudioAttributes;
import androidx.media3.common.C;
import androidx.media3.common.Player;
import androidx.media3.exoplayer.ExoPlayer;
import androidx.media3.session.MediaSession;
import androidx.media3.session.MediaSessionService;
public class PlaybackService extends MediaSessionService {
private MediaSession mediaSession = null;
// Create your Player and MediaSession in the onCreate lifecycle event
@Override
public void onCreate() {
super.onCreate();
ExoPlayer player = new ExoPlayer.Builder(this).setWakeMode(C.WAKE_MODE_LOCAL).setHandleAudioBecomingNoisy(true).setAudioAttributes(AudioAttributes.DEFAULT, true).build();
mediaSession = new MediaSession.Builder(this, player).build(); ///mal sehen...
}
@Nullable
@Override
public MediaSession onGetSession(MediaSession.ControllerInfo controllerInfo) {
return mediaSession;
}
// The user dismissed the app from the recent tasks
@Override
public void onTaskRemoved(@Nullable Intent rootIntent) {
Player player = mediaSession.getPlayer();
if (!player.getPlayWhenReady()
|| player.getMediaItemCount() == 0
|| player.getPlaybackState() == Player.STATE_ENDED) {
// Stop the service if not playing, continue playing in the background
// otherwise.
stopSelf();
}
}
// Remember to release the player and media session in onDestroy
@Override
public void onDestroy() {
mediaSession.getPlayer().release();
mediaSession.release();
mediaSession = null;
super.onDestroy();
}
}
声明 ListenableFuture 控制器Future;
然后在 Oncreate
PlaybackService playbackService = new PlaybackService();
SessionToken sessionToken =
new SessionToken(this, new ComponentName(this, PlaybackService.class));
controllerFuture =
new MediaController.Builder(this, sessionToken).buildAsync();
controllerFuture.addListener(() -> {
// MediaController is available here with controllerFuture.get()
}, MoreExecutors.directExecutor());
播放媒体的示例
controllerFuture.get().addMediaItem(mediaItem);
controllerFuture.get().prepare();
controllerFuture.get().play();
并且在这一切之后,richt 通知会自行发送。