安卓手机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)及以上时,

它要包括媒体播放。

相关推荐
晨曦_子画31 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
孤客网络科技工作室1 小时前
AJAX 全面教程:从基础到高级
android·ajax·okhttp
冷凝女子2 小时前
【QT】海康视频及openCv抓拍正脸接口
qt·opencv·音视频·海康
Mr Lee_2 小时前
android 配置鼠标右键快捷对apk进行反编译
android
安步当歌3 小时前
【WebRTC】视频编码链路中各个类的简单分析——VideoStreamEncoder
音视频·webrtc·视频编解码·video-codec
顾北川_野3 小时前
Android CALL关于电话音频和紧急电话设置和获取
android·音视频
顶呱呱程序3 小时前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
&岁月不待人&3 小时前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
EasyCVR4 小时前
萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?
运维·服务器·网络·人工智能·ffmpeg·音视频
runing_an_min4 小时前
ffmpeg 视频滤镜:屏蔽边框杂色- fillborders
ffmpeg·音视频·fillborders