|
|
@@ -363,6 +363,7 @@ export interface IPlayerService {
|
|
|
* @returns 收藏列表
|
|
|
*/
|
|
|
getFav(): Array<VideoItem>;
|
|
|
+ syncPlaylistToService(songList: VideoItem[], currentIndex: number, playType: PlayMode): void
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -1565,6 +1566,36 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
return removedSong;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 同步播放列表到服务
|
|
|
+ * 从LocalMusic迁移的方法,用于统一调用
|
|
|
+ */
|
|
|
+ syncPlaylistToService(songList: VideoItem[], currentIndex: number, playType: PlayMode): void {
|
|
|
+ try {
|
|
|
+ if (songList && songList.length > 0) {
|
|
|
+ // 记录调用栈信息以便调试
|
|
|
+ const stack = new Error().stack || 'No stack available';
|
|
|
+ const caller = stack.split('\n')[2] || 'Unknown caller';
|
|
|
+
|
|
|
+ this.setPlaylist(songList, currentIndex);
|
|
|
+
|
|
|
+ // 同步播放模式到UnifiedPlayerService
|
|
|
+ this.setPlayMode(playType);
|
|
|
+
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Playlist and play mode synced - ${songList.length} songs, mode: ${playType}, caller: ${caller.trim()}`);
|
|
|
+
|
|
|
+ // 如果同步的是小播放列表,记录更多信息
|
|
|
+ if (songList.length <= 20) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Small playlist sync detected, first few songs: ${songList.slice(0, 5).map(s => s.name).join(', ')}`);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ LogUtils.getInstance().LOGI('UnifiedPlayerService: syncPlaylistToService - No songs to sync');
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService syncPlaylistToService error: ${error}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// 事件监听
|
|
|
addStateListener(listener: PlayerStateListener): void {
|
|
|
this.stateModel.addStateListener(listener);
|
|
|
@@ -1589,9 +1620,24 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
this.avMetadataUpdateTimer = -1;
|
|
|
}
|
|
|
|
|
|
- // 保存当前状态
|
|
|
- this.saveCurrentState();
|
|
|
+ // 重要修复:确保在应用销毁时将播放状态设置为停止
|
|
|
+ try {
|
|
|
+ // 强制设置为停止状态,防止卡片显示错误的播放状态
|
|
|
+ this.stateModel.updatePlayingState(false);
|
|
|
+ this.stateModel.updateLoadingState(false);
|
|
|
+
|
|
|
+ // 确保播放器也停止
|
|
|
+ if (this.playerManager) {
|
|
|
+ this.playerManager.release() ;
|
|
|
+ }
|
|
|
+
|
|
|
+ LogUtils.getInstance().LOGI('UnifiedPlayerService: Forced stop state before release');
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Failed to force stop state: ${error}`);
|
|
|
+ }
|
|
|
|
|
|
+ // 保存当前状态(现在应该是停止状态)
|
|
|
+ this.saveCurrentState();
|
|
|
|
|
|
if (this.avSessionController) {
|
|
|
this.avSessionController.unregisterSessionListener();
|
|
|
@@ -1603,6 +1649,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
this.playlistSync.release();
|
|
|
|
|
|
this.playerManager.release();
|
|
|
+
|
|
|
this.playlistModel.clear();
|
|
|
this.isInitialized = false;
|
|
|
|
|
|
@@ -1997,6 +2044,9 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
LogUtils.getInstance().LOGI('UnifiedPlayerService: Progress timer started');
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 停止进度定时器
|
|
|
+ */
|
|
|
private stopProgressTimer(): void {
|
|
|
if (this.progressTimer !== -1) {
|
|
|
clearInterval(this.progressTimer);
|
|
|
@@ -2228,18 +2278,48 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
*/
|
|
|
private saveCurrentState(): void {
|
|
|
try {
|
|
|
- // 保存播放状态
|
|
|
+ // 获取当前状态
|
|
|
const currentState = this.stateModel.getState();
|
|
|
- this.dataPersistence.savePlayerState(currentState)
|
|
|
+
|
|
|
+ // 验证播放器实际状态,确保状态模型与实际播放器状态一致
|
|
|
+ try {
|
|
|
+ const ijkPlayer = this.playerManager.getIjkPlayer();
|
|
|
+ const actualPlaying = ijkPlayer ? ijkPlayer.isPlaying() : false;
|
|
|
+
|
|
|
+ // 如果状态不一致,以实际播放器状态为准
|
|
|
+ if (currentState.isPlaying !== actualPlaying) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: State mismatch detected during save - StateModel: ${currentState.isPlaying}, Actual: ${actualPlaying}`);
|
|
|
+ this.stateModel.updatePlayingState(actualPlaying);
|
|
|
+ // 重新获取修正后的状态
|
|
|
+ const correctedState = this.stateModel.getState();
|
|
|
+ this.dataPersistence.savePlayerState(correctedState);
|
|
|
+ } else {
|
|
|
+ this.dataPersistence.savePlayerState(currentState);
|
|
|
+ }
|
|
|
+ } catch (playerError) {
|
|
|
+ // 如果获取播放器状态失败,默认保存为停止状态
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Failed to get actual player state, saving as stopped: ${playerError}`);
|
|
|
+ this.stateModel.updatePlayingState(false);
|
|
|
+ const stoppedState = this.stateModel.getState();
|
|
|
+ this.dataPersistence.savePlayerState(stoppedState);
|
|
|
+ }
|
|
|
|
|
|
- // 保存播放进度
|
|
|
this.savePlaybackPosition();
|
|
|
-
|
|
|
+ this.syncPlaylistToStorage();
|
|
|
+
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Current state saved successfully`);
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`UnifiedPlayerService saveCurrentState error: ${error}`);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 外部调用保存当前状态的方法(供EntryAbility使用)
|
|
|
+ */
|
|
|
+ public saveCurrentStateExternal(): void {
|
|
|
+ this.saveCurrentState();
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 同步播放列表到存储
|
|
|
*/
|