Мне также нужен сеанс для уведомления, и проигрыватель будет воспроизводить URL-адрес, а не локальный носитель.
У меня есть PlaybackService.kt, и это именно то, что указано в документах.
Код: Выделить всё
import android.content.ComponentName
import android.content.Intent
import androidx.media3.common.MediaMetadata
import androidx.media3.common.PlaybackException
import androidx.media3.common.Player
import androidx.media3.session.MediaController
import androidx.media3.session.MediaSession
import androidx.media3.session.MediaSessionService
import androidx.media3.session.SessionToken
import com.google.common.util.concurrent.ListenableFuture
import com.google.common.util.concurrent.MoreExecutors
class PlaybackService : MediaSessionService() {
private lateinit var controllerFuture: ListenableFuture
lateinit var player: MediaController
private var mediaSession: MediaSession? = null
override fun onCreate() {
super.onCreate()
val sessionToken = SessionToken(this, ComponentName(this, PlaybackService::class.java))
controllerFuture =
MediaController.Builder(this, sessionToken).buildAsync()
controllerFuture.addListener({
player = controllerFuture.get()
initController()
}, MoreExecutors.directExecutor())
}
private fun initController() {
player.addListener(object : Player.Listener {
override fun onMediaMetadataChanged(mediaMetadata: MediaMetadata) {
super.onMediaMetadataChanged(mediaMetadata)
}
override fun onIsPlayingChanged(isPlaying: Boolean) {
super.onIsPlayingChanged(isPlaying)
}
override fun onPlaybackStateChanged(playbackState: Int) {
super.onPlaybackStateChanged(playbackState)
}
override fun onPlayerError(error: PlaybackException) {
super.onPlayerError(error)
}
override fun onPlayerErrorChanged(error: PlaybackException?) {
super.onPlayerErrorChanged(error)
}
})
}
override fun onGetSession(controllerInfo: MediaSession.ControllerInfo): MediaSession? =
mediaSession
// The user dismissed the app from the recent tasks
override fun onTaskRemoved(rootIntent: Intent?) {
if (!player.playWhenReady || (player.mediaItemCount == 0)) {
// Stop the service if not playing, continue playing in the background
// otherwise.
stopSelf()
}
}
override fun onDestroy() {
player.stop()
player.release()
super.onDestroy()
}
}
Код: Выделить всё
...
...
Может быть, что-то вроде отправки ее на HomeScreen(player: MediaController)
Я пробовал несколько примеров из проектов с открытым исходным кодом, но все они используют MVVM с большими проектами, которые слишком сложны.
Я все еще учусь, мне просто нужно использовать что-то вроде player.play(url: String) и player.stop() по нажатию кнопки и всё.
Подробнее здесь: https://stackoverflow.com/questions/775 ... le-in-docs