鸿蒙最全鸿蒙HarmonyOS——AVSession开发引导(5),口试最新经典100题 ...

打印 上一主题 下一主题

主题 887|帖子 887|积分 2661

深知大多数程序员,想要提升技能,往往是本身探索发展,但本身不成体系的自学效果低效又漫长,而且极易碰到天花板技术故步自封!



既有适合小白学习的零基础资料,也有适合3年以上经验的小同伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包罗大厂面经、学习笔记、源码讲义、实战项目、大纲路线、解说视频,并且后续会连续更新
需要这份系统化的资料的朋友,可以戳这里获取
   说明:
  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文档。
表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设置启动abilitygetController(callback: AsyncCallback): void获取当前会话自身控制器getOutputDevice(callback: AsyncCallback): void获取音频输出设备信息activate(callback: AsyncCallback): void激活会话destroy(callback: AsyncCallback): void销毁会话 开发步调

1.导入模块接口
import avSession from ‘@ohos.multimedia.avsession’;
import wantAgent from ‘@ohos.app.ability.wantAgent’;
import featureAbility from ‘@ohos.ability.featureAbility’;
2.创建会话并激活会话
// 全局变量定义
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一般用于封装举动意图信息。 - 设置播放状态。
// 设置会话元数据
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});
});
// 设置启动ability
let wantAgentInfo = {
wants: [
{
bundleName: “com.neu.setResultOnAbilityResultTest1”,
abilityName: “com.example.test.EntryAbility”,
}
],
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});
});
});
// 设置播放状态
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});
});
// 获取当前session会话对象自身的控制器
currentSession.getController().then((selfController) => {
console.info(‘getController successfully’);
}).catch((err) => {
console.info(getController : ERROR : ${err.message});
});
// 获取音频输出设备信息
currentSession.getOutputDevice().then((outputInfo) => {
console.info(getOutputDevice successfully, deviceName : ${outputInfo.deviceName});
}).catch((err) => {
console.info(getOutputDevice : ERROR : ${err.message});
});
4.注册控制命令监听
// 注册播放命令监听
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 Date()).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.开释资源
// 取消注册回调
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.destroy();
});
调考试证

在媒体应用上点击播放、暂停、下一首等按键,媒体播放状态出现相应厘革。
常见问题

1.会话服务端异常 - 现象形貌:
会话服务端异常,应用端无法获取服务端的消息响应。如会话服务未运行或者会话服务通讯失败。返回错误信息: Session service exception。


  • 可能原因:
会话重启过程中服务被杀。


  • 解决办法
(1)定时重试,超过3s仍失败时,制止对该会话或者控制器进行操作。
(2)销毁当前会话或者会话控制器,并重新创建,如果重新创建失败,则制止会话相关操作。
2.会话不存在 - 现象形貌:
会话对象不存在时,向该会话设置参数或者发送命令。返回错误信息: The session does not exist。


  • 可能原因:
会话已被销毁,服务端无会话记录。


  • 解决办法
(1)如果在会话被控端产生该错误,请重新创建会话;如果是会话控制端,请制止向该会话发送查询或者控制命令。
(2)如果在会话管理端产生该错误,请重新查询系统当前会话记录,在创建控制器时传入正确的会话ID。
3.会话未激活 - 现象形貌:
会话没有激活时,向会话发送控制命令或者事件。。返回错误信息: The session not active。


  • 可能原因:
会话处于未激活状态。


  • 解决办法
制止发送该命令或事件,监听会话的激活状态,会话激活后恢复发送该命令或事件。
相关实例

提供音乐Demo的代码实例
会话控制端开发引导(播控中心)

基本概念



  • 远端投播:将当地媒体投播到远端设备,通过当地控制器发送命令,可控制远端播放举动。
  • 发送按键命令:控制器通过发送按键事件的方式控制媒体。
  • 发送控制命令:控制器通过发送控制命令的方式控制媒体。
  • 发送系统按键命令:应用拥有调用该接口的系统权限,通过发送按键事件的方式控制媒体,仅系统应用可用。
  • 发送系统控制命令:应用拥有调用该接口的系统权限,通过发送控制命令的方式控制媒体,仅系统应用可用。
接口说明

会话控制端涉及的常用接口如下表所示。接口返回值有两种返回形式:callback和promise,下表中为callback形式接口,promise和callback只是返回值方式不一样,功能相同。更多API说明请拜见API文档。
表2:会话控制端常用接口
接口名形貌getAllSessionDescriptors(callback: AsyncCallback<Array>): 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<audio.AudioDeviceDescriptor>, callback: AsyncCallback): void 开发步调

1.导入模块接口
import avSession from ‘@ohos.multimedia.avsession’;
import {Action, KeyEvent} from ‘@ohos.multimodalInput.KeyEvent’;
import wantAgent from ‘@ohos.app.ability.wantAgent’;
import audio from ‘@ohos.multimedia.audio’;
2.获取会话形貌符,创建控制器
// 全局变量定义
let g_controller = new Array<avSession.AVSessionController>();
let g_centerSupportCmd:Set<avSession.AVControlCommandType> = new Set([‘play’, ‘pause’, ‘playNext’, ‘playPrevious’, ‘fastForward’, ‘rewind’, ‘seek’,‘setSpeed’, ‘setLoopMode’, ‘toggleFavorite’]);
let g_validCmd:Set<avSession.AVControlCommandType>;
// 获取会话形貌符,创建控制器
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服务厘革
// 注册会话激活状态变动监听
controller.on(‘activeStateChange’, (isActive) => {
if (isActive) {
console.log(“控制器卡片按键高亮”);
} else {
console.log(“控制器卡片按键变动为无效”);
}
});
// 注册会话销毁监听
controller.on(‘sessionDestroy’, () => {
console.info('on sessionDestroy : SUCCESS ');
controller.destroy().then(() => {
深知大多数程序员,想要提升技能,往往是本身探索发展,但本身不成体系的自学效果低效又漫长,而且极易碰到天花板技术故步自封!



既有适合小白学习的零基础资料,也有适合3年以上经验的小同伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包罗大厂面经、学习笔记、源码讲义、实战项目、大纲路线、解说视频,并且后续会连续更新
需要这份系统化的资料的朋友,可以戳这里获取
nsole.info('on sessionDestroy : SUCCESS ');
controller.destroy().then(() => {
深知大多数程序员,想要提升技能,往往是本身探索发展,但本身不成体系的自学效果低效又漫长,而且极易碰到天花板技术故步自封!

[外链图片转存中…(img-mUI38qNB-1715594400984)]
[外链图片转存中…(img-NVUW9vKH-1715594400985)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小同伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包罗大厂面经、学习笔记、源码讲义、实战项目、大纲路线、解说视频,并且后续会连续更新
需要这份系统化的资料的朋友,可以戳这里获取

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表