加载中...

我的音乐


界面展示图片

核心技术

  • 播放功能

  • 播放:播放当前正在播放的歌曲

  • 暂停:暂停播放当前正在播放的歌曲

  • 上一首:切换列表上一首歌曲(只有一首重复播放)

  • 下一首:切换列表下一首歌曲(只有一首重复播放)

  • 播放模式:支持列表循环、单曲播放、随机播放三种模式

  • 进度切换:可以拖拽或点击控制歌曲播放的时间节点

  • 单曲播放:支持添加一首歌进行播放

  • 列表播放:支持添加列表进行播放

  • 播放列表:可以添加,删除播放列表中的歌曲

  • 卡片功能

  • 应用数据展示:展示当前播放歌曲信息

  • 网络图片展示:网络图片下载工具封装,下载网络图片到卡片展示

  • 卡片通信机制:卡片与应用持久化双向通信模型

实现播放:

界面展示图片 界面展示图片

开发-后台播放

Next版本的音乐播放只要应用进入后台,音乐播放就会停止,此时接入系统控制中心,并且申请长时后台任务,保证退出后台之后可以正常播放

  • 在module.json5中申请长时后台任务

    1
    2
    3
     {
    "name": "ohos.permission.KEEP_BACKGROUND_RUNNING"
    }
  • 在ability中配置backgroundModes

    1
    2
    3
    "backgroundModes": [
    "audioPlayback"
    ]

我们首先接入控制中心的媒体会话,才可以可以实现音频的后台长时任务播放

媒体会话可以理解为帮助管理操作系统与后台之间的通信

  • 新建媒体会话的管理类utiis/AvSessionManager
1
2
3
4
5
6
7
8
9
10
11
12
13
import AvSession from '@ohos.multimedia.avsession';

// 媒体会话
export class AvSessionManger {
static session: AvSession.AVSession // 单例 媒体会话对象 帮助实现
static controller: AvSession.AVSessionController //控制器
static async init(context: Context) {
// 拿到会话对象
AvSessionManger.session = await AvSession.createAVSession(context, 'bgPlay', 'audio')
AvSessionManger.controller = await AvSessionManger.session.getController() //拿到控制器

}
}

并在EntryAbility中OnCreate里面初始化

1
2
3
4
5
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
AVPlayerManager.init()
AvSessionManger.init(this.context)
}
  • 在播放器对象中声明一个开启后台任务的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 开启后台长时任务
static async startBackgroundTask() {
// 单例 只要有就不用开启
if (AvSessionManger.session.sessionId) {
return // 只要有就不用开启
}
try {
// want的信息组成 目的是点击播放中心的时候,可以进入应用
let wantAgentInfo: wantAgent.WantAgentInfo = {
wants: [
{
bundleName: 'com.example.heimacloudmusic',
abilityName: 'EntryAbility',
}
],
//operationType: wantAgent.OperationType.START_ABILITY,
actionType: wantAgent.OperationType.START_ABILITY,
requestCode: 0,
wantAgentFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]
}
const want = await wantAgent.getWantAgent(wantAgentInfo)
// 申请长时任务
await backgroundTaskManager.startBackgroundRunning(getContext(), backgroundTaskManager.BackgroundMode.AUDIO_PLAYBACK,
want
)
} catch (error) {
AlertDialog.show({
message: error
})
}

}

在播放单曲时开启后台任务

界面展示图片

文章作者: 太阳神小赖
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 太阳神小赖 !
  目录