|
|
@@ -352,6 +352,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 防重复调用机制
|
|
|
private isUpdatingForms: boolean = false;
|
|
|
private lastUpdateTime: number = 0;
|
|
|
+ private lastAvSessionUpdateTime: number = 0;
|
|
|
private readonly UPDATE_THROTTLE_MS: number = 100; // 100ms内只允许一次更新
|
|
|
private progressTimer: number = -1;
|
|
|
private isInitialized: boolean = false;
|
|
|
@@ -410,33 +411,6 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
this.playlistSync.addSyncListener(this);
|
|
|
|
|
|
// 设置状态模型监听器,自动广播状态变化
|
|
|
- class StateListenerImpl {
|
|
|
- private unifiedService: UnifiedPlayerService;
|
|
|
-
|
|
|
- constructor(unifiedService: UnifiedPlayerService) {
|
|
|
- this.unifiedService = unifiedService;
|
|
|
- }
|
|
|
-
|
|
|
- onStateChanged(state: PlayerState): void {
|
|
|
-
|
|
|
- // 使用防抖机制更新系统播控,避免频繁更新
|
|
|
- this.unifiedService.updateSessionPlayState();
|
|
|
- // 状态变化时更新卡片
|
|
|
- this.unifiedService.updateWidgetsForStateChange();
|
|
|
- }
|
|
|
- onSongChanged(song: VideoItem): void {
|
|
|
-
|
|
|
- // 使用防抖机制更新系统播控元数据,避免频繁更新
|
|
|
- this.unifiedService.updateAvSessionMetadata(song);
|
|
|
-
|
|
|
- // 歌曲变化时更新卡片
|
|
|
- this.unifiedService.updateWidgetsForSongChange(song);
|
|
|
- }
|
|
|
-
|
|
|
- onError(error: PlayerError): void {
|
|
|
- LogUtils.getInstance().LOGI(`Player error: ${error.message}`);
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
this.setupProgressTimer();
|
|
|
this.isInitialized = true;
|
|
|
@@ -540,6 +514,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
// 设置播放器并开始播放
|
|
|
await this.setupAndStartPlayback(currentSong);
|
|
|
+ await this.doUpdateAvSessionMetadata(currentSong)
|
|
|
|
|
|
} catch (error) {
|
|
|
this.stateModel.updateLoadingState(false);
|
|
|
@@ -884,7 +859,10 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
// 强制更新所有桌面卡片状态
|
|
|
await this.updateAllForms(true);
|
|
|
-
|
|
|
+ if (newSong) {
|
|
|
+ await this.updateAvSessionMetadata(newSong)
|
|
|
+ }
|
|
|
+
|
|
|
LogUtils.getInstance().LOGI('UnifiedPlayerService: Widget state updated after track change');
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`UnifiedPlayerService: Failed to update widgets after track change: ${error}`);
|
|
|
@@ -2456,6 +2434,16 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 确保播放列表状态是最新的
|
|
|
this.updatePlaylistStateInModelSync();
|
|
|
|
|
|
+ // 更新 AVSession 状态
|
|
|
+ if (isActuallyPlaying) {
|
|
|
+ let currentSong= this.getCurrentSong();
|
|
|
+ if (currentSong) {
|
|
|
+ console.log(`Heanup2 UnifiedPlayerService: onPrepared - updateAvSessionMetadata: ${json.stringify(currentSong)}`);
|
|
|
+ this.updateAvSessionMetadata(currentSong)
|
|
|
+ }
|
|
|
+ this.updateSessionPlayState(true); // 强制更新,不使用防抖
|
|
|
+ }
|
|
|
+
|
|
|
// 延迟更新卡片,确保状态已同步
|
|
|
setTimeout(() => {
|
|
|
this.updateWidgetsForStateChange();
|
|
|
@@ -2489,12 +2477,9 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 保存播放状态变化
|
|
|
this.saveCurrentState();
|
|
|
|
|
|
- // 延迟更新系统播控,避免与其他更新冲突
|
|
|
- setTimeout(() => {
|
|
|
- // 使用防抖机制更新系统播控(主要更新播放状态)
|
|
|
- this.updateSessionPlayState();
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession state updated for new song playback');
|
|
|
- }, 600); // 增加延迟,避免与onPrepared的更新冲突
|
|
|
+ // 立即更新系统播控状态,确保与播放状态同步
|
|
|
+ this.updateSessionPlayState(true); // 强制更新,不使用防抖
|
|
|
+ LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession state updated for new song playback');
|
|
|
|
|
|
// 播放开始时更新卡片显示播放状态
|
|
|
this.updateWidgetsForPlayStateChange();
|
|
|
@@ -2958,16 +2943,21 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
/**
|
|
|
* 更新AVSession播放状态(带防抖)
|
|
|
*/
|
|
|
- private updateSessionPlayState(): void {
|
|
|
+ private updateSessionPlayState(force: boolean = false): void {
|
|
|
// 清除之前的定时器
|
|
|
if (this.avSessionUpdateTimer !== -1) {
|
|
|
clearTimeout(this.avSessionUpdateTimer);
|
|
|
}
|
|
|
|
|
|
- // 增加防抖延迟到500ms,减少频繁更新
|
|
|
- this.avSessionUpdateTimer = setTimeout(() => {
|
|
|
+ if (force) {
|
|
|
+ // 强制更新,立即执行
|
|
|
this.doUpdateSessionPlayState();
|
|
|
- }, 500);
|
|
|
+ } else {
|
|
|
+ // 增加防抖延迟到500ms,减少频繁更新
|
|
|
+ this.avSessionUpdateTimer = setTimeout(() => {
|
|
|
+ this.doUpdateSessionPlayState();
|
|
|
+ }, 500);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -3004,8 +2994,8 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
// 按照官方文档要求设置完整的播放状态
|
|
|
const playbackState: avSession.AVPlaybackState = {
|
|
|
- // 播放状态
|
|
|
- state: ijkPlayer?.isPlaying() ? avSession.PlaybackState.PLAYBACK_STATE_PLAY : avSession.PlaybackState.PLAYBACK_STATE_PAUSE,
|
|
|
+ // 播放状态 - 修复:确保播放状态正确反映当前状态
|
|
|
+ state: currentState.isPlaying ? avSession.PlaybackState.PLAYBACK_STATE_PLAY : avSession.PlaybackState.PLAYBACK_STATE_PAUSE,
|
|
|
|
|
|
// 播放速度
|
|
|
speed: currentState.speed || 1.0,
|
|
|
@@ -3050,26 +3040,26 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
clearTimeout(this.avMetadataUpdateTimer);
|
|
|
}
|
|
|
const now = Date.now();
|
|
|
- if (now - this.lastUpdateTime < 1000) {
|
|
|
+ if (now - this.lastAvSessionUpdateTime < 1000) {
|
|
|
return;
|
|
|
}
|
|
|
- this.lastUpdateTime = now;
|
|
|
+ this.lastAvSessionUpdateTime = now;
|
|
|
// 如果播放器还没准备好,延迟更新等待播放器准备完成
|
|
|
const ijkPlayer = this.playerManager.getIjkPlayer();
|
|
|
const playerDuration = ijkPlayer ? ijkPlayer.getDuration() : 0;
|
|
|
const shouldWaitForPlayer = playerDuration <= 0 && this.isPlayerPreparedForCurrentSong === false;
|
|
|
- this.avMetadataUpdateTimer = setTimeout(() => {
|
|
|
- this.doUpdateAvSessionMetadata(song);
|
|
|
+ this.avMetadataUpdateTimer = setTimeout( () => {
|
|
|
+ this.doUpdateAvSessionMetadata(song);
|
|
|
}, 800);
|
|
|
if (shouldWaitForPlayer) {
|
|
|
// 播放器还没准备好,延迟更新
|
|
|
- this.avMetadataUpdateTimer = setTimeout(() => {
|
|
|
- this.doUpdateAvSessionMetadata(song);
|
|
|
+ this.avMetadataUpdateTimer = setTimeout( () => {
|
|
|
+ this.doUpdateAvSessionMetadata(song);
|
|
|
}, 800);
|
|
|
} else {
|
|
|
// 播放器已准备好或者不需要等待,稍微延迟更新
|
|
|
- this.avMetadataUpdateTimer = setTimeout(() => {
|
|
|
- this.doUpdateAvSessionMetadata(song);
|
|
|
+ this.avMetadataUpdateTimer = setTimeout( () => {
|
|
|
+ this.doUpdateAvSessionMetadata(song);
|
|
|
}, 800);
|
|
|
}
|
|
|
}
|