桌面播放器卡片是一个基于HarmonyOS Form Kit的系统级小组件,为TTMusic应用提供桌面快速控制功能。该卡片将利用现有的AvSessionController和ijkplayer播放器架构,通过FormExtensionAbility实现与主应用的数据同步和控制交互。当前应用使用ijkplayer作为播放内核,通过AvSessionController管理媒体会话,卡片将通过这个架构实现播放控制。
graph TB
A[桌面卡片UI] --> B[FormExtensionAbility]
B --> C[FormProvider]
C --> D[CommonEvent通信]
D --> E[LocalMusic组件]
E --> F[ijkplayer播放内核]
E --> G[AvSessionController]
H[数据存储] --> C
I[卡片配置] --> C
J[系统通知栏] --> G
K[媒体控制中心] --> G
L[投播控制] --> G
负责卡片的生命周期管理和系统交互。
主要职责:
关键接口:
interface FormExtensionAbility {
onAddForm(want: Want): formBindingData.FormBindingData
onUpdateForm(formId: string): void
onRemoveForm(formId: string): void
onFormEvent(formId: string, message: string): void
}
卡片的核心业务逻辑处理器。
主要职责:
数据模型:
interface WidgetPlayState {
isPlaying: boolean
currentSong: SongInfo
progress: PlayProgress
playMode: PlayMode
hasPlaylist: boolean
}
interface SongInfo {
title: string
artist: string
album: string
coverUrl: string
duration: number
}
interface PlayProgress {
currentTime: number
totalTime: number
percentage: number
}
与主应用播放器的通信接口。
主要功能:
通信机制:
多尺寸卡片布局管理。
支持的卡片尺寸:
interface WidgetData {
// 播放状态
playState: {
isPlaying: boolean
isPaused: boolean
isLoading: boolean
}
// 当前歌曲信息
currentSong: {
id: string
title: string
artist: string
album: string
coverImagePath: string
duration: number
}
// 播放进度
progress: {
currentPosition: number
duration: number
percentage: number
currentTimeText: string
totalTimeText: string
}
// 播放列表状态
playlist: {
hasNext: boolean
hasPrevious: boolean
currentIndex: number
totalCount: number
}
// 卡片配置
config: {
size: WidgetSize
theme: WidgetTheme
showProgress: boolean
showCover: boolean
}
}
enum WidgetCommand {
PLAY_PAUSE = 'play_pause',
NEXT_SONG = 'next_song',
PREV_SONG = 'prev_song',
SEEK_TO = 'seek_to',
OPEN_APP = 'open_app',
OPEN_PLAYER = 'open_player'
}
interface WidgetControlMessage {
command: WidgetCommand
params?: {
position?: number
songId?: string
}
}
interface AppCommunicationService {
// 发送控制命令到主应用
sendControlCommand(command: WidgetCommand, params?: any): Promise<boolean>
// 获取当前播放状态
getCurrentPlayState(): Promise<WidgetData>
// 注册状态变化监听
registerStateListener(callback: (data: WidgetData) => void): void
// 启动主应用
launchMainApp(page?: string): Promise<boolean>
}
interface WidgetDataManager {
// 保存卡片数据
saveWidgetData(formId: string, data: WidgetData): Promise<void>
// 获取卡片数据
getWidgetData(formId: string): Promise<WidgetData>
// 更新卡片显示
updateWidget(formId: string, data: WidgetData): Promise<void>
// 批量更新所有卡片
updateAllWidgets(data: WidgetData): Promise<void>
}
enum WidgetErrorType {
COMMUNICATION_ERROR = 'communication_error',
DATA_SYNC_ERROR = 'data_sync_error',
CONTROL_COMMAND_ERROR = 'control_command_error',
LAYOUT_ERROR = 'layout_error'
}
interface WidgetError {
type: WidgetErrorType
message: string
code: number
timestamp: number
}