播放器是 OpenHarmony 中预置的系统应用,提供媒体列表浏览、音视频播放、歌单管理与搜索等能力,适配手机、平板设备形态。
播放器(Player)
简介
播放器(包名:com.ohos.players)是 OpenHarmony 中预置的系统应用,提供媒体列表浏览、音视频播放、歌单管理与搜索等能力,适配手机、平板设备形态。
本应用为系统预置应用,用户可从桌面图标、文件管理器「打开方式」等场景进入播放器。
核心能力
媒体列表浏览
- 自动扫描设备内音频与视频文件,支持媒体库、公共目录、用户文件多种扫描策略。
- 批量导入时进度条实时更新,后台/锁屏场景显示进度通知。
- 全部/音乐/视频分类 Tab 切换筛选,宫格与列表两种布局模式切换,支持按大小、时间、名称排序。
- 音视频缩略图展示(视频首帧/音频封面),列表项字体与缩放跟随系统设置。
- 支持单选删除、多选删除与滑动多选删除。
音视频播放
- 支持本地路径播放,点击音频/视频文件进入对应播放页并自动起播。
- 播放模式:顺序播放、列表循环、单曲循环、随机播放。
- 倍速播放多档可选,音频无杂音,视频音画同步。
- 视频横竖屏自动适配,播放不中断;音频页支持收起为迷你播放条。
- 手势调节亮度与音量、长按临时倍速。
- 播控中心(AVSession)展示封面与播控按钮,支持后台音频播放与通知栏提示。
- 视频画中画(PiP)悬浮小窗继续播放,支持分屏模式。
- 来电监听自动暂停/恢复播放,锁屏监听暂停/恢复视频。
- 支持从文件管理器「打开方式」直接唤起播放器并播放音视频文件。
歌单管理
- 支持创建多个命名歌单并独立维护曲目。
- 歌单内支持多选删除、长按拖动排序。
- 歌单断点续播:进程终止后音频续播进度。
搜索
- 首页搜索入口,搜索范围为已扫描入库的媒体文件,基于内存倒排索引按文件名和艺术家名(含拼音首字母)模糊匹配,高效检索。
- 命中结果按评分排序展示,支持高亮标记,点击跳转对应播放页。
架构说明
播放器采用分层与模块化设计,按产品形态、业务特性与公共能力组织代码,如图:

