From aebb8f201ad90d73397392c70375dd5e0cf5a824 Mon Sep 17 00:00:00 2001 From: leiiyb Date: Tue, 25 Oct 2022 11:00:17 +0800 Subject: [PATCH] add errorcode-avsession.md Signed-off-by: leiiyb --- .../media/avsession-guidelines.md | 635 ++++ .../media/avsession-overview.md | 52 + .../media/figures/zh-cn_image_avsession.png | Bin 0 -> 49086 bytes .../reference/apis/js-apis-avsession.md | 3116 +++++++++++++++++ .../errorcodes/errorcode-avsession.md | 131 + 5 files changed, 3934 insertions(+) create mode 100644 zh-cn/application-dev/media/avsession-guidelines.md create mode 100644 zh-cn/application-dev/media/avsession-overview.md create mode 100755 zh-cn/application-dev/media/figures/zh-cn_image_avsession.png create mode 100755 zh-cn/application-dev/reference/apis/js-apis-avsession.md create mode 100644 zh-cn/application-dev/reference/errorcodes/errorcode-avsession.md diff --git a/zh-cn/application-dev/media/avsession-guidelines.md b/zh-cn/application-dev/media/avsession-guidelines.md new file mode 100644 index 0000000000..a395e65ee5 --- /dev/null +++ b/zh-cn/application-dev/media/avsession-guidelines.md @@ -0,0 +1,635 @@ +# AVSession开发指导 + +## 会话接入端开发指导 + +### 基本概念 +- 会话元数据`'AVMetadata'`: 媒体数据相关属性,包含标识当前媒体的ID(assetId),上一首媒体的ID(previousAssetId),下一首媒体的ID(nextAssetId),标题(title),专辑作者(author),专辑名称(album),词作者(writer),媒体时长(duration)等属性。 +- 会话描述符`'AVSessionDescriptor'`: 描述媒体会话的相关信息。包含标识会话的ID(sessionId),会话的类型type(音频Audio/视频Video),会话自定义名称(sessionTag),会话所属应用的信息(elementName)等。 +- 媒体播放状态`'AVPlaybackState'`:用于描述媒体播放状态的相关属性。包含当前媒体的播放状态(state)、位置(position)、速度(speed)、缓冲时间(bufferedTime)、循环模式(loopMode)、是否收藏(isFavorite)等属性。 + +### 接口说明 +会话接入端常用接口如下表所示。接口返回值有两种返回形式:callback和promise,下表中为callback形式接口,promise和callback只是返回值方式不一样,功能相同。更多API说明请参见[API文档](../reference/apis/js-apis-avsession.md)。 + +表1:会话接入端常用接口 + +| 接口名 | 描述 | +|----------------------------------------------------------------------------------|-------------| +| createAVSession(context: Context, tag: string, type: AVSessionType, callback: AsyncCallback): void | 创建会话 | +| setAVMetadata(data: AVMetadata, callback: AsyncCallback): void | 设置会话元数据 | +| setAVPlaybackState(state: AVPlaybackState, callback: AsyncCallback): void | 设置会话播放状态信息 | +| setLaunchAbility(ability: WantAgent, callback: AsyncCallback): void | 设置启动ability | +| getController(callback: AsyncCallback): void | 获取当前会话自身控制器 | +| getOutputDevice(callback: AsyncCallback): void | 获取音频输出设备信息 | +| activate(callback: AsyncCallback): void | 激活会话 | +| destroy(callback: AsyncCallback): void | 销毁会话 | + +### 开发步骤 +1.导入模块接口 + +```js +import avSession from '@ohos.multimedia.avsession'; +import wantAgent from '@ohos.wantAgent'; +import featureAbility from '@ohos.ability.featureAbility'; +``` + +2.创建会话并激活会话 +```js +// 全局变量定义 +let mediaFavorite = false; +let currentSession = null; +let context = featureAbility.getContext(); + +// 创建音频类型会话 +avSession.createAVSession(context, "AudioAppSample", 'audio').then((session) => { + currentSession = session; + currentSession.activate(); // 激活会话 +}).catch((err) => { + console.info(`createAVSession : ERROR : ${err.message}`); +}); +``` + +3.设置AVSession会话信息,包括: +- 设置会话元数据,除了媒体ID必选外,可选设置媒体标题、专辑信息、媒体作者、媒体时长、上一首/下一首媒体ID等。详细的会话元数据信息可参考API文档中的`AVMetadata`。 +- 设置启动Ability,通过`WantAgent`的接口实现。WantAgent一般用于封装行为意图信息,如果想要了解更多信息,可以查阅[WantAgent开发指导](../reference/apis/js-apis-wantAgent.md)。 +- 设置播放状态。 +```js +// 设置会话元数据 +let metadata = { + assetId: "121278", + title: "lose yourself", + artist: "Eminem", + author: "ST", + album: "Slim shady", + writer: "ST", + composer: "ST", + duration: 2222, + mediaImage: "https://www.example.com/example.jpg", // 请开发者根据实际情况使用 + subtitle: "8 Mile", + description: "Rap", + lyric: "https://www.example.com/example.lrc", // 请开发者根据实际情况使用 + previousAssetId: "121277", + nextAssetId: "121279", +}; +currentSession.setAVMetadata(metadata).then(() => { + console.info('setAVMetadata successfully'); +}).catch((err) => { + console.info(`setAVMetadata : ERROR : ${err.message}`); +}); +``` + +```js +// 设置启动ability +let wantAgentInfo = { + wants: [ + { + bundleName: "com.neu.setResultOnAbilityResultTest1", + abilityName: "com.example.test.MainAbility", + } + ], + operationType: wantAgent.OperationType.START_ABILITIES, + requestCode: 0, + wantAgentFlags:[wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG] +} + +wantAgent.getWantAgent(wantAgentInfo).then((agent) => { + currentSession.setLaunchAbility(agent).then(() => { + console.info('setLaunchAbility successfully'); + }).catch((err) => { + console.info(`setLaunchAbility : ERROR : ${err.message}`); + }); +}); +``` + +```js +// 设置播放状态 +let PlaybackState = { + state: avSession.PlaybackState.PLAYBACK_STATE_STOP, + speed: 1.0, + position:{elapsedTime: 0, updateTime: (new Date()).getTime()}, + bufferedTime: 1000, + loopMode: avSession.LoopMode.LOOP_MODE_SEQUENCE, + isFavorite: false, +}; +currentSession.setAVPlaybackState(PlaybackState).then(() => { + console.info('setAVPlaybackState successfully'); +}).catch((err) => { + console.info(`setAVPlaybackState : ERROR : ${err.message}`); +}); +``` + +```js +// 获取当前session会话对象自身的控制器 +currentSession.getController().then((selfController) => { + console.info('getController successfully'); +}).catch((err) => { + console.info(`getController : ERROR : ${err.message}`); +}); +``` + +```js +// 获取音频输出设备信息 +currentSession.getOutputDevice().then((outputInfo) => { + console.info(`getOutputDevice successfully, deviceName : ${outputInfo.deviceName}`); +}).catch((err) => { + console.info(`getOutputDevice : ERROR : ${err.message}`); +}); +``` + +4.注册控制命令监听 +```js +// 注册播放命令监听 +currentSession.on('play', () => { + console.log("调用AudioPlayer.play方法"); + // 设置播放状态 + currentSession.setAVPlaybackState({state: avSession.PlaybackState.PLAYBACK_STATE_PLAY}).then(() => { + console.info('setAVPlaybackState successfully'); + }).catch((err) => { + console.info(`setAVPlaybackState : ERROR : ${err.message}`); + }); +}); + + +// 注册暂停命令监听 +currentSession.on('pause', () => { + console.log("调用AudioPlayer.pause方法"); + // 设置播放状态 + currentSession.setAVPlaybackState({state: avSession.PlaybackState.PLAYBACK_STATE_PAUSE}).then(() => { + console.info('setAVPlaybackState successfully'); + }).catch((err) => { + console.info(`setAVPlaybackState : ERROR : ${err.message}`); + }); +}); + +// 注册停止命令监听 +currentSession.on('stop', () => { + console.log("调用AudioPlayer.stop方法"); + // 设置播放状态 + currentSession.setAVPlaybackState({state: avSession.PlaybackState.PLAYBACK_STATE_STOP}).then(() => { + console.info('setAVPlaybackState successfully'); + }).catch((err) => { + console.info(`setAVPlaybackState : ERROR : ${err.message}`); + }); +}); + +// 注册下一首命令监听 +currentSession.on('playNext', () => { + // 如果媒体文件未准备好,则下载并缓存媒体文件,设置准备状态 + currentSession.setAVPlaybackState({state: avSession.PlaybackState.PLAYBACK_STATE_PREPARE}).then(() => { + console.info('setAVPlaybackState successfully'); + }).catch((err) => { + console.info(`setAVPlaybackState : ERROR : ${err.message}`); + }); + // 成功获取媒体文件 + currentSession.setAVMetadata({assetId: '58970105', title: '不如我们明天见'}).then(() => { + console.info('setAVMetadata successfully'); + }).catch((err) => { + console.info(`setAVMetadata : ERROR : ${err.message}`); + }); + console.log("调用AudioPlayer.play方法"); + // 设置播放状态 + let time = (new Data()).getTime(); + currentSession.setAVPlaybackState({state: avSession.PlaybackState.PLAYBACK_STATE_PLAY, position: {elapsedTime: 0, updateTime: time}, bufferedTime:2000}).then(() => { + console.info('setAVPlaybackState successfully'); + }).catch((err) => { + console.info(`setAVPlaybackState : ERROR : ${err.message}`); + }); +}); + +// 注册播放快进命令监听 +currentSession.on('fastForward', () => { + console.log("调用AudioPlayer的倍速播放"); + // 设置播放状态 + currentSession.setAVPlaybackState({speed: 2.0}).then(() => { + console.info('setAVPlaybackState successfully'); + }).catch((err) => { + console.info(`setAVPlaybackState : ERROR : ${err.message}`); + }); +}); + +// 注册跳播命令监听 +currentSession.on('seek', (time) => { + console.log("调用AudioPlayer的seek方法"); + // 设置播放状态 + currentSession.setAVPlaybackState({position: {elapsedTime: time, updateTime: (new Data()).getTime()}}).then(() => { + console.info('setAVPlaybackState successfully'); + }).catch((err) => { + console.info(`setAVPlaybackState : ERROR : ${err.message}`); + }); +}); + +// 注册设置播放速度命令监听 +currentSession.on('setSpeed', (speed) => { + console.log(`调用AudioPlayer的倍速播放 ${speed}`); + // 设置播放状态 + currentSession.setAVPlaybackState({speed: speed}).then(() => { + console.info('setAVPlaybackState successfully'); + }).catch((err) => { + console.info(`setAVPlaybackState : ERROR : ${err.message}`); + }); +}); + +// 注册设置播放循环模式命令监听 +currentSession.on('setLoopMode', (mode) => { + console.log(`应用自身切换循环模式 ${mode}`); + // 设置播放状态 + currentSession.setAVPlaybackState({loopMode: mode}).then(() => { + console.info('setAVPlaybackState successfully'); + }).catch((err) => { + console.info(`setAVPlaybackState : ERROR : ${err.message}`); + }); +}); + +// 注册设置歌曲收藏命令监听 +currentSession.on('toggleFavorite', (assetId) => { + console.log(`应用保存当前assetId为喜爱 ${assetId}`); + // 根据上一次的状态进行切换 + let favorite = mediaFavorite == false ? true : false; + currentSession.setAVPlaybackState({isFavorite: favorite}).then(() => { + console.info('setAVPlaybackState successfully'); + }).catch((err) => { + console.info(`setAVPlaybackState : ERROR : ${err.message}`); + }); + mediaFavorite = favorite; +}); + +// 注册媒体按键命令监听 +currentSession.on('handleKeyEvent', (event) => { + console.log(`用户按键 ${event.keyCode}`); +}); + +// 注册播放设备变化命令监听 +currentSession.on('outputDeviceChange', (device) => { + console.log(`输出设备变更,更新显示 ${device.deviceName}`); +}); +``` + +5.释放资源 +```js +// 取消注册回调 +currentSession.off('play'); +currentSession.off('pause'); +currentSession.off('stop'); +currentSession.off('playNext'); +currentSession.off('playPrevious'); +currentSession.off('fastForward'); +currentSession.off('rewind'); +currentSession.off('seek'); +currentSession.off('setSpeed'); +currentSession.off('setLoopMode'); +currentSession.off('toggleFavorite'); +currentSession.off('handleKeyEvent'); +currentSession.off('outputDeviceChange'); + +// 去激活session并销毁对象 +currentSession.deactivate().then(() => { + currentSession.destory(); +}); +``` + +### 调测验证 +在媒体应用上点击播放、暂停、下一首等按键,媒体播放状态出现相应变化。 + +### 常见问题 + +1.会话服务端异常 +- 现象描述: + + 会话服务端异常,应用端无法获取服务端的消息响应。如会话服务未运行或者会话服务通信失败。返回错误信息: Session service exception。 + +- 可能原因: + + 会话重启过程中服务被杀。 + +- 解决办法 + + (1)定时重试,超过3s仍失败时,停止对该会话或者控制器进行操作。 + + (2)销毁当前会话或者会话控制器,并重新创建,如果重新创建失败,则停止会话相关操作。 + +2.会话不存在 +- 现象描述: + + 会话对象不存在时,向该会话设置参数或者发送命令。返回错误信息: The session does not exist。 + +- 可能原因: + + 会话已被销毁,服务端无会话记录。 + +- 解决办法 + + (1)如果在会话被控端产生该错误,请重新创建会话;如果是会话控制端,请停止向该会话发送查询或者控制命令。 + + (2)如果在会话管理端产生该错误,请重新查询系统当前会话记录,在创建控制器时传入正确的会话ID。 + +3.会话未激活 +- 现象描述: + + 会话没有激活时,向会话发送控制命令或者事件。。返回错误信息: The session not active。 + +- 可能原因: + + 会话处于未激活状态。 + +- 解决办法 + + 停止发送该命令或事件,监听会话的激活状态,会话激活后恢复发送该命令或事件。 + +### 相关实例 +提供[音乐Demo](https://gitee.com/openharmony/multimedia_av_session/blob/master/test/resource/player_index_js.md)的代码实例 + +## 会话控制端开发指导(播控中心) + +### 基本概念 +- 远端投播:将本地媒体投播到远端设备,通过本地控制器发送命令,可控制远端播放行为。 +- 发送按键命令:控制器通过发送按键事件的方式控制媒体。 +- 发送控制命令:控制器通过发送控制命令的方式控制媒体。 +- 发送系统按键命令:应用拥有调用该接口的系统权限,通过发送按键事件的方式控制媒体,仅系统应用可用。 +- 发送系统控制命令:应用拥有调用该接口的系统权限,通过发送控制命令的方式控制媒体,仅系统应用可用。 + +### 接口说明 + +会话控制端涉及的常用接口如下表所示。接口返回值有两种返回形式:callback和promise,下表中为callback形式接口,promise和callback只是返回值方式不一样,功能相同。更多API说明请参见[API文档](../reference/apis/js-apis-avsession.md)。 + +表2:会话控制端常用接口 + +| 接口名 | 描述 | +| ------------------------------------------------------------------------------------------------ | ----------------- | +| getAllSessionDescriptors(callback: AsyncCallback>>): void | 获取所有会话的描述符 | +| createController(sessionId: string, callback: AsyncCallback): void | 创建控制器 | +| sendAVKeyEvent(event: KeyEvent, callback: AsyncCallback): void | 发送按键命令 | +| getLaunchAbility(callback: AsyncCallback): void | 拉起应用 | +| sendControlCommand(command: AVControlCommand, callback: AsyncCallback): void | 发送控制命令 | +| sendSystemAVKeyEvent(event: KeyEvent, callback: AsyncCallback): void | 发送系统按键命令 | +| sendSystemControlCommand(command: AVControlCommand, callback: AsyncCallback): void | 发送系统控制命令 | +| castAudio(session: SessionToken | 'all', audioDevices: Array, callback: AsyncCallback): void | 远端投播 | + +### 开发步骤 +1.导入模块接口 +```js +import avSession from '@ohos.multimedia.avsession'; +import {Action, KeyEvent} from '@ohos.multimodalInput.KeyEvent'; +import wantAgent from '@ohos.wantAgent'; +import audio from '@ohos.multimedia.audio'; +``` + +2.获取会话描述符,创建控制器 +```js +// 全局变量定义 +let g_controller = new Array(); +let g_centerSupportCmd:Set = new Set(['play', 'pause', 'playNext', 'playPrevious', 'fastForward', 'rewind', 'seek','setSpeed', 'setLoopMode', 'toggleFavorite']); +let g_validCmd:Set; + +// 获取会话描述符,创建控制器 +avSession.getAllSessionDescriptors().then((descriptors) => { + descriptors.forEach((descriptor) => { + avSession.createController(descriptor.sessionId).then((controller) => { + g_controller.push(controller); + }).catch((err) => { + console.error('createController error'); + }); + }); +}).catch((err) => { + console.error('getAllSessionDescriptors error'); +}); + +// 注册会话创建监听,创建控制器 +avSession.on('sessionCreate', (session) => { + // 新增会话,需要创建控制器 + avSession.createController(session.sessionId).then((controller) => { + g_controller.push(controller); + }).catch((err) => { + console.info(`createController : ERROR : ${err.message}`); + }); +}); +``` + +3.监听AVSession会话状态以及AVSession服务变化 +```js +// 注册会话激活状态变更监听 +controller.on('activeStateChange', (isActive) => { + if (isActive) { + console.log("控制器卡片按键高亮"); + } else { + console.log("控制器卡片按键变更为无效"); + } +}); + +// 注册会话销毁监听 +controller.on('sessionDestroy', () => { + console.info('on sessionDestroy : SUCCESS '); + controller.destroy().then(() => { + console.info('destroy : SUCCESS '); + }).catch((err) => { + console.info(`destroy : ERROR :${err.message}`); + }); +}); + +// 注册系统会话销毁监听 +avSession.on('sessionDestroy', (session) => { + let index = g_controller.findIndex((controller) => { + return controller.sessionId == session.sessionId; + }); + if (index != 0) { + g_controller[index].destroy(); + g_controller.splice(index, 1); + } +}); + +// 注册系统最高优先级会话变更监听 +avSession.on('topSessionChange', (session) => { + let index = g_controller.findIndex((controller) => { + return controller.sessionId == session.sessionId; + }); + // 将该会话显示排到第一个 + if (index != 0) { + g_controller.sort((a, b) => { + return a.sessionId == session.sessionId ? -1 : 0; + }); + } +}); + +// 注册服务异常监听 +avSession.on('sessionServiceDie', () => { + // 服务端异常,应用清理资源 + console.log("服务端异常"); +}) +``` + +4.监听AVSession会话信息变化 +```js +// 注册元数据更新监听 +let metaFilter = ['assetId', 'title', 'description']; +controller.on('metadataChange', metaFilter, (metadata) => { + console.info(`on metadataChange assetId : ${metadata.assetId}`); +}); + +// 注册播放状态更新监听 +let playbackFilter = ['state', 'speed', 'loopMode']; +controller.on('playbackStateChange', playbackFilter, (playbackState) => { + console.info(`on playbackStateChange state : ${playbackState.state}`); +}); + +// 注册会话支持的命令变更监听 +controller.on('validCommandChange', (cmds) => { + console.info(`validCommandChange : SUCCESS : size : ${cmds.size}`); + console.info(`validCommandChange : SUCCESS : cmds : ${cmds.values()}`); + g_validCmd.clear(); + for (let c of g_centerSupportCmd) { + if (cmds.has(c)) { + g_validCmd.add(c); + } + } +}); + +// 注册输出设备变更监听 +controller.on('outputDeviceChange', (device) => { + console.info(`on outputDeviceChange device isRemote : ${device.isRemote}`); +}); +``` + +5.控制AVSession会话行为 +```js +// 用户点击播放按键:发送控制命令--播放 +if (g_validCmd.has('play')) { + controller.sendControlCommand({command:'play'}).then(() => { + console.info('sendControlCommand successfully'); + }).catch((err) => { + console.info(`sendControlCommand : ERROR : ${err.message}`); + }); +} + +// 用户点击循环模式:发送控制命令--单曲循环 +if (g_validCmd.has('setLoopMode')) { + controller.sendControlCommand({command: 'setLoopMode', parameter: avSession.LoopMode.LOOP_MODE_SINGLE}).then(() => { + console.info('sendControlCommand successfully'); + }).catch((err) => { + console.info(`sendControlCommand : ERROR : ${err.message}`); + }); +} + +// 发送按键事件 +let keyItem = {code: 0x49, pressedTime: 123456789, deviceId: 0}; +let event = {action: 2, key: keyItem, keys: [keyItem]}; +controller.sendAVKeyEvent(event).then(() => { + console.info('sendAVKeyEvent Successfully'); +}).catch((err) => { + console.info(`sendAVKeyEvent : ERROR : ${err.message}`); +}); + +// 用户点击卡片空白位置拉起应用 +controller.getLaunchAbility().then((want) => { + console.log("前台拉起应用"); +}).catch((err) => { + console.info(`getLaunchAbility : ERROR : ${err.message}`); +}); + +// 发送系统媒体按键事件 +let keyItem = {code: 0x49, pressedTime: 123456789, deviceId: 0}; +let event = {action: 2, key: keyItem, keys: [keyItem]}; +avSession.sendSystemAVKeyEvent(event).then(() => { + console.info('sendSystemAVKeyEvent Successfully'); +}).catch((err) => { + console.info(`sendSystemAVKeyEvent : ERROR : ${err.message}`); +}); + +// 发送系统控制命令,系统会把控制命令发送到Top会话中 +let avcommand = {command: 'toggleFavorite', parameter: "false"}; +avSession.sendSystemControlCommand(avcommand).then(() => { + console.info('sendSystemControlCommand successfully'); +}).catch((err) => { + console.info(`sendSystemControlCommand : ERROR : ${err.message}`); +}); + +// 投播到其他设备 +let audioManager = audio.getAudioManager(); +let audioDevices; +await audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data) => { + audioDevices = data; + console.info('Promise returned to indicate that the device list is obtained.'); +}).catch((err) => { + console.info(`getDevices : ERROR : ${err.message}`); +}); + +avSession.castAudio('all', audioDevices).then(() => { + console.info('createController : SUCCESS'); +}).catch((err) => { + console.info(`createController : ERROR : ${err.message}`); +}); +``` + +6.释放资源 +```js +// 取消注册回调 + controller.off('metadataChange'); + controller.off('playbackStateChange'); + controller.off('sessionDestroy'); + controller.off('activeStateChange'); + controller.off('validCommandChange'); + controller.off('outputDeviceChange'); + + // 销毁controller对象 + controller.destroy().then(() => { + console.info('destroy : SUCCESS '); + }).catch((err) => { + console.info(`destroy : ERROR : ${err.message}`); + }); +``` + +### 调测验证 +在播控中心点击播放、暂停、下一首等按键,应用播放状态随即发生相应变化。 + +### 常见问题 +1.控制器不存在 +- 现象描述: + + 会话控制器不存在时,向该控制器发送控制命令或者事件。返回错误信息: The session controller does not exist。 + +- 可能原因: + + 控制器已被销毁。 + +- 解决办法 + + 请重新查询系统当前会话记录,并创建对应的会话控制器。 + +2.远端会话连接失败 +- 现象描述: + + 本端会话与远端会话通信失败。返回错误信息: The remote session connection failed。 + +- 可能原因: + + 设备间通信断开。 + +- 解决办法 + + 停止对该会话发送控制命令,并监听输出设备变化,当输出设备发送变化后恢复发送。 + +3.无效会话命令 +- 现象描述: + + 会话被控端不支持该被控命令或事件。返回错误信息: Invalid session command。 + +- 可能原因: + + 被控端不支持该命令。 + +- 解决办法 + + 停止发送该命令或事件,并查询被控会话支持的命令集,发送被控端支持的命令。 + +4.消息过载 +- 现象描述: + + 会话客户端在一段时间内向服务端发送了过多的消息或者命令,引起服务端消息过载。返回错误信息: Command or event overload。 + +- 可能原因: + + 服务端消息过载。 + +- 解决办法 + + 检查自身命令发送是否过于频繁,控制自身查询和控制命令的发送频度。 + +### 相关实例 +提供[播控中心Demo](https://gitee.com/openharmony/multimedia_av_session/blob/master/test/resource/controller_index_js.md)的代码实例 \ No newline at end of file diff --git a/zh-cn/application-dev/media/avsession-overview.md b/zh-cn/application-dev/media/avsession-overview.md new file mode 100644 index 0000000000..8cea922894 --- /dev/null +++ b/zh-cn/application-dev/media/avsession-overview.md @@ -0,0 +1,52 @@ +# AVSession开发概述 + +## 简介 + + AVSession(Audio & Video Session),音视频会话,即媒体会话。 + - 对应用开发者而言,媒体会话提供了将应用内音视频接入系统播控中心的能力。 + - 对系统开发者而言,媒体会话提供了对系统音视频应用的媒体信息进行展示和统一的媒体播放控制的能力。 + + 通过AVSession,可以实现: + + 1.统一播控入口,提升用户体验。 + + 当设备上安装了多个音视频类应用时,用户需要切换、进入不同的应用来控制播放。通过接入AVSession,音视频应用可以通过系统的统一播控入口(如播控中心)来控制设备上的媒体播放,无需切换不同应用,提升使用体验。 + + 2.完善音视频后台管控。 + + 当应用在后台自行启动音频播放时,用户难以快速定位对应的应用,造成体验问题。接入AVSession后,允许应用在后台进行音乐播放,便于用户在播控中心快速找到播放应用。 + +## 基本概念 + +- 媒体会话 + + 用于应用和播控中心之间进行信息交换的通道。会话的一端连接被控的媒体应用,另一端连接媒体应用的控制端(如播控中心)。应用接入了媒体会话后,可以通过媒体会话将媒体播放信息传递给控制端,并能够接收到控制端发出的控制命令。 + +- 媒体会话控制器 + + 媒体会话控制器的持有者可以控制接入了AVSession应用的播放行为。通过会话控制器,应用可以对三方应用进程的播放行为进行控制,支持获取三方应用的播放信息,发送播放控制命令,也支持监听三方应用的播放状态等的变化,确保媒体会话信息的同步。 + +- 播控中心 + + 系统统一的媒体控制中心,会话控制器的持有者。通过控制器发送命令来控制媒体的播放、暂停等。 + +## 实现原理 + +该模块提供了`AVSession`会话类和`AVSessionController`控制器类。 + +**图1** AVSession交互图 + +![zh-ch_image_avsession](figures/zh-cn_image_avsession.png) + +- 应用与播控中心交互:首先,音频应用创建`AVSession`对象,并设置会话信息(包括媒体元数据、对应拉起的Ability、播放状态等)。然后,播控中心创建`AVSessionController`,可获取会话相关信息,向音频应用发送播放命令。最后,音频应用响应播控中心的命令并更新播放状态。 + +- 支持分布式投播:当组网内的设备创建本地会话之后,播控中心或者音频应用可以根据设备列表选择想要投播的其他设备,将本地会话同步到远端,生成远端会话,并支持远端控制。需要控制远端会话时,通过远端控制器将控制命令发送到远端会话控制中心。 + +## 约束和限制 + +- 播控中心展示的播放信息,依赖媒体应用主动将媒体信息写入到AVSession。 +- 播控中心控制媒体应用播放,依赖于媒体应用侧对控制命令的响应。 +- AVSession只能够传递媒体播放信息和播放控制指令,不进行信息的展示和控制命令的执行。 +- 普通应用不支持开发播控中心端。当普通音视频应用运行在OpenHarmony上时,默认控制端为系统应用播控中心,开发者无需做额外的操作。 +- 播控中心为系统应用,当开发者需要基于OpenHarmony开发自己的系统时,可以开发本系统的播控中心应用。 +- 为了解决音频在后台播放时用户无法获取到停止音频的入口,影响用户体验,AVSession服务增加了三方应用后台管控策略,只有三方应用接入了AVSession,才可以后台播放,否则当三方应用切后台时系统会强制暂停其音频播放。 diff --git a/zh-cn/application-dev/media/figures/zh-cn_image_avsession.png b/zh-cn/application-dev/media/figures/zh-cn_image_avsession.png new file mode 100755 index 0000000000000000000000000000000000000000..9abc37206f8a1084796f838ac0c392c175cf93a1 GIT binary patch literal 49086 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 XohO8aQt7uB*L?Lt`FZg( **说明:** +> +> 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + +## 导入模块 + +```js +import avSession from '@ohos.multimedia.avsession'; +``` + +## avSession.createAVSession + +createAVSession(context: Context, tag: string, type: AVSessionType): Promise\ + +创建会话对象,一个Ability只能存在一个会话,重复创建会失败,结果通过Promise异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------------------------------- | ---- | ------------------------------ | +| context| [Context](../../ability/context-userguide.md) | 是| 应用上下文,提供获取应用程序环境信息的能力。 | +| tag | string | 是 | 会话的自定义名称。 | +| type | [AVSessionType](#avsessiontype) | 是 | 会话类型,当前支持音频和视频。 | + + +**返回值:** + +| 类型 | 说明 | +| --------------------------------- | ------------------------------------------------------------ | +| Promise<[AVSession](#avsession)\> | Promise对象。回调返回会话实例对象,可用于获取会话ID,以及设置元数据、播放状态,发送按键事件等操作。| + + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | + +**示例:** + +```js +import featureAbility from '@ohos.ability.featureAbility'; + +let session; +let tag = "createNewSession"; +let type = "audio"; +let context = featureAbility.getContext(); + +await avSession.createAVSession(context, tag, type).then((avSession) => { + session = avSession; + console.info(`CreateAVSession : SUCCESS : sessionId = ${session.sessionId}`); +}).catch((err) => { + console.info(`CreateAVSession BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +## avSession.createAVSession + +createAVSession(context: Context, tag: string, type: AVSessionType, callback: AsyncCallback\): void + +创建会话对象,一个Ability只能存在一个会话,重复创建会失败,结果通过callback异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ------------------------------------------------------------ | +| context| [Context](../../ability/context-userguide.md) | 是| 应用上下文,提供获取应用程序环境信息的能力。 | +| tag | string | 是 | 会话的自定义名称。 | +| type | [AVSessionType](#avsessiontype) | 是 | 会话类型,当前支持音频和视频。 | +| callback | AsyncCallback<[AVSession](#avsession)\> | 是 | 回调函数。回调返回会话实例对象,可用于获取会话ID,以及设置元数据、播放状态,发送按键事件等操作。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | + +**示例:** + +```js +import featureAbility from '@ohos.ability.featureAbility'; + +let session; +let tag = "createNewSession"; +let type = "audio"; +let context = featureAbility.getContext(); + +avSession.createAVSession(context, tag, type, function (err, avSession) { + if (err) { + console.info(`CreateAVSession BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + session = avSession; + console.info(`CreateAVSession : SUCCESS : sessionId = ${session.sessionId}`); + } +}); +``` + +## avSession.getAllSessionDescriptors + +getAllSessionDescriptors(): Promise\>> + +获取所有会话的相关描述。结果通过Promise异步回调方式返回。 + +**需要权限:** ohos.permission.MANAGE_MEDIA_RESOURCES,仅系统应用可用。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Manager + +**系统接口:** 该接口为系统接口。 + +**返回值:** + +| 类型 | 说明 | +| ------------------------------------------------------------ | --------------------------------------------- | +| Promise\\>\> | Promise对象。返回所有会话描述的只读对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | + +**示例:** + +```js +avSession.getAllSessionDescriptors().then((descriptors) => { + console.info(`getAllSessionDescriptors : SUCCESS : descriptors.length : ${descriptors.length}`); + if(descriptors.length > 0 ){ + console.info(`getAllSessionDescriptors : SUCCESS : descriptors[0].isActive : ${descriptors[0].isActive}`); + console.info(`GetAllSessionDescriptors : SUCCESS : descriptors[0].type : ${descriptors[0].type}`); + console.info(`GetAllSessionDescriptors : SUCCESS : descriptors[0].sessionTag : ${descriptors[0].sessionTag}`); + } +}).catch((err) => { + console.info(`GetAllSessionDescriptors BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +## avSession.getAllSessionDescriptors + +getAllSessionDescriptors(callback: AsyncCallback\>>): void + +获取所有会话的相关描述。结果通过callback异步回调方式返回。 + +**需要权限:** ohos.permission.MANAGE_MEDIA_RESOURCES,仅系统应用可用。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Manager + +**系统接口:** 该接口为系统接口。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------ | +| callback | AsyncCallback\>\> | 是 | 回调函数。返回所有会话描述的只读对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 |Session service exception | + +**示例:** + +```js +avSession.getAllSessionDescriptors(function (err, descriptors) { + if (err) { + console.info(`GetAllSessionDescriptors BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info(`GetAllSessionDescriptors : SUCCESS : descriptors.length : ${descriptors.length}`); + if(descriptors.length > 0 ){ + console.info(`getAllSessionDescriptors : SUCCESS : descriptors[0].isActive : ${descriptors[0].isActive}`); + console.info(`getAllSessionDescriptors : SUCCESS : descriptors[0].type : ${descriptors[0].type}`); + console.info(`getAllSessionDescriptors : SUCCESS : descriptors[0].sessionTag : ${descriptors[0].sessionTag}`); + } + } +}); +``` + +## avSession.createController + +createController(sessionId: string): Promise\ + +根据会话ID创建会话控制器,可以创建多个会话控制器。结果通过Promise异步回调方式返回。 + +**需要权限:** ohos.permission.MANAGE_MEDIA_RESOURCES,仅系统应用可用。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Manager + +**系统接口:** 该接口为系统接口。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| --------- | ------ | ---- | -------- | +| sessionId | string | 是 | 会话ID。 | + +**返回值:** + +| 类型 | 说明 | +| ----------------------------------------------------- | ------------------------------------------------------------ | +| Promise<[AVSessionController](#avsessioncontroller)\> | Promise对象。返回会话控制器实例,可查看会话ID,
并完成对会话发送命令及事件,获取元数据、播放状态信息等操作。| + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +let controller; +await avSession.createController(session.sessionId).then((avcontroller) => { + controller = avcontroller; + console.info(`CreateController : SUCCESS : ${controller.sessionId}`); +}).catch((err) => { + console.info(`CreateController BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +## avSession.createController + +createController(sessionId: string, callback: AsyncCallback\): void + +根据会话ID创建会话控制器,可以创建多个会话控制器。结果通过callback异步回调方式返回。 + +**需要权限:** ohos.permission.MANAGE_MEDIA_RESOURCES,仅系统应用可用。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Manager + +**系统接口:** 该接口为系统接口。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| --------- | ----------------------------------------------------------- | ---- | ------------------------------------------------------------ | +| sessionId | string | 是 | 会话ID。 | +| callback | AsyncCallback<[AVSessionController](#avsessioncontroller)\> | 是 | 回调函数。返回会话控制器实例,可查看会话ID,
并完成对会话发送命令及事件,获取元数据、播放状态信息等操作。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +let controller; +avSession.createController(session.sessionId, function (err, avcontroller) { + if (err) { + console.info(`CreateController BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + controller = avcontroller; + console.info(`CreateController : SUCCESS : ${controller.sessionId}`); + } +}); +``` + +## avSession.castAudio + +castAudio(session: SessionToken | 'all', audioDevices: Array): Promise\ + +投播会话到指定设备列表。结果通过Promise异步回调方式返回。 + +调用此接口之前,需要导入`ohos.multimedia.audio`模块获取AudioDeviceDescriptor的相关描述。 + +**需要权限:** ohos.permission.MANAGE_MEDIA_RESOURCES,仅系统应用可用。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Manager + +**系统接口:** 该接口为系统接口。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------------ |--------------------------------------------------------------------------------------------------------------------------------------------------------------------| ---- | ------------------------------------------------------------ | +| session | [SessionToken](#sessiontoken) | 'all' | 是 | 会话令牌。SessionToken表示单个token;字符串`'all'`指所有token。 | +| audioDevices | Array\<[audio.AudioDeviceDescriptor](js-apis-audio.md#audiodevicedescriptor)\> | 是 | 媒体设备列表。 | + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------- | +| Promise | Promise对象。当投播成功,无返回结果,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | +| 6600104 | The remote session connection failed | + +**示例:** + +```js +import audio from '@ohos.multimedia.audio'; + +let audioManager = audio.getAudioManager(); +let audioDevices; +await audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data) => { + audioDevices = data; + console.info('Promise returned to indicate that the device list is obtained.'); +}).catch((err) => { + console.info(`GetDevices BusinessError: code: ${err.code}, message: ${err.message}`); +}); + +avSession.castAudio('all', audioDevices).then(() => { + console.info('CreateController : SUCCESS'); +}).catch((err) => { + console.info(`CreateController BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +## avSession.castAudio + +castAudio(session: SessionToken | 'all', audioDevices: Array, callback: AsyncCallback\): void + +投播会话到指定设备列表。结果通过callback异步回调方式返回。 + +需要导入`ohos.multimedia.audio`模块获取AudioDeviceDescriptor的相关描述。 + +**需要权限:** ohos.permission.MANAGE_MEDIA_RESOURCES,仅系统应用可用。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Manager + +**系统接口:** 该接口为系统接口。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------------ |--------------------------------------------| ---- | ------------------------------------------------------------ | +| session | [SessionToken](#sessiontoken) | 'all' | 是 | 会话令牌。SessionToken表示单个token;字符串`'all'`指所有token。 | +| audioDevices | Array\<[audio.AudioDeviceDescriptor](js-apis-audio.md#audiodevicedescriptor)\> | 是 | 媒体设备列表。 | +| callback | AsyncCallback | 是 | 回调函数。当投播成功,err为undefined,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | +| 6600104 | The remote session connection failed | + +**示例:** + +```js +import audio from '@ohos.multimedia.audio'; + +let audioManager = audio.getAudioManager(); +let audioDevices; +await audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data) => { + audioDevices = data; + console.info('Promise returned to indicate that the device list is obtained.'); +}).catch((err) => { + console.info(`GetDevices BusinessError: code: ${err.code}, message: ${err.message}`); +}); + +avSession.castAudio('all', audioDevices, function (err) { + if (err) { + console.info(`CastAudio BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info('CastAudio : SUCCESS '); + } +}); +``` + +## avSession.on('sessionCreate' | 'sessionDestroy' | 'topSessionChange') + +on(type: 'sessionCreate' | 'sessionDestroy' | 'topSessionChange', callback: (session: AVSessionDescriptor) => void): void + +会话的创建、销毁以及最新会话变更的监听事件。 + +**需要权限:** ohos.permission.MANAGE_MEDIA_RESOURCES,仅系统应用可用。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Manager + +**系统接口:** 该接口为系统接口。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 事件回调类型,支持的事件包括:
- `'sessionCreate'`:会话创建事件,检测到会话创建时触发。
- `'sessionDestroy'`:会话销毁事件,检测到会话销毁时触发。
- `'topSessionChange'`:最新会话的变化事件,检测到最新的会话改变时触发。| +| callback | (session: [AVSessionDescriptor](#avsessiondescriptor)) => void | 是 | 回调函数。参数为会话相关描述。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | + +**示例:** + +```js +avSession.on('sessionCreate', (descriptor) => { + console.info(`on sessionCreate : isActive : ${descriptor.isActive}`); + console.info(`on sessionCreate : type : ${descriptor.type}`); + console.info(`on sessionCreate : sessionTag : ${descriptor.sessionTag}`); +}); + +avSession.on('sessionDestroy', (descriptor) => { + console.info(`on sessionDestroy : isActive : ${descriptor.isActive}`); + console.info(`on sessionDestroy : type : ${descriptor.type}`); + console.info(`on sessionDestroy : sessionTag : ${descriptor.sessionTag}`); +}); + +avSession.on('topSessionChange', (descriptor) => { + console.info(`on topSessionChange : isActive : ${descriptor.isActive}`); + console.info(`on topSessionChange : type : ${descriptor.type}`); + console.info(`on topSessionChange : sessionTag : ${descriptor.sessionTag}`); +}); +``` + +## avSession.off('sessionCreate' | 'sessionDestroy' | 'topSessionChange') + +off(type: 'sessionCreate' | 'sessionDestroy' | 'topSessionChange', callback?: (session: AVSessionDescriptor) => void): void + +取消会话相关事件监听,取消后,不再进行相关事件的监听。 + +**需要权限:** ohos.permission.MANAGE_MEDIA_RESOURCES,仅系统应用可用。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Manager + +**系统接口:** 该接口为系统接口。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 事件回调类型,支持的事件为:
- `'sessionCreate'`:会话创建事件,检测到会话创建时触发。
- `'sessionDestroy'`:会话销毁事件,检测到会话销毁时触发。
- `'topSessionChange'`:最新会话的变化事件,检测到最新的会话改变时触发。| +| callback | (session: [AVSessionDescriptor](#avsessiondescriptor)) => void | 否 | 回调函数。当监听事件取消成功,err为undefined,否则返回错误对象。
该参数为会话相关描述,为可选参数,若不填写该参数,则认为取消所有相关会话的事件监听。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | + +**示例:** + +```js +avSession.off('sessionCreate'); +avSession.off('sessionDestroy'); +avSession.off('topSessionChange'); +``` + +## avSession.on('sessionServiceDie') + +on(type: 'sessionServiceDie', callback: () => void): void + +监听会话的服务死亡事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 事件回调类型,支持事件`'sessionServiceDie'`:会话服务死亡事件,检测到会话的服务死亡时触发。 | +| callback | callback: () => void | 是 | 回调函数。当监听事件注册成功,err为undefined,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | + +**示例:** + +```js +avSession.on('sessionServiceDie', () => { + console.info('on sessionServiceDie : session is Died '); +}); +``` + +## avSession.off('sessionServiceDie') + +off(type: 'sessionServiceDie', callback?: () => void): void + +取消会话服务死亡监听,取消后,不再进行服务死亡监听。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ---------------------- | ---- | ------------------------------------------------------- | +| type | string | 是 | 事件回调类型,支持事件`'sessionServiceDie'`:会话服务死亡事件。| +| callback | callback: () => void | 否 | 回调函数。当监听事件取消成功,err为undefined,否则返回错误对象。
该参数为可选参数,若不填写该参数,则认为取消所有相关会话的服务死亡监听。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | + +**示例:** + +```js +avSession.off('sessionServiceDie'); +``` + +## avSession.sendSystemAVKeyEvent + +sendSystemAVKeyEvent(event: KeyEvent): Promise\ + +发送按键事件给置顶会话。结果通过Promise异步回调方式返回。 + +**需要权限:** ohos.permission.MANAGE_MEDIA_RESOURCES,仅系统应用可用。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Manager + +**系统接口:** 该接口为系统接口。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------------------------------- | ---- | ---------- | +| event | [KeyEvent](js-apis-keyevent.md) | 是 | 按键事件。 | + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------- | +| Promise | Promise对象。当事件发送成功,无返回结果,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600105 | Invalid session command | + +**示例:** + +```js + +let keyItem = {code:0x49, pressedTime:2, deviceId:0}; +let event = {action:2, key:keyItem, keys:[keyItem]}; + +avSession.sendSystemAVKeyEvent(event).then(() => { + console.info('SendSystemAVKeyEvent Successfully'); +}).catch((err) => { + console.info(`SendSystemAVKeyEvent BusinessError: code: ${err.code}, message: ${err.message}`); +}); + +``` + +## avSession.sendSystemAVKeyEvent + +sendSystemAVKeyEvent(event: KeyEvent, callback: AsyncCallback\): void + +发送按键事件给置顶会话。结果通过callback异步回调方式返回。 + +**需要权限:** ohos.permission.MANAGE_MEDIA_RESOURCES,仅系统应用可用。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Manager + +**系统接口:** 该接口为系统接口。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------- | +| event | [KeyEvent](js-apis-keyevent.md) | 是 | 按键事件。 | +| callback | AsyncCallback | 是 | 回调函数。当事件发送成功,err为undefined,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600105 | Invalid session command | + +**示例:** + +```js +let keyItem = {code:0x49, pressedTime:2, deviceId:0}; +let event = {action:2, key:keyItem, keys:[keyItem]}; + +avSession.sendSystemAVKeyEvent(event, function (err) { + if (err) { + console.info(`SendSystemAVKeyEvent BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info('SendSystemAVKeyEvent : SUCCESS '); + } +}); +``` + +## avSession.sendSystemControlCommand + +sendSystemControlCommand(command: AVControlCommand): Promise\ + +发送控制命令给置顶会话。结果通过Promise异步回调方式返回。 + +**需要权限:** ohos.permission.MANAGE_MEDIA_RESOURCES,仅系统应用可用。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Manager + +**系统接口:** 该接口为系统接口。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ------------------------------------- | ---- | ----------------------------------- | +| command | [AVControlCommand](#avcontrolcommand) | 是 | AVSession的相关命令和命令相关参数。 | + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------- | +| Promise | Promise对象。当命令发送成功,无返回结果,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600105 | Invalid session command | +| 6600107 | Command or event overload | + +**示例:** + +```js +let avcommand = {command:'play'}; +// let avcommand = {command:'pause'}; +// let avcommand = {command:'stop'}; +// let avcommand = {command:'playNext'}; +// let avcommand = {command:'playPrevious'}; +// let avcommand = {command:'fastForward'}; +// let avcommand = {command:'rewind'}; +// let avcommand = {command:'seek', parameter:10}; +// let avcommand = {command:'setSpeed', parameter:2.6}; +// let avcommand = {command:'setLoopMode', parameter:avSession.LoopMode.LOOP_MODE_SINGLE}; +// let avcommand = {command:'toggleFavorite', parameter:"false"}; +avSession.sendSystemControlCommand(avcommand).then(() => { + console.info('SendSystemControlCommand successfully'); +}).catch((err) => { + console.info(`SendSystemControlCommand BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +## avSession.sendSystemControlCommand + +sendSystemControlCommand(command: AVControlCommand, callback: AsyncCallback\): void + +发送控制命令给置顶会话。结果通过callback异步回调方式返回。 + +**需要权限:** ohos.permission.MANAGE_MEDIA_RESOURCES,仅系统应用可用。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Manager + +**系统接口:** 该接口为系统接口。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------- | ---- | ------------------------------------- | +| command | [AVControlCommand](#avcontrolcommand) | 是 | AVSession的相关命令和命令相关参数。 | +| callback | AsyncCallback | 是 | 回调函数。当命令发送成功,err为undefined,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600105 | Invalid session command | +| 6600107 | Command or event overload | + +**示例:** + +```js +let avcommand = {command:'play'}; +// let avcommand = {command:'pause'}; +// let avcommand = {command:'stop'}; +// let avcommand = {command:'playNext'}; +// let avcommand = {command:'playPrevious'}; +// let avcommand = {command:'fastForward'}; +// let avcommand = {command:'rewind'}; +// let avcommand = {command:'seek', parameter:10}; +// let avcommand = {command:'setSpeed', parameter:2.6}; +// let avcommand = {command:'setLoopMode', parameter:avSession.LoopMode.LOOP_MODE_SINGLE}; +// let avcommand = {command:'toggleFavorite', parameter:"false"}; +avSession.sendSystemControlCommand(avcommand, function (err) { + if (err) { + console.info(`SendSystemControlCommand BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info('sendSystemControlCommand successfully'); + } +}); +``` + +## AVSession
+ +调用[avSession.createAVSession](#avsessioncreateavsession)后,返回会话的实例,可以获得会话ID,完成设置元数据,播放状态信息等操作。 + +### 属性 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + + +| 名称 | 类型 | 可读 | 可写 | 说明 | +| :-------- | :----- | :--- | :--- | :---------------------------- | +| sessionId | string | 是 | 否 | AVSession对象唯一的会话标识。 | + + +**示例:** +```js +let sessionId = session.sessionId; +``` + +### setAVMetadata + +setAVMetadata(data: AVMetadata): Promise\ + +设置会话元数据。结果通过Promise异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------------------------- | ---- | ------------ | +| data | [AVMetadata](#avmetadata) | 是 | 会话元数据。 | + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------- | +| Promise | Promise对象。当元数据设置成功,无返回结果,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +let metadata = { + assetId: "121278", + title: "lose yourself", + artist: "Eminem", + author: "ST", + album: "Slim shady", + writer: "ST", + composer: "ST", + duration: 2222, + mediaImage: "https://www.example.com/example.jpg", + subtitle: "8 Mile", + description: "Rap", + lyric: "https://www.example.com/example.lrc", + previousAssetId: "121277", + nextAssetId: "121279", +}; +session.setAVMetadata(metadata).then(() => { + console.info('SetAVMetadata successfully'); +}).catch((err) => { + console.info(`SetAVMetadata BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +### setAVMetadata + +setAVMetadata(data: AVMetadata, callback: AsyncCallback\): void + +设置会话元数据。结果通过callback异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------- | ---- | ------------------------------------- | +| data | [AVMetadata](#avmetadata) | 是 | 会话元数据。 | +| callback | AsyncCallback | 是 | 回调函数。当元数据设置成功,err为undefined,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +let metadata = { + assetId: "121278", + title: "lose yourself", + artist: "Eminem", + author: "ST", + album: "Slim shady", + writer: "ST", + composer: "ST", + duration: 2222, + mediaImage: "https://www.example.com/example.jpg", + subtitle: "8 Mile", + description: "Rap", + lyric: "https://www.example.com/example.lrc", + previousAssetId: "121277", + nextAssetId: "121279", +}; +session.setAVMetadata(metadata, function (err) { + if (err) { + console.info(`SetAVMetadata BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info('SetAVMetadata successfully'); + } +}); +``` + +### setAVPlaybackState + +setAVPlaybackState(state: AVPlaybackState): Promise\ + +设置会话播放状态。结果通过Promise异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ----------------------------------- | ---- | ---------------------------------------------- | +| data | [AVPlaybackState](#avplaybackstate) | 是 | 会话播放状态,包括状态、倍数、循环模式等信息。 | + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------- | +| Promise | Promise对象。当播放状态设置成功,无返回结果,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +let PlaybackState = { + state:avSession.PlaybackState.PLAYBACK_STATE_PLAY, + speed: 1.0, + position:{elapsedTime:10, updateTime:(new Date()).getTime()}, + bufferedTime:1000, + loopMode:avSession.LoopMode.LOOP_MODE_SINGLE, + isFavorite:true, +}; +session.setAVPlaybackState(PlaybackState).then(() => { + console.info('SetAVPlaybackState successfully'); +}).catch((err) => { + console.info(`SetAVPlaybackState BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +### setAVPlaybackState + +setAVPlaybackState(state: AVPlaybackState, callback: AsyncCallback\): void + +设置会话播放状态。结果通过callback异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------- | ---- | ---------------------------------------------- | +| data | [AVPlaybackState](#avplaybackstate) | 是 | 会话播放状态,包括状态、倍数、循环模式等信息。 | +| callback | AsyncCallback | 是 | 回调函数。当播放状态设置成功,err为undefined,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +let PlaybackState = { + state:avSession.PlaybackState.PLAYBACK_STATE_PLAY, + speed: 1.0, + position:{elapsedTime:10, updateTime:(new Date()).getTime()}, + bufferedTime:1000, + loopMode:avSession.LoopMode.LOOP_MODE_SINGLE, + isFavorite:true, +}; +session.setAVPlaybackState(PlaybackState, function (err) { + if (err) { + console.info(`SetAVPlaybackState BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info('SetAVPlaybackState successfully'); + } +}); +``` + +### setLaunchAbility + +setLaunchAbility(ability: WantAgent): Promise\ + +设置一个WantAgent用于拉起会话的Ability。结果通过Promise异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------- | --------------------------------- | ---- | ----------------------------------------------------------- | +| ability | [WantAgent](js-apis-wantAgent.md) | 是 | 应用的相关属性信息,如bundleName,abilityName,deviceId等。 | + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------- | +| Promise | Promise对象。当Ability设置成功,无返回结果,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +import wantAgent from '@ohos.wantAgent'; + +//WantAgentInfo对象 +let wantAgentInfo = { + wants: [ + { + deviceId: "deviceId", + bundleName: "com.neu.setResultOnAbilityResultTest1", + abilityName: "com.example.test.MainAbility", + action: "action1", + entities: ["entity1"], + type: "MIMETYPE", + uri: "key={true,true,false}", + parameters: + { + mykey0: 2222, + mykey1: [1, 2, 3], + mykey2: "[1, 2, 3]", + mykey3: "ssssssssssssssssssssssssss", + mykey4: [false, true, false], + mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], + mykey6: true, + } + } + ], + operationType: wantAgent.OperationType.START_ABILITIES, + requestCode: 0, + wantAgentFlags:[wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG] +} + +wantAgent.getWantAgent(wantAgentInfo).then((agent) => { + session.setLaunchAbility(agent).then(() => { + console.info('SetLaunchAbility successfully'); + }).catch((err) => { + console.info(`SetLaunchAbility BusinessError: code: ${err.code}, message: ${err.message}`); + }); +}); +``` + +### setLaunchAbility + +setLaunchAbility(ability: WantAgent, callback: AsyncCallback\): void + +设置一个WantAgent用于拉起会话的Ability。结果通过callback异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------------------- | ---- | ----------------------------------------------------------- | +| ability | [WantAgent](js-apis-wantAgent.md) | 是 | 应用的相关属性信息,如bundleName,abilityName,deviceId等。 | +| callback | AsyncCallback | 是 | 回调函数。当Ability设置成功,err为undefined,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +import wantAgent from '@ohos.wantAgent'; + +//WantAgentInfo对象 +let wantAgentInfo = { + wants: [ + { + deviceId: "deviceId", + bundleName: "com.neu.setResultOnAbilityResultTest1", + abilityName: "com.example.test.MainAbility", + action: "action1", + entities: ["entity1"], + type: "MIMETYPE", + uri: "key={true,true,false}", + parameters: + { + mykey0: 2222, + mykey1: [1, 2, 3], + mykey2: "[1, 2, 3]", + mykey3: "ssssssssssssssssssssssssss", + mykey4: [false, true, false], + mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], + mykey6: true, + } + } + ], + operationType: wantAgent.OperationType.START_ABILITIES, + requestCode: 0, + wantAgentFlags:[wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG] +} + +wantAgent.getWantAgent(wantAgentInfo).then((agent) => { + session.setLaunchAbility(agent, function (err) { + if (err) { + console.info(`SetLaunchAbility BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info('SetLaunchAbility successfully'); + } + }); +}); +``` + +### getController + +getController(): Promise\ + +获取本会话对应的控制器。结果通过Promise异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**返回值:** + +| 类型 | 说明 | +| ---------------------------------------------------- | ----------------------------- | +| Promise<[AVSessionController](#avsessioncontroller)> | Promise对象。返回会话控制器。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +let controller; +session.getController().then((avcontroller) => { + controller = avcontroller; + console.info(`GetController : SUCCESS : sessionid : ${controller.sessionId}`); +}).catch((err) => { + console.info(`GetController BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +### getController + +getController(callback: AsyncCallback\): void + +获取本会话相应的控制器。结果通过callback异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------------------------- | ---- | -------------------------- | +| callback | AsyncCallback<[AVSessionController](#avsessioncontroller)\> | 是 | 回调函数。返回会话控制器。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +let controller; +session.getController(function (err, avcontroller) { + if (err) { + console.info(`GetController BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + controller = avcontroller; + console.info(`GetController : SUCCESS : sessionid : ${controller.sessionId}`); + } +}); +``` + +### getOutputDevice + +getOutputDevice(): Promise\ + +通过会话获取播放设备信息。结果通过Promise异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**返回值:** + +| 类型 | 说明 | +| ---------------------------------------------- | --------------------------------- | +| Promise<[OutputDeviceInfo](#outputdeviceinfo)> | Promise对象。返回播放设备信息。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.getOutputDevice().then((outputDeviceInfo) => { + console.info(`GetOutputDevice : SUCCESS : isRemote : ${outputDeviceInfo.isRemote}`); +}).catch((err) => { + console.info(`GetOutputDevice BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +### getOutputDevice + +getOutputDevice(callback: AsyncCallback\): void + +通过会话获取播放设备相关信息。结果通过callback异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------------------- | ---- | ------------------------------ | +| callback | AsyncCallback<[OutputDeviceInfo](#outputdeviceinfo)\> | 是 | 回调函数,返回播放设备信息。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.getOutputDevice(function (err, outputDeviceInfo) { + if (err) { + console.info(`GetOutputDevice BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info(`GetOutputDevice : SUCCESS : isRemote : ${outputDeviceInfo.isRemote}`); + } +}); +``` + +### activate + +activate(): Promise\ + +激活会话,激活后可正常使用会话。结果通过Promise异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------- | +| Promise | Promise对象。当会话激活成功,无返回结果,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.activate().then(() => { + console.info('Activate : SUCCESS '); +}).catch((err) => { + console.info(`Activate BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +### activate + +activate(callback: AsyncCallback\): void + +激活会话,激活后可正常使用会话。结果通过callback异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------- | +| callback | AsyncCallback | 是 | 回调函数。当会话激活成功,err为undefined,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.activate(function (err) { + if (err) { + console.info(`Activate BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info('Activate : SUCCESS '); + } +}); +``` + +### deactivate + +deactivate(): Promise\ + +禁用当前会话的功能,可通过[activate](#activate)恢复。结果通过Promise异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------- | +| Promise | Promise对象。当禁用会话成功,无返回结果,否则返回错误对象。| + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.deactivate().then(() => { + console.info('Deactivate : SUCCESS '); +}).catch((err) => { + console.info(`Deactivate BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +### deactivate + +deactivate(callback: AsyncCallback\): void + +禁用当前会话。结果通过callback异步回调方式返回。 + +禁用当前会话的功能,可通过[activate](#activate)恢复。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------- | +| callback | AsyncCallback | 是 | 回调函数。当禁用会话成功,err为undefined,否则返回错误对象。| + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.deactivate(function (err) { + if (err) { + console.info(`Deactivate BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info('Deactivate : SUCCESS '); + } +}); +``` + +### destroy + +destroy(): Promise\ + +销毁当前会话,使当前会话完全失效。结果通过Promise异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------- | +| Promise | Promise对象。当会话销毁成功,无返回结果,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.destroy().then(() => { + console.info('Destroy : SUCCESS '); +}).catch((err) => { + console.info(`Destroy BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +### destroy + +destroy(callback: AsyncCallback\): void + +销毁当前会话,使当前会话完全失效。结果通过callback异步回调方式返回。 + + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------- | +| callback | AsyncCallback | 是 | 回调函数。当会话销毁成功,err为undefined,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.destroy(function (err) { + if (err) { + console.info(`Destroy BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info('Destroy : SUCCESS '); + } +}); +``` + +### on('play'|'pause'|'stop'|'playNext'|'playPrevious'|'fastForward'|'rewind') + +on(type: 'play'|'pause'|'stop'|'playNext'|'playPrevious'|'fastForward'|'rewind', callback: () => void): void + +设置播放命令监听事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 事件回调类型,支持的事件包括:`'play'`,`'pause'`,`'stop'`,` 'playNext'`,` 'playPrevious'`, `'fastForward'`,` 'rewind'`。
当对应的播放命令被发送到会话时,触发该事件回调。 | +| callback | callback: () => void | 是 | 回调函数。当监听事件注册成功,err为undefined,否则为错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.on('play', () => { + console.info('on play entry'); +}); +session.on('pause', () => { + console.info('on pause entry'); +}); +session.on('stop', () => { + console.info('on stop entry'); +}); +session.on('playNext', () => { + console.info('on playNext entry'); +}); +session.on('playPrevious', () => { + console.info('on playPrevious entry'); +}); +session.on('fastForward', () => { + console.info('on fastForward entry'); +}); +session.on('rewind', () => { + console.info('on rewind entry'); +}); +``` + +### on('seek') + +on(type: 'seek', callback: (time: number) => void): void + +设置跳转节点监听事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 事件回调类型,支持事件`'seek'`:当跳转节点命令被发送到会话时,触发该事件。 | +| callback | (time: number) => void | 是 | 回调函数。参数time是时间节点,单位为毫秒。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** +The session does not exist +```js +session.on('seek', (time) => { + console.info(`on seek entry time : ${time}`); +}); +``` + +### on('setSpeed') + +on(type: 'setSpeed', callback: (speed: number) => void): void + +设置播放速率的监听事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 事件回调类型,支持事件`'setSpeed'`:当设置播放速率的命令被发送到会话时,触发该事件。 | +| callback | (speed: number) => void | 是 | 回调函数。参数speed是播放倍速。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.on('setSpeed', (speed) => { + console.info(`on setSpeed speed : ${speed}`); +}); +``` + +### on('setLoopMode') + +on(type: 'setLoopMode', callback: (mode: LoopMode) => void): void + +设置循环模式的监听事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------- | ---- | ---- | +| type | string | 是 | 事件回调类型,支持事件`'setLoopMode'`:当设置循环模式的命令被发送到会话时,触发该事件。 | +| callback | (mode: [LoopMode](#loopmode)) => void | 是 | 回调函数。参数mode是循环模式。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.on('setLoopMode', (mode) => { + console.info(`on setLoopMode mode : ${mode}`); +}); +``` + +### on('toggleFavorite') + +on(type: 'toggleFavorite', callback: (assetId: string) => void): void + +设置是否收藏的监听事件 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 事件回调类型,支持事件`'toggleFavorite'`:当是否收藏的命令被发送到会话时,触发该事件。 | +| callback | (assetId: string) => void | 是 | 回调函数。参数assetId是媒体ID。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.on('toggleFavorite', (assetId) => { + console.info(`on toggleFavorite mode : ${assetId}`); +}); +``` + +### on('handleKeyEvent') + +on(type: 'handleKeyEvent', callback: (event: KeyEvent) => void): void + +设置按键事件的监听 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 事件回调类型,支持事件`'handleKeyEvent'`:当按键事件被发送到会话时,触发该事件。 | +| callback | (event: [KeyEvent](js-apis-keyevent.md)) => void | 是 | 回调函数。参数event是按键事件。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.on('handleKeyEvent', (event) => { + console.info(`on handleKeyEvent event : ${event}`); +}); +``` + +### on('outputDeviceChange') + +on(type: 'outputDeviceChange', callback: (device: OutputDeviceInfo) => void): void + +设置播放设备变化的监听事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 事件回调类型,支持事件`'outputDeviceChange'`:当播放设备变化时,触发该事件。 | +| callback | (device: [OutputDeviceInfo](#outputdeviceinfo)) => void | 是 | 回调函数。参数device是设备相关信息。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.on('outputDeviceChange', (device) => { + console.info(`on outputDeviceChange device isRemote : ${device.isRemote}`); +}); +``` + +### off('play'|'pause'|'stop'|'playNext'|'playPrevious'|'fastForward'|'rewind') + +off(type: 'play' | 'pause' | 'stop' | 'playNext' | 'playPrevious' | 'fastForward' | 'rewind', callback?: () => void): void + +取消会话相关事件监听,关闭后,不再进行相关事件回调。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------------------------------------------------------------------------------------------------------------------------- | +| type | string | 是 | 关闭对应的监听事件,支持的事件包括:`'play'`,` 'pause'`,`'stop'`, `'playNext'`,` 'playPrevious'`, ` 'fastForward'`,` 'rewind'`。 | +| callback | callback: () => void | 否 | 回调函数。当监听事件取消成功,err为undefined,否则返回错误对象。
该参数为可选参数,若不填写该参数,则认为取消所有相关会话的事件监听。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.off('play'); +session.off('pause'); +session.off('stop'); +session.off('playNext'); +session.off('playPrevious'); +session.off('fastForward'); +session.off('rewind'); +``` + +### off('seek') + +off(type: 'seek', callback?: (time: number) => void): void + +取消监听跳转节点事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | ----------------------------------------- | +| type | string | 是 | 关闭对应的监听事件,支持关闭事件`'seek'`。 | +| callback | (time: number) => void | 否 | 回调函数,参数time是时间节点,单位为毫秒。
当监听事件取消成功,err为undefined,否则返回错误对象。
该参数为可选参数,若不填写该参数,则认为取消所有相关会话的事件监听。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.off('seek'); +``` + +### off('setSpeed') + +off(type: 'setSpeed', callback?: (speed: number) => void): void + +取消监听播放速率变化事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------- | ---- | -------------------------------------------| +| type | string | 是 | 关闭对应的监听事件,支持关闭事件`'setSpeed'`。 | +| callback | (speed: number) => void | 否 | 回调函数,参数speed是播放倍速。
当监听事件取消成功,err为undefined,否则返回错误对象。
该参数为可选参数,若不填写该参数,则认为取消所有相关会话的事件监听。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.off('setSpeed'); +``` + +### off('setLoopMode') + +off(type: 'setLoopMode', callback?: (mode: LoopMode) => void): void + +取消监听循环模式变化事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------- | ---- | ----- | +| type | string | 是 | 关闭对应的监听事件,支持关闭事件`'setLoopMode'`。| +| callback | (mode: [LoopMode](#loopmode)) => void | 否 | 回调函数,参数mode是循环模式。
当监听事件取消成功,err为undefined,否则返回错误对象。
该参数为可选参数,若不填写该参数,则认为取消所有相关会话的事件监听。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.off('setLoopMode'); +``` + +### off('toggleFavorite') + +off(type: 'toggleFavorite', callback?: (assetId: string) => void): void + +取消监听是否收藏的事件 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------- | ---- | -------------------------------------------------------- | +| type | string | 是 | 关闭对应的监听事件,支持关闭事件`'toggleFavorite'`。 | +| callback | (assetId: string) => void | 否 | 回调函数,参数assetId是媒体ID。
当监听事件取消成功,err为undefined,否则返回错误对象。
该参数为可选参数,若不填写该参数,则认为取消所有相关会话的事件监听。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.off('toggleFavorite'); +``` + +### off('handleKeyEvent') + +off(type: 'handleKeyEvent', callback?: (event: KeyEvent) => void): void + +取消监听按键事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 关闭对应的监听事件,支持关闭事件`'handleKeyEvent'`。 | +| callback | (event: [KeyEvent](js-apis-keyevent.md)) => void | 否 | 回调函数,参数event是按键事件。
当监听事件取消成功,err为undefined,否则返回错误对象。
该参数为可选参数,若不填写该参数,则认为取消所有相关会话的事件监听。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.off('handleKeyEvent'); +``` + +### off('outputDeviceChange') + +off(type: 'outputDeviceChange', callback?: (device: OutputDeviceInfo) => void): void + +取消监听播放设备变化的事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------- | ---- | ------------------------------------------------------ | +| type | string | 是 | 关闭对应的监听事件,支持关闭事件`'outputDeviceChange'`。 | +| callback | (device: [OutputDeviceInfo](#outputdeviceinfo)) => void | 否 | 回调函数,参数device是设备相关信息。
当监听事件取消成功,err为undefined,否则返回错误对象。
该参数为可选参数,若不填写该参数,则认为取消所有相关会话的事件监听。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | + +**示例:** + +```js +session.off('outputDeviceChange'); +``` + + + +## AVSessionController + +调用[avSession.createController](#avsessioncreatecontroller)后,返回会话控制器实例。控制器可查看会话ID,并可完成对会话发送命令及事件,获取会话元数据,播放状态信息等操作。 + +### 属性 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + + +| 名称 | 类型 | 可读 | 可写 | 说明 | +| :-------- | :----- | :--- | :--- | :-------------------------------------- | +| sessionId | string | 是 | 否 | AVSessionController对象唯一的会话标识。 | + + +**示例:** +```js +let sessionId; +await avSession.createController(session.sessionId).then((controller) => { + sessionId = controller.sessionId; +}).catch((err) => { + console.info(`CreateController BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +### getAVPlaybackState + +getAVPlaybackState(): Promise\ + +获取当前会话播放状态相关信息。结果通过Promise异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**返回值:** + +| 类型 | 说明 | +| --------------------------------------------- | --------------------------- | +| Promise<[AVPlaybackState](#avplaybackstate)\> | Promise对象。返回播放状态对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | +| 6600103 | The session controller does not exist | + +**示例:** +```js +controller.getAVPlaybackState().then((playbackState) => { + console.info(`GetAVPlaybackState : SUCCESS : state : ${playbackState.state}`); +}).catch((err) => { + console.info(`GetAVPlaybackState BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +### getAVPlaybackState + +getAVPlaybackState(callback: AsyncCallback\): void + +获取当前播放状态相关信息。结果通过callback异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------------------- | ---- | ---------------------------- | +| callback | AsyncCallback<[AVPlaybackState](#avplaybackstate)\> | 是 | 回调函数,返回当前播放状态对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | +| 6600103 | The session controller does not exist | + +**示例:** +```js +controller.getAVPlaybackState(function (err, playbackState) { + if (err) { + console.info(`GetAVPlaybackState BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info(`GetAVPlaybackState : SUCCESS : state : ${playbackState.state}`); + } +}); +``` + +### getAVMetadata + +getAVMetadata(): Promise\ + +获取会话元数据。结果通过Promise异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**返回值:** + +| 类型 | 说明 | +| ----------------------------------- | ----------------------------- | +| Promise<[AVMetadata](#avmetadata)\> | Promise对象,返回会话元数据。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | +| 6600103 | The session controller does not exist | + +**示例:** +```js +controller.getAVMetadata().then((metadata) => { + console.info(`GetAVMetadata : SUCCESS : assetId : ${metadata.assetId}`); +}).catch((err) => { + console.info(`GetAVMetadata BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +### getAVMetadata + +getAVMetadata(callback: AsyncCallback\): void + +获取会话元数据。结果通过callback异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------- | ---- | -------------------------- | +| callback | AsyncCallback<[AVMetadata](#avmetadata)\> | 是 | 回调函数,返回会话元数据。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | +| 6600103 | The session controller does not exist | + +**示例:** +```js +controller.getAVMetadata(function (err, metadata) { + if (err) { + console.info(`GetAVMetadata BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info(`GetAVMetadata : SUCCESS : assetId : ${metadata.assetId}`); + } +}); +``` + +### getOutputDevice + +getOutputDevice(): Promise\ + +获取播放设备信息。结果通过Promise异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**返回值:** + +| 类型 | 说明 | +| ----------------------------------------------- | --------------------------------- | +| Promise<[OutputDeviceInfo](#outputdeviceinfo)\> | Promise对象,返回播放设备信息。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600103 | The session controller does not exist | + +**示例:** +```js +controller.getOutputDevice().then((deviceInfo) => { + console.info(`GetOutputDevice : SUCCESS : isRemote : ${deviceInfo.isRemote}`); +}).catch((err) => { + console.info(`GetOutputDevice BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +### getOutputDevice + +getOutputDevice(callback: AsyncCallback\): void + +获取播放设备信息。结果通过callback异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------------------- | ---- | ------------------------------ | +| callback | AsyncCallback<[OutputDeviceInfo](#outputdeviceinfo)\> | 是 | 回调函数,返回播放设备信息。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600103 | The session controller does not exist | + +**示例:** + +```js +controller.getOutputDevice(function (err, deviceInfo) { + if (err) { + console.info(`GetOutputDevice BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info(`GetOutputDevice : SUCCESS : isRemote : ${deviceInfo.isRemote}`); + } +}); +``` + +### sendAVKeyEvent + +sendAVKeyEvent(event: KeyEvent): Promise\ + +发送按键事件到控制器对应的会话。结果通过Promise异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------------------------------------------------------------ | ---- | ---------- | +| event | [KeyEvent](js-apis-keyevent.md) | 是 | 按键事件。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | +| 6600103 | The session controller does not exist | +| 6600105 | Invalid session command | +| 6600106 | The session not active | + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------- | +| Promise | Promise对象。当事件发送成功,无返回结果,否则返回错误对象。 | + +**示例:** + +```js +let keyItem = {code:0x49, pressedTime:2, deviceId:0}; +let event = {action:2, key:keyItem, keys:[keyItem]}; + +controller.sendAVKeyEvent(event).then(() => { + console.info('SendAVKeyEvent Successfully'); +}).catch((err) => { + console.info(`SendAVKeyEvent BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +### sendAVKeyEvent + +sendAVKeyEvent(event: KeyEvent, callback: AsyncCallback\): void + +发送按键事件到会话。结果通过callback异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ---------- | +| event | [KeyEvent](js-apis-keyevent.md) | 是 | 按键事件。 | +| callback | AsyncCallback | 是 | 回调函数。当事件发送成功,err为undefined,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | +| 6600103 | The session controller does not exist | +| 6600105 | Invalid session command | +| 6600106 | The session not active | + +**示例:** + +```js +let keyItem = {code:0x49, pressedTime:2, deviceId:0}; +let event = {action:2, key:keyItem, keys:[keyItem]}; + +controller.sendAVKeyEvent(event, function (err) { + if (err) { + console.info(`SendAVKeyEvent BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info('SendAVKeyEvent Successfully'); + } +}); +``` + +### getLaunchAbility + +getLaunchAbility(): Promise\ + +获取应用在会话中保存的WantAgent对象。结果通过Promise异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**返回值:** + +| 类型 | 说明 | +| ------------------------------------------- | ------------------------------------------------------------ | +| Promise<[WantAgent](js-apis-wantAgent.md)\> | Promise对象,返回在[setLaunchAbility](#setlaunchability)保存的对象,包括应用的相关属性信息,如bundleName,abilityName,deviceId等。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | +| 6600103 | The session controller does not exist | + +**示例:** + +```js +import wantAgent from '@ohos.wantAgent'; + +controller.getLaunchAbility().then((agent) => { + console.info(`GetLaunchAbility : SUCCESS : wantAgent : ${agent}`); +}).catch((err) => { + console.info(`GetLaunchAbility BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +### getLaunchAbility + +getLaunchAbility(callback: AsyncCallback\): void + +获取应用在会话中保存的WantAgent对象。结果通过callback异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------- | ---- | ------------------------------------------------------------ | +| callback | AsyncCallback<[WantAgent](js-apis-wantAgent.md)\> | 是 | 回调函数。返回在[setLaunchAbility](#setlaunchability)保存的对象,包括应用的相关属性信息,如bundleName,abilityName,deviceId等。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | +| 6600103 | The session controller does not exist | + +**示例:** + +```js +import wantAgent from '@ohos.wantAgent'; + +controller.getLaunchAbility(function (err, agent) { + if (err) { + console.info(`GetLaunchAbility BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info(`GetLaunchAbility : SUCCESS : wantAgent : ${agent}`); + } +}); +``` + +### getRealPlaybackPositionSync + +getRealPlaybackPositionSync(): number + +获取当前播放位置。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**返回值:** + +| 类型 | 说明 | +| ------ | ------------------ | +| number | 时间节点,毫秒数。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600103 | The session controller does not exist | + +**示例:** + +```js +let time = controller.getRealPlaybackPositionSync(); +``` + +### isActive + +isActive(): Promise\ + +获取会话是否被激活。结果通过Promise异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**返回值:** + +| 类型 | 说明 | +| ----------------- | ------------------------------------------------------------ | +| Promise | Promise对象,返回会话是否为激活状态,true表示被激活,false表示禁用。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | +| 6600103 | The session controller does not exist | + +**示例:** + +```js +controller.isActive().then((isActive) => { + console.info(`IsActive : SUCCESS : isactive : ${isActive}`); +}).catch((err) => { + console.info(`IsActive BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +### isActive + +isActive(callback: AsyncCallback\): void + +判断会话是否被激活。结果通过callback异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------- | ---- | ------------------------------------------------------------ | +| callback | AsyncCallback | 是 | 回调函数,返回会话是否为激活状态,true表示被激活,false表示禁用。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | +| 6600103 | The session controller does not exist | + +**示例:** + +```js +controller.isActive(function (err, isActive) { + if (err) { + console.info(`IsActive BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info(`IsActive : SUCCESS : isactive : ${isActive}`); + } +}); +``` + +### destroy + +destroy(): Promise\ + +销毁当前控制器,销毁后当前控制器不可再用。结果通过Promise异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------- | +| Promise | Promise对象。当控制器销毁成功,无返回结果,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600103 | The session controller does not exist | + +**示例:** + +```js +controller.destroy().then(() => { + console.info('Destroy : SUCCESS '); +}).catch((err) => { + console.info(`Destroy BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +### destroy + +destroy(callback: AsyncCallback\): void + +销毁当前控制器,销毁后当前控制器不可再用。结果通过callback异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------- | +| callback | AsyncCallback | 是 | 回调函数。当控制器销毁成功,err为undefined,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600103 | The session controller does not exist | + +**示例:** + +```js +controller.destroy(function (err) { + if (err) { + console.info(`Destroy BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info('Destroy : SUCCESS '); + } +}); +``` + +### getValidCommands + +getValidCommands(): Promise\> + +获取会话支持的有效命令。结果通过Promise异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**返回值:** + +| 类型 | 说明 | +| ------------------------------------------------------------ | --------------------------------- | +| Promise\> | Promise对象。返回有效命令的集合。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | +| 6600103 | The session controller does not exist | + +**示例:** + +```js +controller.getValidCommands.then((validCommands) => { + console.info(`GetValidCommands : SUCCESS : size : ${validCommands.length}`); +}).catch((err) => { + console.info(`GetValidCommands BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +### getValidCommands + +getValidCommands(callback: AsyncCallback\>): void + +获取会话支持的有效命令。结果通过callback异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------ | +| callback | AsyncCallback\\> | 是 | 回调函数,返回有效命令的集合。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | +| 6600103 | The session controller does not exist | + +**示例:** + +```js +controller.getValidCommands(function (err, validCommands) { + if (err) { + console.info(`GetValidCommands BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info(`GetValidCommands : SUCCESS : size : ${validCommands.length}`); + } +}); +``` + +### sendControlCommand + +sendControlCommand(command: AVControlCommand): Promise\ + +通过控制器发送命令到其对应的会话。结果通过Promise异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 名称 | 类型 | 必填 | 说明 | +| ------- | ------------------------------------- | ---- | ------------------------------ | +| command | [AVControlCommand](#avcontrolcommand) | 是 | 会话的相关命令和命令相关参数。 | + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------- | +| Promise | Promise对象。当命令发送成功,无返回结果,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | +| 6600103 | The session controller does not exist | +| 6600105 | Invalid session command | +| 6600106 | The session not active | +| 6600107 | Command or event overload | + +**示例:** + +```js +let avCommand = {command:'play'}; +// let avCommand = {command:'pause'}; +// let avCommand = {command:'stop'}; +// let avCommand = {command:'playNext'}; +// let avCommand = {command:'playPrevious'}; +// let avCommand = {command:'fastForward'}; +// let avCommand = {command:'rewind'}; +// let avCommand = {command:'seek', parameter:10}; +// let avCommand = {command:'setSpeed', parameter:2.6}; +// let avCommand = {command:'setLoopMode', parameter:avSession.LoopMode.LOOP_MODE_SINGLE}; +// let avCommand = {command:'toggleFavorite', parameter:"false"}; +controller.sendControlCommand(avCommand).then(() => { + console.info('SendControlCommand successfully'); +}).catch((err) => { + console.info(`SendControlCommand BusinessError: code: ${err.code}, message: ${err.message}`); +}); +``` + +### sendControlCommand + +sendControlCommand(command: AVControlCommand, callback: AsyncCallback\): void + +通过会话控制器发送命令到其对应的会话。结果通过callback异步回调方式返回。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------- | ---- | ------------------------------ | +| command | [AVControlCommand](#avcontrolcommand) | 是 | 会话的相关命令和命令相关参数。 | +| callback | AsyncCallback | 是 | 回调函数。当命令发送成功,err为undefined,否则返回错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ------------------------------- | +| 6600101 | Session service exception | +| 6600102 | The session does not exist | +| 6600103 | The session controller does not exist | +| 6600105 | Invalid session command | +| 6600106 | The session not active | +| 6600107 | Command or event overload | + +**示例:** + +```js +let avCommand = {command:'play'}; +// let avCommand = {command:'pause'}; +// let avCommand = {command:'stop'}; +// let avCommand = {command:'playNext'}; +// let avCommand = {command:'playPrevious'}; +// let avCommand = {command:'fastForward'}; +// let avCommand = {command:'rewind'}; +// let avCommand = {command:'seek', parameter:10}; +// let avCommand = {command:'setSpeed', parameter:2.6}; +// let avCommand = {command:'setLoopMode', parameter:avSession.LoopMode.LOOP_MODE_SINGLE}; +// let avCommand = {command:'toggleFavorite', parameter:"false"}; +controller.sendControlCommand(avCommand, function (err) { + if (err) { + console.info(`SendControlCommand BusinessError: code: ${err.code}, message: ${err.message}`); + } else { + console.info('SendControlCommand successfully'); + } +}); +``` + +### on('metadataChange') + +on(type: 'metadataChange', filter: Array\ | 'all', callback: (data: AVMetadata) => void) + +设置元数据变化的监听事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 事件回调类型,支持事件`'metadataChange'`:当元数据变化时,触发该事件。 | +| filter | Array\ | 'all' | 是 | 'all' 表示关注元数据所有字段变化;Array 表示关注Array中的字段变化。 | +| callback | (data: [AVMetadata](#avmetadata)) => void | 是 | 回调函数,参数data是变化后的元数据。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ------------------------------ | +| 6600101 | Session service exception | +| 6600103 | The session controller does not exist | + +**示例:** + +```js +controller.on('metadataChange', 'all', (metadata) => { + console.info(`on metadataChange assetId : ${metadata.assetId}`); +}); + +let metaFilter = ['assetId', 'title', 'description']; +controller.on('metadataChange', metaFilter, (metadata) => { + console.info(`on metadataChange assetId : ${metadata.assetId}`); +}); +``` + +### on('playbackStateChange') + +on(type: 'playbackStateChange', filter: Array\ | 'all', callback: (state: AVPlaybackState) => void) + +设置播放状态变化的监听事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 事件回调类型,支持事件`'playbackStateChange'`:当播放状态变化时,触发该事件。 | +| filter | Array\ | 'all' | 是 | 'all' 表示关注播放状态所有字段变化;Array 表示关注Array中的字段变化。 | +| callback | (state: [AVPlaybackState](#avplaybackstate)) => void | 是 | 回调函数,参数state是变化后的播放状态。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ------------------------------ | +| 6600101 | Session service exception | +| 6600103 | The session controller does not exist | + +**示例:** + +```js +controller.on('playbackStateChange', 'all', (playbackState) => { + console.info(`on playbackStateChange state : ${playbackState.state}`); +}); + +let playbackFilter = ['state', 'speed', 'loopMode']; +controller.on('playbackStateChange', playbackFilter, (playbackState) => { + console.info(`on playbackStateChange state : ${playbackState.state}`); +}); +``` + +### on('sessionDestroy') + +on(type: 'sessionDestroy', callback: () => void) + +会话销毁的监听事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 事件回调类型,支持事件`'sessionDestroy'`:当检测到会话销毁时,触发该事件)。 | +| callback | () => void | 是 | 回调函数。当监听事件注册成功,err为undefined,否则为错误对象。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ------------------------------ | +| 6600101 | Session service exception | +| 6600103 | The session controller does not exist | + +**示例:** + +```js +controller.on('sessionDestroy', () => { + console.info('on sessionDestroy : SUCCESS '); +}); +``` + +### on('activeStateChange') + +on(type: 'activeStateChange', callback: (isActive: boolean) => void) + +会话的激活状态的监听事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 事件回调类型,支持事件`'activeStateChange'`:当检测到会话的激活状态发生改变时,触发该事件。 | +| callback | (isActive: boolean) => void | 是 | 回调函数。参数isActive表示会话是否被激活。true表示被激活,false表示禁用。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ----------------------------- | +| 6600101 | Session service exception | +| 6600103 |The session controller does not exist | + +**示例:** + +```js +controller.on('activeStateChange', (isActive) => { + console.info(`on activeStateChange : SUCCESS : isActive ${isActive}`); +}); +``` + +### on('validCommandChange') + +on(type: 'validCommandChange', callback: (commands: Array\) => void) + +会话支持的有效命令变化监听事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 事件回调类型,支持事件`'validCommandChange'`:当检测到会话的合法命令发生改变时,触发该事件。 | +| callback | (commands: Array<[AVControlCommandType](#avcontrolcommandtype)\>) => void | 是 | 回调函数。参数commands是有效命令的集合。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ------------------------------ | +| 6600101 | Session service exception | +| 6600103 | The session controller does not exist | + +**示例:** + +```js +controller.on('validCommandChange', (validCommands) => { + console.info(`validCommandChange : SUCCESS : size : ${validCommands.size}`); + console.info(`validCommandChange : SUCCESS : validCommands : ${validCommands.values()}`); +}); +``` + +### on('outputDeviceChange') + +on(type: 'outputDeviceChange', callback: (device: OutputDeviceInfo) => void): void + +设置播放设备变化的监听事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 事件回调类型,支持事件为`'outputDeviceChange'`:当播放设备变化时,触发该事件)。 | +| callback | (device: [OutputDeviceInfo](#outputdeviceinfo)) => void | 是 | 回调函数,参数device是设备相关信息。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ----------------------- | +| 6600101 | Session service exception | +| 6600103 | The session controller does not exist | + +**示例:** + +```js +controller.on('outputDeviceChange', (device) => { + console.info(`on outputDeviceChange device isRemote : ${device.isRemote}`); +}); +``` + +### off('metadataChange') + +off(type: 'metadataChange', callback?: (data: AVMetadata) => void) + +控制器取消监听元数据变化的事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------ | ---- | ------------------------------------------------------ | +| type | string | 是 | 取消对应的监听事件,支持事件`'metadataChange'`。 | +| callback | (data: [AVMetadata](#avmetadata)) => void | 否 | 回调函数,参数data是变化后的元数据。
该参数为可选参数,若不填写该参数,则认为取消所有相关会话的事件监听。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------- | +| 6600101 | Session service exception | + +**示例:** + +```js +controller.off('metadataChange'); +``` + +### off('playbackStateChange') + +off(type: 'playbackStateChange', callback?: (state: AVPlaybackState) => void) + +控制器取消监听播放状态变化的事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ----------------------------------------------------- | +| type | string | 是 | 取消对应的监听事件,支持事件`'playbackStateChange'`。 | +| callback | (state: [AVPlaybackState](#avplaybackstate)) => void | 否 | 回调函数,参数state是变化后的播放状态。
该参数为可选参数,若不填写该参数,则认为取消所有相关会话的事件监听。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------- | +| 6600101 | Session service exception | + +**示例:** + +```js +controller.off('playbackStateChange'); +``` + +### off('sessionDestroy') + +off(type: 'sessionDestroy', callback?: () => void) + +控制器取消监听会话的销毁事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------- | ---- | ----------------------------------------------------- | +| type | string | 是 | 取消对应的监听事件,支持事件`'sessionDestroy'`。 | +| callback | () => void | 否 | 回调函数。当监听事件取消成功,err为undefined,否则返回错误对象。
该参数为可选参数,若不填写该参数,则认为取消所有相关会话的事件监听。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------- | +| 6600101 | Session service exception | + +**示例:** + +```js +controller.off('sessionDestroy'); +``` + +### off('activeStateChange') + +off(type: 'activeStateChange', callback?: (isActive: boolean) => void) + +控制器取消监听会话激活状态变化的事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------------- | ---- | ----------------------------------------------------- | +| type | string | 是 | 取消对应的监听事件,支持事件`'activeStateChange'`。 | +| callback | (isActive: boolean) => void | 否 | 回调函数。参数isActive表示会话是否被激活。true表示被激活,false表示禁用。
该参数为可选参数,若不填写该参数,则认为取消所有相关会话的事件监听。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------- | +| 6600101 | Session service exception | + +**示例:** + +```js +controller.off('activeStateChange'); +``` + +### off('validCommandChange') + +off(type: 'validCommandChange', callback?: (commands: Array\) => void) + +控制器取消监听会话有效命令变化的事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | -------------------------------------------------------- | +| type | string | 是 | 取消对应的监听事件,支持事件`'validCommandChange'`。 | +| callback | (commands: Array<[AVControlCommandType](#avcontrolcommandtype)\>) => void | 否 | 回调函数。参数commands是有效命令的集合。
该参数为可选参数,若不填写该参数,则认为取消所有相关会话的事件监听。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------- | +| 6600101 | Session service exception | + +**示例:** + +```js +controller.off('validCommandChange'); +``` + +### off('outputDeviceChange') + +off(type: 'outputDeviceChange', callback?: (device: OutputDeviceInfo) => void): void + +控制器取消监听分布式设备变化的事件。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------- | ---- | ------------------------------------------------------ | +| type | string | 是 | 取消对应的监听事件,支持事件`'outputDeviceChange'`。 | +| callback | (device: [OutputDeviceInfo](#outputdeviceinfo)) => void | 否 | 回调函数,参数device是设备相关信息。
该参数为可选参数,若不填写该参数,则认为取消所有相关会话的事件监听。 | + +**错误码:** +以下错误码的详细介绍请参见[ohos.multimedia.avsession(多媒体会话)错误码](../errorcodes/errorcode-avsession.md)。 + +| 错误码ID | 错误信息 | +| -------- | ---------------- | +| 6600101 | Session service exception | + +**示例:** + +```js +controller.off('outputDeviceChange'); +``` + +## SessionToken + +会话令牌的信息。 + +**需要权限:** ohos.permission.MANAGE_MEDIA_RESOURCES,仅系统应用可用。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Manager + +**系统接口:** 该接口为系统接口。 + +| 名称 | 类型 | 必填 | 说明 | +| :-------- | :----- | :--- | :----------- | +| sessionId | string | 是 | 会话ID | +| pid | number | 是 | 会话的进程ID | +| uid | number | 是 | 用户ID | + +## AVSessionType +当前会话支持的会话类型。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +| 名称 | 类型 | 说明 | +| ----- | ------ | ---- | +| audio | string | 音频 | +| video | string | 视频 | + +## AVSessionDescriptor + +会话的相关描述信息。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Manager + +**系统接口:** 该接口为系统接口。 + +| 名称 | 类型 | 可读 | 可写 | 说明 | +| ------------ | ------------------------------------------------------------ | ---- | --------------------------------------------------- | --------------------------------------------------- | +| sessionId | string | 是 | 否 | 会话ID | +| type | [AVSessionType](#avsessiontype) | 是 | 否 | 会话类型 | +| sessionTag | string | 是 | 否 | 会话的自定义名称 | +| elementName | [ElementName](js-apis-bundle-ElementName.md) | 是 | 否 | 会话所属应用的信息(包含bundleName、abilityName等) | +| isActive | boolean | 是 | 否 | 会话是否被激活 | +| isTopSession | boolean | 是 | 否 | 会话是否为最新的会话 | +| outputDevice | [OutputDeviceInfo](#outputdeviceinfo) | 是 | 否 | 分布式设备相关信息 | + +## AVControlCommandType + +会话可传递的命令。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +| 名称 | 类型 | 说明 | +| -------------- | ------ | ------------ | +| play | string | 播放 | +| pause | string | 暂停 | +| stop | string | 停止 | +| playNext | string | 下一首 | +| playPrevious | string | 上一首 | +| fastForward | string | 快进 | +| rewind | string | 快退 | +| seek | string | 跳转某一节点 | +| setSpeed | string | 设置播放倍速 | +| setLoopMode | string | 设置循环模式 | +| toggleFavorite | string | 是否收藏 | + +## AVControlCommand + +会话接受的命令的对象描述。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +| 名称 | 类型 | 必填 | 说明 | +| --------- | ------------------------------------------------- | ---- | -------------- | +| command | [AVControlCommandType](#avcontrolcommandtype) | 是 | 命令 | +| parameter | [LoopMode](#loopmode) | string | number | 否 | 命令对应的参数 | + +## AVMetadata + +媒体元数据的相关属性。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +| 名称 | 类型 | 必填 | 说明 | +| --------------- |-------------------------| ---- |---------------------------------------------------------------------| +| assetId | string | 是 | 媒体ID。 | +| title | string | 否 | 标题。 | +| artist | string | 否 | 艺术家。 | +| author | string | 否 | 专辑作者。 | +| album | string | 否 | 专辑名称。 | +| writer | string | 否 | 词作者。 | +| composer | string | 否 | 作曲者。 | +| duration | string | 否 | 媒体时长,单位毫秒(ms)。 | +| mediaImage | image.PixelMap | string | 否 | 图片的像素数据或者图片路径地址(本地路径或网络路径)。 | +| publishDate | Date | 否 | 发行日期。 | +| subtitle | string | 否 | 子标题。 | +| description | string | 否 | 媒体描述。 | +| lyric | string | 否 | 歌词文件路径地址(本地路径或网络路径) | +| previousAssetId | string | 否 | 上一首媒体ID。 | +| nextAssetId | string | 否 | 下一首媒体ID。 | + +## AVPlaybackState + +媒体播放状态的相关属性。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +| 名称 | 类型 | 必填 | 说明 | +| ------------ | ------------------------------------- | ---- | ------- | +| state | [PlaybackState](#playbackstate) | 否 | 播放状态 | +| speed | number | 否 | 播放倍速 | +| position | [PlaybackPosition](#playbackposition) | 否 | 播放位置 | +| bufferedTime | number | 否 | 缓冲时间 | +| loopMode | [LoopMode](#loopmode) | 否 | 循环模式 | +| isFavorite | boolean | 否 | 是否收藏 | + +## PlaybackPosition + +媒体播放位置的相关属性。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +| 名称 | 类型 | 必填 | 说明 | +| ----------- | ------ | ---- | ------------------ | +| elapsedTime | number | 是 | 已用时间,单位毫秒(ms)。 | +| updateTime | number | 是 | 更新时间,单位毫秒(ms)。 | + +## OutputDeviceInfo + +播放设备的相关信息。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +| 名称 | 类型 | 必填 | 说明 | +| ---------- | -------------- | ---- | ---------------------- | +| isRemote | boolean | 是 | 设备是否连接。 | +| audioDeviceId | Array | 是 | 播放设备的ID集合。 | +| deviceName | Array | 是 | 播放设备的名称集合。 | + +## PlaybackState + +表示媒体播放状态的枚举。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +| 名称 | 值 | 说明 | +| --------------------------- | ---- | ----------- | +| PLAYBACK_STATE_INITIAL | 0 | 初始状态 | +| PLAYBACK_STATE_PREPARE | 1 | 播放准备状态 | +| PLAYBACK_STATE_PLAY | 2 | 正在播放 | +| PLAYBACK_STATE_PAUSE | 3 | 暂停 | +| PLAYBACK_STATE_FAST_FORWARD | 4 | 快进 | +| PLAYBACK_STATE_REWIND | 5 | 快退 | +| PLAYBACK_STATE_STOP | 6 | 停止 | + + +## LoopMode + +表示媒体播放循环模式的枚举。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +| 名称 | 值 | 说明 | +| ------------------ | ---- | -------- | +| LOOP_MODE_SEQUENCE | 0 | 顺序播放 | +| LOOP_MODE_SINGLE | 1 | 单曲循环 | +| LOOP_MODE_LIST | 2 | 表单循环 | +| LOOP_MODE_SHUFFLE | 3 | 随机播放 | + +## AVSessionErrorCode + +会话发生错误时的错误码。 + +**系统能力:** SystemCapability.Multimedia.AVSession.Core + +| 名称 | 值 | 说明 | +| ------------------------------ | ------- | ------------------------------- | +| ERR_CODE_SERVICE_EXCEPTION | 6600101 | Session service exception | +| ERR_CODE_SESSION_NOT_EXIST | 6600102 | The session does not exist | +| ERR_CODE_CONTROLLER_NOT_EXIST | 6600103 | The session controller does not exist | +| ERR_CODE_REMOTE_CONNECTION_ERR | 6600104 | The remote session connection failed | +| ERR_CODE_COMMAND_INVALID | 6600105 | Invalid session command | +| ERR_CODE_SESSION_INACTIVE | 6600106 | The session not active | +| ERR_CODE_MESSAGE_OVERLOAD | 6600107 | Command or event overload | \ No newline at end of file diff --git a/zh-cn/application-dev/reference/errorcodes/errorcode-avsession.md b/zh-cn/application-dev/reference/errorcodes/errorcode-avsession.md new file mode 100644 index 0000000000..d5510187d7 --- /dev/null +++ b/zh-cn/application-dev/reference/errorcodes/errorcode-avsession.md @@ -0,0 +1,131 @@ +# 媒体会话管理错误码 + +## 6600101 会话服务端异常 + +**错误信息** + +Session service exception + +**错误描述** + +会话服务端异常,应用端无法获取服务端的消息响应。如会话服务未运行或者会话服务通信失败。 + +**可能原因** + +会话重启过程中服务被杀。 + +**处理步骤** + +1.定时重试,超过3s仍失败时,停止对该会话或者控制器进行操作。 + +2.销毁当前会话或者会话控制器,并重新创建,如果重新创建失败,则停止会话相关操作。 + +## 6600102 会话不存在 + +**错误信息** + +The session does not exist + +**错误描述** + +会话对象不存在时,向该会话设置参数或者发送命令。 + +**可能原因** + +会话已被销毁,服务端无会话记录。 + +**处理步骤** + +1.如果在会话被控端产生该错误,请重新创建会话;如果是会话控制端,请停止向该会话发送查询或者控制命令。 + +2.如果在会话管理端产生该错误,请重新查询系统当前会话记录,在创建控制器时传入正确的会话ID。 + +## 6600103 会话控制器不存在 + +**错误信息** + +The session controller does not exist + +**错误描述** + +会话控制器不存在时,向该控制器发送控制命令或者事件。 + +**可能原因** + +控制器已被销毁。 + +**处理步骤** + +请重新查询系统当前会话记录,并创建对应的会话控制器。 + +## 6600104 远端会话连接失败 + +**错误信息** + +The remote session connection failed + +**错误描述** + +本端会话与远端会话通信失败。 + +**可能原因** + +设备间通信断开。 + +**处理步骤** + +停止对该会话发送控制命令,并监听输出设备变化,当输出设备发送变化后恢复发送。 + +## 6600105 无效会话命令 + +**错误信息** + +Invalid session command + +**错误描述** + +会话被控端不支持该被控命令或事件。 + +**可能原因** + +被控端不支持该命令。 + +**处理步骤** + +停止发送该命令或事件,并查询被控会话支持的命令集,发送被控端支持的命令。 + +## 6600106 会话未激活 + +**错误信息** + +The session not active + +**错误描述** + +会话没有激活时,向会话发送控制命令或者事件。 + +**可能原因** + +会话处于未激活状态。 + +**处理步骤** + +停止发送该命令或事件,监听会话的激活状态,会话激活后恢复发送该命令或事件。 + +## 6600107 命令&消息过载 + +**错误信息** + +Command or event overload + +**错误描述** + +会话客户端在一段时间内向服务端发送了过多的消息或者命令,引起服务端消息过载。 + +**可能原因** + +服务端消息过载。 + +**处理步骤** + +检查自身命令发送是否过于频繁,控制自身查询和控制命令的发送频度。 \ No newline at end of file -- GitLab