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

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

目录

概述

使用一个媒体会话服务

实现服务的生命周期

提供对媒体会话的读取

在配置文件中声明服务


概述

当APP不在前台时,经常希望能够播放媒体。例如,一个音乐播放器

在用户锁屏或者是使用其它的APP时,通常是保持音乐播放的。

媒体3库提供了一系列的接口来允许你支持后台的播放。

使用一个媒体会话服务

为了启用后台播放,你应该包括播放器和在一个单独的服务中包括媒体会话。

这允许设备当你的APP不在前台时,继续进行媒体的服务。

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

当一个播放器在一个服务中时,你应该使用一个媒体会话服务。为了做这一点,

创建一个类来扩展媒体会话服务,并且创建你的媒体的会话在服务里。

使用媒体会话服务对于外部的客户端 连接你的APP,控制播放,而没有读取你的APP的用户

界面的活动,成为了可能。事实上,会有多个客户端的APP同时连接媒体会话服务,每个

APP都有它自己的媒体控制器。

实现服务的生命周期

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

当第一个控制器要连接服务,服务被实例化和启动后,调用了onCreate()方法。

它是构建播放器和媒体会话的最好的地方。

当用户离开当前的任务时,调用onTaskRemoved(Intent)方法。如果播放在继续,

APP选择保持服务运行在前台。如果播放器被暂停,服务不在前台,需要被停止了。

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

Kotlin

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

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

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。

XML 复制代码
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />

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

XML 复制代码
<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)及以上时,

它要包括媒体播放。

相关推荐
灵感素材坊1 小时前
解锁音乐创作新技能:AI音乐网站的正确使用方式
人工智能·经验分享·音视频
modest —YBW1 小时前
视频大小怎么计算?视频码率是什么,构成视频清晰度的核心要素!
音视频
cuijiecheng20181 小时前
音视频入门基础:RTP专题(10)——FFmpeg源码中,解析RTP header的实现
ffmpeg·音视频
AI服务老曹2 小时前
运用先进的智能算法和优化模型,进行科学合理调度的智慧园区开源了
运维·人工智能·安全·开源·音视频
simplepeng2 小时前
我的天,我真是和androidx的字体加载杠上了
android
小猫猫猫◍˃ᵕ˂◍3 小时前
备忘录模式:快速恢复原始数据
android·java·备忘录模式
Macdo_cn5 小时前
My Metronome for Mac v1.4.2 我的节拍器 支持M、Intel芯片
macos·音视频
CYRUS_STUDIO5 小时前
使用 AndroidNativeEmu 调用 JNI 函数
android·逆向·汇编语言
梦否5 小时前
【Android】类加载器&热修复-随记
android
徒步青云6 小时前
Java内存模型
android