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

ops/2024/9/24 5:28:51/

安卓手机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 eventoverride fun onCreate() {super.onCreate()val player = ExoPlayer.Builder(this).build()mediaSession = MediaSession.Builder(this, player).build()}// The user dismissed the app from the recent tasksoverride 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 onDestroyoverride fun onDestroy() {mediaSession?.run {player.release()release()mediaSession = null}super.onDestroy()}
}

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

override fun onTaskRemoved(rootIntent: Intent?) {val player = mediaSession.playerif (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 omittedoverride 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" />

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

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

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


http://www.ppmy.cn/ops/34465.html

相关文章

Hessian 矩阵(海森矩阵)

Hessian 矩阵&#xff08;海森矩阵&#xff09;是一个包含二阶偏导数信息的方阵&#xff0c;在数学和优化中起着重要作用。对于一个多元函数&#xff0c;其 Hessian 矩阵是由其各个变量的二阶偏导数组成的矩阵。 假设有一个函数 f ( x 1 , x 2 , … , x n ) f(x_1, x_2, \dots…

深入浅出MySQL-06-【索引的设计和使用】

文章目录 前言1.索引概述2.设计索引的原则3.索引设计的误区4.索引设计的一般步骤5.BTREE索引和HASH索引6.索引在MySQL 8.0中的改进6.1.不可见索引6.2.倒序索引 7.总结 前言 环境&#xff1a; Windows11MySQL-8.0.35 1.索引概述 所有MySQL列类型都可以被索引&#xff0c;对相…

SQL注入基础-3

一、宽字节注入 1、宽字节&#xff1a;字符大小为两个及以上的字节&#xff0c;如GBK&#xff0c;GB2312编码 2、数据库使用GBK编码时&#xff0c;会将两个字符合并为一个汉字(宽字节)。特殊值字符如单引号都会被转义【--->\】&#xff0c;如sqli-lads第32关&#xff0c;输…

VRRP基础

1.基本概念 VRRP(Virtual Router Redundancy protocol,虚拟路由冗余协议&#xff09; VRRP能够在不改变组网的情况下&#xff0c;将多台路由器虚拟成一个虚拟路由器&#xff0c;通过配置虚拟路由器的IP地址为默认网关&#xff0c;实现网关的备份。 VRRP协议版本为VRRPv2&…

c语言:打印任意行数的菱形

例如&#xff1a;以下图片形式 #include <stdio.h> int main() {int line 0;scanf_s("%d", &line);int i 0;//打印上半部分for (i 0; i < line; i){//打印空格数int j 0;for (j 0; j < line - 1 - i; j){printf(" ");}//打印*数量for…

迅饶科技 X2Modbus 网关 AddUser 任意用户添加漏洞复现

0x01 产品简介 X2Modbus是上海迅饶自动化科技有限公司Q开发的一款功能很强大的协议转换网关, 这里的X代表各家不同的通信协议, 2是T0的谐音表示转换, Modbus就是最终支持的标准协议是Modbus协议。用户可以根据现场设备的通信协议进行配置,转成标准的Modbus协议。在PC端仿真…

Docker部署PostgreSQL

1. 指令&#xff1a; # 拉取镜像 docker pull postgres# 创建容器 docker run --name postgres -e POSTGRES_PASSWORDpostgres -p 5432:5432 -v /mydata/docker/postgres/data:/var/lib/postgresql/data -d postgres# 或&#xff1a; docker run \--name postgres \-e POSTGRE…

Linux 设置一个程序开机启动的几种方式

在 Alpine Linux 系统中,你可以通过以下几种方式设置程序开机自启动: 使用 OpenRC 服务管理工具 OpenRC 是 Alpine Linux 默认的初始化系统和服务管理器。你可以编写一个 OpenRC 服务脚本并将其放置在 /etc/init.d 目录下。然后使用以下命令启用该服务: rc-update add 服务名…