安卓手机APP开发__用媒体会话服务进行后台播放

发布于:2024-05-06 ⋅ 阅读:(28) ⋅ 点赞:(0)

安卓手机APP开发__媒体开发部分__用媒体会话服务进行后台播放

目录

概述

使用一个媒体会话服务

实现服务的生命周期

提供对媒体会话的读取

在配置文件中声明服务


概述

当APP不在前台时,经常希望能够播放媒体。例如,一个音乐播放器
在用户锁屏或者是使用其它的APP时,通常是保持音乐播放的。
媒体3库提供了一系列的接口来允许你支持后台的播放。

使用一个媒体会话服务

为了启用后台播放,你应该包括播放器和在一个单独的服务中包括媒体会话。
这允许设备当你的APP不在前台时,继续进行媒体的服务。

媒体会话服务允许媒体的会话独立于APP的活动而运行。

当一个播放器在一个服务中时,你应该使用一个媒体会话服务。为了做这一点,
创建一个类来扩展媒体会话服务,并且创建你的媒体的会话在服务里。

使用媒体会话服务对于外部的客户端 连接你的APP,控制播放,而没有读取你的APP的用户
界面的活动,成为了可能。事实上,会有多个客户端的APP同时连接媒体会话服务,每个
APP都有它自己的媒体控制器。

实现服务的生命周期

你需要实现你的服务的三个生命周期的方法:


当第一个控制器要连接服务,服务被实例化和启动后,调用了onCreate()方法。
它是构建播放器和媒体会话的最好的地方。

当用户离开当前的任务时,调用onTaskRemoved(Intent)方法。如果播放在继续,
APP选择保持服务运行在前台。如果播放器被暂停,服务不在前台,需要被停止了。

当服务被停止时,调用onDestroy()方法,所有的资源包括播放器和会话都需要被释放。


Kotlin

class PlaybackService : MediaSessionService() {
  private var mediaSession: MediaSession? = null

  // Create your player and media session in the onCreate lifecycle event
  override fun onCreate() {
    super.onCreate()
    val player = ExoPlayer.Builder(this).build()
    mediaSession = MediaSession.Builder(this, player).build()
  }

  // The user dismissed the app from the recent tasks
  override fun onTaskRemoved(rootIntent: Intent?) {
    val player = mediaSession?.player!!
    if (!player.playWhenReady
        || player.mediaItemCount == 0
        || player.playbackState == 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 fun onDestroy() {
    mediaSession?.run {
      player.release()
      release()
      mediaSession = null
    }
    super.onDestroy()
  }
}

当用户离开APP时,APP能停止服务。
Kotlin

override fun onTaskRemoved(rootIntent: Intent?) {
  val player = mediaSession.player
  if (player.playWhenReady) {
    // Make sure the service is not in foreground.
    player.pause()
  }
  stopSelf()
}

提供对媒体会话的读取

当服务创建后,覆盖onGetSession()方法,来给其它的客户端读取你的媒体会话

Kotlin

class PlaybackService : MediaSessionService() {
  private var mediaSession: MediaSession? = null
  // [...] lifecycle methods omitted

  override fun onGetSession(controllerInfo: MediaSession.ControllerInfo): MediaSession? =
    mediaSession
}

在配置文件中声明服务

一个APP在运行前台服务时需要权限。在配置文件中加上前台服务的权限,
如果是API在34及以上还要加上FOREGROUND_SERVICE_MEDIA_PLAYBACK。

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />

你也必须在配置文件中声明你的服务类,使用媒体会话服务的过滤器。

<service
    android:name=".PlaybackService"
    android:foregroundServiceType="mediaPlayback"
    android:exported="true">
    <intent-filter>
        <action android:name="androidx.media3.session.MediaSessionService"/>
    </intent-filter>
</service>

你必须定义一个前台的服务类型,当你的APP运行在安卓10(API级别29)及以上时,
它要包括媒体播放。