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

server/2024/9/23 9:34:41/

安卓手机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/server/34178.html

相关文章

CMakeLists.txt语法规则:提供信息的变量说明一

一. 简介 前面几篇文章学习了 CMakeLists.txt语法中 部分常用命令。 接下来学习CMakeLists.txt语法中部分常用变量&#xff0c;变量也是 cmake 中的一个重头戏&#xff0c;cmake 提供了很多内置变量。每一个变量都有它自己的含义&#xff0c;可以通过如下链接地址查询到所有…

工作问题记录React(持续更新中)

一、backdrop-filter:blur(20px); 毛玻璃效果&#xff0c;在安卓机上有兼容问题&#xff0c;添加兼容前缀也无效&#xff1b; 解决方案&#xff1a;让设计师调整渐变&#xff0c;不要使用该属性! 复制代码 background: radial-gradient(33% 33% at 100% 5%, #e9e5e5 0%, rgba…

[Spring Cloud] (6)gateway整体加解密

文章目录 简述整体效果后端增加配置nacos增加配置GlobalConfig 添加请求整体解密拦截器DecryptionFilter添加响应整体解密拦截器EncryptionFilter 前端请求拦截器添加整体加密逻辑请求头中添加sessionId 响应拦截器添加整体解密逻辑 简述 本文网关gateway&#xff0c;微服务&a…

编译链接过程

编译链接过程 预编译阶段 删除所有的“#define”&#xff0c;并且展开所有的宏定义; 处理所有的条件预编译指令&#xff0c;“#if”、“#ifdef”、“#endif”等; 处理“#include”预编译指令&#xff0c;将被包含的文件插入到该预编译指令的位置; 删除所有的注释; 添加行号和文…

如何面对并发下的bug

整理总结自蒋炎岩老师的b站课程&#xff0c;https://jyywiki.cn/OS/2022/index.html 并发bug与应对 应对bug的方法 在代码里边增加很多检查(加断言) #include "thread.h"unsigned long balance 100;void Alipay_withdraw(int amt) {if (balance > amt) {usleep(…

上位机图像处理和嵌入式模块部署(树莓派4b和mcu的分工与配合)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 树莓派4b从广义上来说&#xff0c;它本身就是一个mini小电脑。我们需要什么软件&#xff0c;就可以apt install去下载即可。这和之前嵌入式linux开…

AI新突破:多标签预测技术助力语言模型提速3倍

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; 引言&#xff1a;多标签预测的新视角 在人工智能领域&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;预测模型的训练方法一直在…

[微信小程序] 入门笔记1-滚动视图组件

[微信小程序] 入门笔记1-滚动视图组件 1.页面&组件&渲染 在小程序是由一个个页面page组成, 而页面又是由一个个组件component组成.和网页类似,这里的组件指的就是输入框<input>,按钮<button>,文本<text>,图片<image>等元素.如果你学过网页一…