应用层分层设计
整体可划分为产品层、特性层、公共层:
| 层次 | 主要目录 | 说明 |
|---|---|---|
| 产品层 | entry |
手机、平板同一hap入口:承载应用入口、主页面、Ability 生命周期与页面导航。 |
| 特性层 | feature/media、feature/player、feature/search、feature/playlist |
媒体列表浏览、音视频播放、搜索、歌单管理。 |
| 公共层 | common |
媒体扫描与监听、系统上下文、权限管理、数据库与持久化、播放引擎、数据源与模型、搜索索引、通知、公共UI组件、工具集。 |
产品层模块说明
| 目录 / 组件 | 说明 |
|---|---|
abilities/ |
MainAbility 入口,承载 UIAbility 生命周期 |
pages/ |
首页、默认索引页、歌单页等主页面 |
pages/nav/ |
NavDestination 子页面,包括音频/视频/搜索/设置等 |
navigation/ |
NavPathStack 路由表与页面注册 |
components/ |
首页组件,包括顶栏、分类 Tab、浮动 Tab等 |
viewmodel/ |
页面级业务编排,包括首页与歌单的 ViewModel |
constants/ |
路由名称、视图尺寸等常量 |
utils/ |
外部 Want 解析、导航跳转等工具 |
特性层模块说明
| 核心能力 | 关键类 | 说明 |
|---|---|---|
| 媒体列表浏览 | MediaAggregateView、MediaAggregateViewModel、MediaViewArrayDataSource | 媒体列表/宫格视图、多策略扫描编排、筛选排序、多选删除 |
| 音视频播放 | AudioPage/VideoPlayPage、AVPlayerController/AudioPlayerController/VideoPlayerController、AudioPlaybackSession/VideoPlaybackSession、PlaybackCallInterruptGuard/PlaybackVideoScreenLockGuard | 音频/视频播放页、AVSession 桥接、手势交互、PiP、来电/锁屏监听 |
| 歌单管理 | PlaylistView/PlaylistDetailView/PlaylistEditView、PlaylistAddAudioView | 歌单由用户在 UI 创建并持久化到本地数据库,曲目引用已扫描媒体文件 URI;支持歌单列表/详情/编辑、曲目增删排序、断点续播 |
| 搜索 | SearchBar/SearchOverlay、SearchViewModel、SearchIndexCoordinator | 倒排索引、评分排序、结果高亮 |
公共层模块说明
| 核心能力 | 关键类 | 说明 |
|---|---|---|
| 媒体扫描与监听 | MediaFileScanner、ScanStateManager、ScanTaskPool、FileListenerManager、FileSyncEngine | 扫描设备内媒体文件(详见「媒体扫描与存储」),文件监听器监听媒体库/用户文件变更并实时同步到数据库 |
| 系统上下文 | AppContext、IMediaListAccess | 全局单例持有上下文对象;通过依赖注入桥接,让特性层无需跨模块依赖即可获取媒体列表数据 |
| 权限管理 | MediaPermissionManager | 封装媒体相关权限请求,维护全局授权状态,保证扫描与播放场景权限请求一致 |
| 数据库与持久化 | MediaDbManager、Rdb、PlaybackHistoryManager、AppLocalStorage | 统一数据库句柄与表访问层,含播放历史与续播进度记录及播放页 UI 状态存储 |
| 播放引擎 | PlaybackQueueManager、PlaybackResumeContext | 播放队列与续播状态是跨页面的全局运行态,集中管理以保证从歌单、搜索、文件管理器等多入口切歌时队列与续播一致 |
| 数据源与模型 | MediaDataSource、IMediaDataSource、FileInfo、AudioItem、VideoItem、MediaCacheManager | 定义各 feature 共用的数据模型与媒体列表数据源抽象 |
| 搜索索引 | SearchIndexManager | 对已扫描媒体文件构建内存倒排索引(文件名+艺术家名,含拼音首字母),索引每次启动从媒体列表重建 |
| 通知 | MediaProgressNotificationHelper、MediaProgressBackgroundHelper、MediaProgressLiveViewHelper | 统一扫描进度通知与播放进度通知渠道与样式,覆盖通知栏、后台与锁屏实时卡片 |
| 公共UI组件 | EmptyStateView、SearchBar、NavBackButton、SwipeDeleteEndAction | 无业务状态的纯展示控件:如空状态页、搜索栏、返回按钮、滑动删除,可被任意页面组合 |
| 工具集 | MediaMetadataResolver、SearchScorer、ThumbnailManager、DeviceConfigUtil、AppThemeConstants | 无状态纯函数工具:如媒体元数据解析、搜索评分、缩略图加载、设备配置、主题常量 |
媒体扫描与存储
播放器通过三种扫描策略发现设备内媒体文件,扫描范围与实现方式如下:
| 扫描策略 | API | 扫描范围 |
|---|---|---|
| 媒体库扫描 | @ohos.file.photoAccessHelper | 系统相册视频资源 |
| 用户文件扫描 | @ohos.filemanagement.userFileManager | 系统用户文件管理器注册的音频与视频资产 |
| 公共目录扫描 | @ohos.file.fileAccess | 遍历 file://docs 目录树,补充用户文件扫描未收录的文件 |
扫描结果仅存储文件元数据到本地数据库做持久化存储。源文件删除或移动时软删除,重新出现可恢复。内存缓存与搜索索引每次启动从数据库重建。
与其它应用的关系
允许系统侧应用调用本应用。前提是本应用已安装,且播放音视频需用户授权对应媒体权限。
按场景说明:
| 场景 | 说明 |
|---|---|
| 用户在文件管理器用「打开方式」播放音视频 | 用户在文件管理器选中音视频文件后选择「打开方式 → 播放器」时,文件管理器通过 Want 携带文件 URI 拉起本应用 MainAbility,播放器解析 URI 后进入对应播放页并开始播放。 |
| 播控中心控制播放 | 播放器正在播放时,用户从状态栏下拉播控中心;播放器事先通过 AVSession 向系统注册了媒体会话,播控中心读取该会话的播放信息,并通过会话回调向本应用下发播放、暂停、切歌等命令。 |
| 锁屏卡片控制播放 | 播放器正在播放时用户锁屏;锁屏应用同样通过 AVSession 读取本应用的会话信息,在锁屏界面展示封面与播控按钮,用户的操作经会话回调传回本应用执行。 |
| 后台音频播放 | 用户播放音频后将播放器切到后台,播放器可继续在后台输出音频;同时通过 AVSession 持续上报播放状态,通知栏展示播放通知,用户点击通知可回到播放页。 |
编译构建
本工程为多模块 HAR + HAP 应用工程,使用 Hvigor 构建,产物为 com.ohos.players 系统应用包。
环境要求
- OpenHarmony SDK(本工程compileSdkVersion为"26.0.0",compatibleSdkVersion和targetVersion为23)
- DevEco Studio 或命令行 Hvigor 工具链
- 系统签名证书(见
signature/)
编译命令
在工程根目录执行:
# 使用 DevEco Studio 打开工程后执行 Build,或使用 hvigor 命令行
hvigorw assembleHap
播放器开发
播放器采用 ArkTS 语言开发,UI 基于 ArkUI Stage 模型。应用通过 MainAbility 承载主界面,通过 feature/media / feature/player 完成媒体浏览与播放业务,并通过 common 保持数据、扫描与播放引擎能力。开发可参考:ArkUI 开发概述
基于已有模块的开发
适用场景:对已有能力做功能定制,例如调整扫描策略、扩展播放页交互、修改歌单排序、优化搜索体验等。
明确改动点:按业务边界定位到 entry(入口与首页)、feature/media(媒体列表)、feature/player(播放)、feature/playlist(歌单)、feature/search(搜索)或 common(公共能力)。
以下列举一些常见的修改场景:
场景1:修改媒体列表链路
- 页面入口位于
feature/media/src/main/ets/components/MediaAggregateView.ets - 业务逻辑位于
feature/media/src/main/ets/manager/MediaAggregateViewModel.ets
例如,需在媒体列表加载完成后新增自定义处理,可在MediaAggregateViewModel.loadMediaFiles()的回调后添加相关逻辑:
// MediaAggregateViewModel.ets — loadMediaFiles 是媒体列表加载入口
public async loadMediaFiles(mediaType: MediaType, forceRefresh: boolean = false) {
if (!this.isReady()) {
return;
}
this.isLoading = true;
try {
// 原有流程:权限检查 → 数据源加载 → 回调通知
await this.mediaDataSource.loadMediaFiles(mediaType, forceRefresh);
// 新增处理逻辑
this.onMediaLoadComplete(mediaType);
} finally {
this.isLoading = false;
}
}
场景2:修改播放链路
- 页面入口位于
feature/player/src/main/ets/pages/AudioPage.ets(音频)、feature/player/src/main/ets/pages/VideoPlayPage.ets(视频) - 播放控制位于
feature/player/src/main/ets/controller/AVPlayerController.ets - 会话管理位于
feature/player/src/main/ets/session/AudioPlaybackSession.ets/VideoPlaybackSession.ets
例如,需调整倍速控制逻辑,在AVPlayerController.setSpeed()中扩展:
// AVPlayerController.ets — 倍速控制
setSpeed(speed: number): void {
const playbackRate = this.resolvePlaybackRate(speed);
HiLog.i(TAG, `setSpeed: ${speed} playbackRate=${playbackRate}`);
// 新增倍速前参数校验
if (speed > this.maxSpeed) {
HiLog.w(TAG, `Speed ${speed} exceeds limit ${this.maxSpeed}`);
return;
}
this.speed = speed;
if (this.avPlayer !== null && AVPLAYER_PREPARED_STATE.has(this.avPlayer.state as string)) {
this.avPlayer.setPlaybackRate(playbackRate);
}
this.setPlayingSpeed(playbackRate);
}
场景3:修改歌单链路
- 页面入口位于
feature/playlist/src/main/ets/components/PlaylistDetailView.ets - 业务编排位于
entry/src/main/ets/viewmodel/PlaylistViewModel.ets - 数据持久化位于
common/src/main/ets/persistence/rdb/MediaDbManager.ets
例如,若需在创建歌单时新增名称校验,修改 PlaylistViewModel.submitNameDialog():
// PlaylistViewModel.ets — 提交歌单名称
public async submitNameDialog(name: string): Promise<void> {
// 新增名称长度校验
if (name.length === 0 || name.length > 30) {
HiLog.w(TAG, `Invalid playlist name length: ${name.length}`);
return;
}
// 原有流程:创建/重命名 → 数据库写入 → 列表刷新
await this.executeNameAction(name);
await this.loadPlaylists();
this.closeNameDialog();
}
场景4:修改搜索链路
- 页面入口位于
feature/search/src/main/ets/components/SearchOverlay.ets - 业务逻辑位于
feature/search/src/main/ets/viewmodel/SearchViewModel.ets - 搜索索引位于
common/src/main/ets/search/SearchIndexManager.ets
例如,需调整搜索结果评分权重,修改SearchScorer中的评分逻辑:
// SearchScorer.ets — 搜索评分算法
public static scoreFile(file: FileInfo, keywords: string[]): MatchResult {
const fileName: string = PinyinConverter.getFileNameWithoutSuffix(file.fileName || '');
// ...
let totalScore: number = 0;
const matchedKeywords: string[] = [];
const highlightRanges: HighlightRange[] = [];
for (const keyword of keywords) {
// 调高文件名匹配权重
const nameMatch = SearchMatchEngine.matchText(fileName, keyword.toLowerCase());
if (nameMatch.matched && nameMatch.score > 0) {
totalScore += nameMatch.score * SearchScorer.FIELD_WEIGHT_FILE_NAME / 100;
matchedKeywords.push(keyword);
// ...
}
}
return { score: totalScore, matchedKeywords: matchedKeywords, highlightRanges: highlightRanges };
}
场景5:修改UI组件
- 首页组件位于
entry/src/main/ets/components/。 - 通用组件位于
common/src/main/ets/component/。
例如,需要全局调整空状态样式,直接修改EmptyStateView:
// EmptyStateView.ets — 全局空状态组件
@Component
export struct EmptyStateView {
@Prop icon: Resource = $r('app.media.ic_empty_state');
@Prop title: ResourceStr = '';
@Prop description: ResourceStr = '';
@Prop fullHeight: boolean = false;
build() {
Column({ space: 16 }) {
Image(this.icon)
.width(200)
.height(200)
Text(this.title)
.fontSize(16)
.fontColor($r('sys.color.ohos_id_color_text_secondary'))
Text(this.description)
.fontSize(14)
.fontColor($r('sys.color.ohos_id_color_text_tertiary'))
}
.width('100%')
.height(this.fullHeight ? '100%' : 300)
.justifyContent(FlexAlign.Center)
}
}
常用修改入口:
| 目标 | 路径 |
|---|---|
| 应用首页 | entry/src/main/ets/pages/MainPage.ets |
| 媒体列表 | feature/media/src/main/ets/components/MediaAggregateView.ets |
| 媒体列表 ViewModel | feature/media/src/main/ets/manager/MediaAggregateViewModel.ets |
| 音频播放页 | feature/player/src/main/ets/pages/AudioPage.ets |
| 视频播放页 | feature/player/src/main/ets/pages/VideoPlayPage.ets、feature/player/src/main/ets/controller/VideoPlayerController.ets |
| 歌单管理 | feature/playlist/src/main/ets/components/PlaylistDetailView.ets |
| 搜索页面 | feature/search/src/main/ets/components/SearchOverlay.ets |
| 播放引擎(队列/历史/续播) | common/src/main/ets/player/、common/src/main/ets/persistence/ |
| 扫描器 | common/src/main/ets/scan/ |
| 数据库 | common/src/main/ets/persistence/rdb/MediaDbManager.ets |
| 缩略图 | common/src/main/ets/thumbnail/ThumbnailManager.ets |
| UI组件 | entry/src/main/ets/components/、common/src/main/ets/component/ |
新特性能力的开发
下面用 「新增一种播放相关业务能力(示意:睡眠定时关闭播放)」 串起完整步骤,以及前后依赖关系。
说明:
当前工程采用
entry + feature + common多模块结构,产品入口为entry。一般新业务落在已有 feature;若新增独立产品形态 HAP,可在build-profile.json5中注册对应模块。
目标业务(示例)
希望用户能:在播放页设置「定时 30 分钟后停止播放」→ 到点自动暂停并退出播放。因此需要同时具备:业务数据与播放控制链路、暴露给用户的入口、用户可操作的 UI。三步对应这三条能力链路,顺序一般是 先业务 → 再入口 → 后 UI。
步骤1:扩展业务能力
| 要解决的问题 | 说明 |
|---|---|
| 定时设置要能持久化 | 在 common 的 persistence/rdb 中扩展表或字段,并经 MediaDbManager 暴露;否则重启后设置丢失 |
| 到点要能停止播放 | 在 feature/player 的控制器(如 AVPlayerController)中扩展定时停止逻辑,并联动 PlaybackQueueManager 与 AVSession 状态 |
| 新 Feature HAR 时 | 按 MVVM 拆分 View / ViewModel;在 feature/<module>/oh-package.json5 声明对 @ohos/common 的依赖;在 feature/<module>/Index.ets 导出对外 API;并在 entry/oh-package.json5 增加依赖声明 |
开发流程建议:
- 在特性层落实持久化与播放控制逻辑(
feature/player、common/persistence)。 - 若能力足够独立,也可新建
feature/xxxHAR,在build-profile.json5与entry/oh-package.json5声明依赖。 - 在
entry/src/ohosTest中补充对应 UT / DT 用例。
步骤2:配置 / 确认 Ability 入口(让系统能「找得到」本能力)
业务逻辑若在 HAR 内,外部仍只会拉起 entry 里声明的 Ability。因此要核对 entry/src/main/module.json5 两个关键点:
- Ability 是否覆盖:现有
MainAbility是否覆盖新场景;若需新的 Ability / skills / Want 过滤器,在此声明,否则外部 Want 无法拉起。 - 权限是否足够:新能力可能需要额外权限。
以睡眠定时为例:该能力由播放页内部触发,无需新增 Ability 或 skills —— 现有 MainAbility 已覆盖播放页入口,ohos.permission.KEEP_BACKGROUND_RUNNING(后台定时保活)与 ohos.permission.NOTIFICATION_CONTROLLER(到期通知)权限均已声明,因此步骤2仅需确认现有配置,无需修改。
若新能力需要被外部应用直接拉起(如桌面快捷方式),则需在 module.json5 的 skills 数组中新增对应 action 过滤器,并在 requestPermissions 中补充缺失权限:
// module.json5 — skills 新增一项(示意)
{
"actions": ["ohos.want.action.sleepTimer"],
"entities": ["entity.system.default"]
}
步骤3:定制 UI
在业务数据与 Ability 可达之后,再改页面把能力暴露给用户,例如:
| UI | 位置 | 用途 |
|---|---|---|
| 播放页新增「睡眠定时」入口 | feature/player/src/main/ets/pages/AudioPage.ets / VideoPlayPage.ets |
弹出定时选项 |
| 定时选项半模态 | entry/src/main/ets/pages/nav/ 新增 NavDestination |
选择时长并写入步骤1 的持久化 |
| 播放队列面板状态同步 | feature/player/src/main/ets/datasource/ |
展示剩余时长 |
新增独立页面时:
- 在
entry/src/main/ets/pages/nav/下新增 NavDestination 包装页,业务 UI 放在对应 Feature; - 在
entry/src/main/ets/navigation/AppNavPageMap.ets中注册路由; - 在
entry/src/main/ets/constants/AppNavRoutes.ets中增加路由名称常量; - 通过
NavRouterHelper统一导航跳转。
目录
applications_players
├─AppScope # 应用级配置与多语言资源
│ ├─app.json5 # bundleName、版本号等
│ └─resources/ # 全局字符串 / 图标等资源
├─entry # 产品层,承载应用入口、主页面与页面导航
│ └─src/main/ets/
│ ├─abilities/ # Ability 入口与 UIAbility 生命周期管理
│ ├─pages/ # 首页、默认索引页、歌单页等主页面
│ ├─pages/nav/ # NavDestination 子页面,包括音频/视频/搜索/设置等
│ ├─navigation/ # NavPathStack 路由表与页面注册
│ ├─components/ # 首页组件,包括顶栏、分类 Tab、浮动 Tab 栏等
│ ├─viewmodel/ # 页面级业务编排,包括首页与歌单的 ViewModel
│ ├─constants/ # 路由名称、视图尺寸等常量
│ └─utils/ # 外部 Want 解析(文件管理器「打开方式」)、统一导航跳转、歌单封面解析
├─feature # 特性层
│ ├─media/ # 媒体列表浏览
│ │ └─src/main/ets/
│ │ ├─components/ # 列表与宫格视图组件
│ │ ├─manager/ # 媒体列表业务编排与状态管理
│ │ ├─constants/ # 布局模式、排序规则、UI 尺寸等常量
│ │ └─datasource/ # 媒体列表 LazyForEach 数据源适配
│ ├─player/ # 音视频播放
│ │ └─src/main/ets/
│ │ ├─pages/ # 音频播放页、视频播放页
│ │ ├─component/ # 视频播放器等播放器组件
│ │ ├─controller/ # 播放控制,包括音频/视频/通用播放控制器
│ │ ├─session/ # AVSession 媒体会话与后台播放管理
│ │ ├─viewmodel/ # 视频播放与画中画业务编排
│ │ ├─view/ # 播放页应用栏:标题栏(返回+标题+操作按钮)与工具按钮
│ │ ├─datasource/ # 播放队列半模态 LazyForEach 数据源,支持拖拽排序与当前曲目高亮
│ │ ├─utils/ # 窗口模式检测(分屏/浮窗/PC)、视频宽高比与画中画尺寸计算、媒体标题解析
│ │ └─constants/ # 播放控制、画中画、UI 尺寸等常量
│ ├─playlist/ # 歌单管理
│ │ └─src/main/ets/
│ │ ├─components/ # 歌单列表、详情、编辑等组件
│ │ ├─datasource/ # 歌单卡片与曲目 LazyForEach 数据源,支持拖拽排序
│ │ ├─model/ # 歌单卡片数据模型(id、名称、曲目数、封面 URI)
│ │ ├─constants/ # 歌单 UI 常量,包括卡片样式、网格布局、名称输入弹窗等
│ │ └─utils/ # 歌单名称输入校验(过滤非法字符、限制长度)
│ └─search/ # 搜索
│ └─src/main/ets/
│ ├─components/ # 搜索浮层、搜索结果项等组件
│ ├─viewmodel/ # 搜索业务编排
│ ├─manager/ # 搜索索引协调器:从媒体缓存构建倒排索引,按类型检索(音频/视频)
│ ├─utils/ # 搜索历史与快捷搜索词持久化(基于 Preferences)
│ └─constants/ # 搜索 UI、偏好等常量
├─common # 公共能力层
│ └─src/main/ets/
│ ├─bridge/ # 依赖注入桥接接口,供特性层访问媒体列表数据
│ ├─cache/ # 媒体列表内存缓存(5分钟TTL,按媒体类型分区),避免重复扫描
│ ├─component/ # 通用 UI 组件,包括空状态、搜索栏、返回按钮等
│ ├─constants/ # 主题、播放器、支持的媒体格式等常量
│ ├─context/ # 全局上下文持有者
│ ├─datasource/ # 数据源抽象与实现
│ ├─listener/ # 文件变更监听(媒体库/用户文件)与数据库同步引擎
│ ├─model/ # 数据模型,包括音频项、视频项、文件信息等
│ ├─notification/ # 通知管理,包括进度通知等
│ ├─permission/ # 权限管理
│ ├─persistence/ # 持久化,包括数据库管理、播放历史、显示设置等
│ ├─player/ # 播放引擎,包括播放队列管理、AVPlayer 管理等
│ ├─scan/ # 扫描任务调度,包括扫描器、状态管理、任务池等
│ ├─search/ # 倒排索引与搜索索引管理
│ ├─storage/ # 全局 LocalStorage,存储播放页 UI 状态(全屏、安全区、后台标记等)
│ ├─thumbnail/ # 缩略图多级缓存,包括磁盘缓存与内存缓存
│ └─utils/ # 通用工具,包括日志、元数据解析、设备配置等
├─hvigor # 构建工具配置
├─signature # 签名证书与 profile
├─docs/figures/ # 架构/构建文档图片
├─build-profile.json5 # 工程级配置
├─oh-package.json5
├─README.md # 中文说明文档
└─README_en.md # 英文说明文档
约束
-
语言版本:ArkTS
-
运行形态:系统预置应用(
com.ohos.players),依赖媒体播放、文件访问等系统能力 -
设备类型:手机、平板(见
entry/src/main/module.json5) -
形态适配:横竖屏、PiP、分屏等会改变页面布局,修改 UI 时需覆盖多形态验证
-
权限:播放器所需的主要权限如下(见
entry/src/main/module.json5)权限 授权方式 使用场景 ohos.permission.READ_AUDIO 用户授权 读取音频文件元数据与内容,供媒体列表扫描与播放 ohos.permission.WRITE_AUDIO 用户授权 创建/管理音频文件 ohos.permission.READ_IMAGEVIDEO 用户授权 读取视频文件元数据与内容 ohos.permission.WRITE_IMAGEVIDEO 用户授权 创建/管理视频文件 ohos.permission.KEEP_BACKGROUND_RUNNING 系统授权 后台音频播放与媒体扫描任务保活,避免进程被挂起 ohos.permission.NOTIFICATION_CONTROLLER 系统授权 播放通知与扫描进度通知,供播控中心与锁屏卡片展示 -
支持的媒体格式:音频(m4a、aac、mp3、ogg、wav、amr)、视频(mp4、mkv、ts)
-
不支持的功能:分布式/跨设备播放、歌词导入与显示、在线流媒体播放
参与贡献
欢迎广大开发者贡献代码、文档等,具体的贡献流程和方式请参见参与贡献。
项目介绍
播放器是 OpenHarmony 中预置的系统应用,提供媒体列表浏览、音视频播放、歌单管理与搜索等能力,适配手机、平板设备形态。
https://gitcode.com/openharmony-sig/applications_players定制我的领域