| Name | Date | Size | #Lines | LOC | ||
|---|---|---|---|---|---|---|
| .. | - | - | ||||
| AppScope/ | 06-May-2025 | - | 36 | 33 | ||
| entry/ | 06-May-2025 | - | 1,416 | 1,272 | ||
| hvigor/ | 06-May-2025 | - | 7 | 7 | ||
| screenshot/device/ | 06-May-2025 | - | ||||
| README.md | D | 06-May-2025 | 6.6 KiB | 169 | 117 | |
| build-profile.json5 | D | 06-May-2025 | 1 KiB | 43 | 42 | |
| hvigorfile.ts | D | 06-May-2025 | 160 | 3 | 1 | |
| hvigorw | D | 06-May-2025 | 2.1 KiB | 62 | 28 | |
| hvigorw.bat | D | 06-May-2025 | 2 KiB | 72 | 56 | |
| oh-package.json5 | D | 06-May-2025 | 866 | 27 | 25 | |
| ohosTest.md | D | 06-May-2025 | 837 | 14 | 11 |
README.md
1# 媒体会话——提供方 2 3### 介绍 4 5本示例主要展示了媒体会话(媒体提供方)的相关功能,使用[@ohos.multimedia.avsession](https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/reference/apis/js-apis-avsession.md)等接口实现媒体提供方与媒体控制方自定义信息的交互功能。 6 7> 注意: 8> 此示例仅展示媒体提供方的相关功能,如果需要媒体会话提供的完整的自定义信息交互功能,请将本示例与[媒体提供方示例](https://gitee.com/openharmony/applications_app_samples/tree/master/code/SystemFeature/Media/AVSession/MediaController)共同使用。 9 10### 效果预览 11 12|主页| 13|--------------------------------| 14|| 15 16#### 使用说明 17 18##### 基础操作 19 201. 打开媒体提供方示例应用。 212. 点击播放按钮,应用的播放状态发生变化,歌词开始更新。 223. 点击暂停按钮,应用的播放状态开始变化,歌词停止更新。 234. 点击上一首按钮,应用界面展示播放列表中的上一首歌曲的信息。 245. 点击下一首按钮,应用界面展示播放列表中的下一首歌曲的信息。 25 26##### 进阶操作(与媒体控制方一起使用) 271. 点击本应用播放、暂停、上一首、下一首按钮,可以发现媒体控制方中,该会话的状态同步改变。 282. 点击媒体控制方按钮,可以发现本应用中播放状态同步改变。 293. 媒体控制方可以获取到本应用的播放列表、自定义数据包、歌词等信息。 30 31 32### 工程目录 33 34给出项目中关键的目录结构并描述它们的作用,示例如下: 35 36``` 37entry/src/main/ets/ 38|---common 39|---|---Log.ets //日志打印封装 40|---|---MediaData.ets //歌曲相关信息 41|---|---Utils.ets //通用的工具类 42|---feature 43|---|---ProviderFeature.ets //逻辑实现 44|---pages 45|---|---Index.ets //界面实现 46``` 47 48### 具体实现 49 50* 界面相关的实现都封装在pages/Index.ets下,源码参考:[pages/Index.ets](./entry/src/main/ets/pages/Index.ets) 51 * 使用`@StorageLink`来设置与逻辑代码同步更新的变量,当逻辑代码中对应的变量更新时,界面会同步的刷新。 52 53 * 通过引入逻辑代码对应的类,创建出对象,实现对onClick事件的响应,关键代码段: 54 ```ets 55 import { ProviderFeature } from '../feature/ProviderFeature'; 56 private providerFeature: ProviderFeature = new ProviderFeature(); // 创建对象 57 58 Button() { 59 // 按钮的内容 60 } 61 .onClick(async () => { 62 this.providerFeature.play(); // 通过类的对象来调用逻辑代码 63 }) 64 ``` 65 66* 逻辑相关的实现都封装在feature/ProviderFeature.ets下,源码参考:[feature/ProviderFeature.ets](./entry/src/main/ets/feature/ProviderFeature.ets) 67 68 应用的初始化相关操作 69 70 * 链接变量 71 72 通过`AppStorage.SetAndLink()`将逻辑代码中的变量与界面代码中使用`@StorageLink`声明的变量连接起来,通过`set()`与`get()`操作来修改或获取变量的值,关键代码段: 73 74 ```ets 75 private isPlayLink: SubscribedAbstractProperty<boolean> = null; 76 this.isPlayLink = AppStorage.SetAndLink('IsPlaying', false); 77 this.isPlayLink.set(false); // 设置变量的值 78 let currentState : boolean = this.isPlayLink.get(); // 获取变量的值 79 ``` 80 81 82 * 创建并设置媒体会话 83 84 通过接口`createAVSession()`创建媒体会话; 85 86 通过接口`activate()`激活媒体会话; 87 88 通过接口`setAVQueueItems()`设置播放列表,设置后媒体控制方可以读取使用该信息; 89 90 通过接口`setAVQueueTitle()`设置播放列表标题,设置后媒体控制方可以读取使用该信息; 91 92 通过接口`setAVMetadata()`设置当前媒体的元数据,设置后媒体控制方可以读取使用此信息; 93 94 通过接口`on()`开启对媒体控制方控制命令的监听,对媒体控制方的命令进行处理; 95 96 应用在运行中相关的操作 97 98 * 切换歌曲 99 100 在切换歌曲时,除了需要设置媒体提供方自身的状态,还需要使用接口`setAVPlaybackState()`与接口`setAVMetadata()`将当前播放状态与元数据同步给媒体控制方。 101 102 * 发送自定义数据包 103 104 媒体提供方可以使用接口`dispatchSessionEvent()`与接口`setExtras()`来发送自定义数据包。 105 106### 相关权限 107 1081. 长时任务权限ohos.permission.KEEP_BACKGROUND_RUNNING 109 110 如果需要让媒体提供方应用在后台运行或响应命令,需要注册长时任务权限[ohos.permission.KEEP_BACKGROUND_RUNNING](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/security/AccessToken/permissions-for-all.md#ohospermissionkeep_background_running) 111 112 请在需要后台运行的Ability的`module.json5`中添加以下配置: 113 114 ```json5 115 { 116 "module": { 117 "requestPermissions": [ 118 { 119 "name": "ohos.permission.KEEP_BACKGROUND_RUNNING" 120 } 121 ] 122 } 123 } 124 ``` 125 126 添加配置后,需要在逻辑代码中进行申请长时任务的操作,示例代码如下: 127 128 ```ets 129 async startContinuousTask(){ 130 let wantAgentInfo = { 131 wants:[ 132 { 133 bundleName:"com.samples.mediaprovider", 134 abilityName:"com.samples.mediaprovider.EntryAbility" 135 } 136 ], 137 operationType : WantAgent.OperationType.START_ABILITY, 138 requestCode: 0, 139 wantAgentFlags: [WantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG] 140 }; 141 let want = await WantAgent.getWantAgent(wantAgentInfo); 142 await backgroundTaskManager.startBackgroundRunning(globalThis.context, backgroundTaskManager.BackgroundMode.AUDIO_PLAYBACK,want); 143 } 144 ``` 145 146### 依赖 147 148此示例仅展示媒体提供方的相关功能,如果需要媒体会话提供的完整的自定义信息交互功能,请将本示例与[媒体提供方示例](https://gitee.com/openharmony/applications_app_samples/tree/master/code/SystemFeature/Media/AVSession/MediaController)共同使用。 149 150### 约束与限制 151 1521. 本示例仅支持标准系统上运行,支持设备:RK3568。 153 1542. 本示例为Stage模型,支持API10版本SDK,SDK版本号(API Version 10 Release),镜像版本号(4.0 Release) 155 1563. 本示例需要使用DevEco Studio 版本号(4.0 Release)及以上版本才可编译运行。 157 158### 下载 159 160如需单独下载本工程,执行如下命令: 161 162``` 163git init 164git config core.sparsecheckout true 165echo code/BasicFeature/Media/AVSession/MediaProvider > .git/info/sparse-checkout 166git remote add origin https://gitee.com/openharmony/applications_app_samples.git 167git pull origin master 168``` 169