chendeben 1 год назад
Родитель
Сommit
e73c2002d1

+ 38 - 48
entry/src/main/ets/common/service/UnifiedPlayerService.ets

@@ -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);
     }
   }

+ 5 - 6
entry/src/main/ets/controller/AvSessionController.ets

@@ -118,6 +118,7 @@ export class AvSessionController {
       // 如果是DRM资源,配置支持的DRM uuid 用于设备过滤。非DRM资源不配置。
       // drmSchemes: ['3d5e6d35-9b9a-41e8-b843-dd3c6e72c42c']
     };
+    console.log('Heanup SetAVMetadata metadata:'+JSON.stringify( metadata));
     if (this.avSession) {
       this.avSession.setAVMetadata(metadata).then(() => {
         this.avSessionMetadata = metadata;
@@ -135,7 +136,6 @@ export class AvSessionController {
     }
     try {
       BackgroundTaskManager.startContinuousTask(this.context);
-
       let pixelMapPath: string | undefined = curSource.pixelMapPath
 
       let imagePixMap: PixelMap|string ;
@@ -145,10 +145,9 @@ export class AvSessionController {
         }else{
           imagePixMap = await ImageUtils.imagePathToPixelMap(pixelMapPath)
         }
-        } else {
-          imagePixMap = await ImageUtils.imagePathToPixelMap(pixelMapPath as string)
-        }
-
+      } else {
+        imagePixMap = await ImageUtil.getPixelMapFromMedia($r('app.media.ic_avatar2'));
+      }
       let lyric = ''
       if (lyricContent) {
         lyric = LyricUtil.convertLyricToSimpleLrc(lyricContent)
@@ -168,7 +167,7 @@ export class AvSessionController {
         // 如果是DRM资源,配置支持的DRM uuid 用于设备过滤。非DRM资源不配置。
         // drmSchemes: ['3d5e6d35-9b9a-41e8-b843-dd3c6e72c42c']
       };
-
+      console.log('Heanup SetAVMetadata metadata:'+JSON.stringify( metadata));
       if (this.avSession) {
         this.avSession.setAVMetadata(metadata).then(() => {
           this.avSessionMetadata = metadata;

+ 0 - 31
entry/src/main/ets/view/LocalMusic.ets

@@ -12016,37 +12016,6 @@ export struct LocalMusic {
     this.changeImageAnimation()
   }
 
-  //随机播放模式下点击上一首: 上一首应该应该播放历史记录的第二首
-  private randomModePlayFromHistory() {
-    if (this.historyList.length >= 2) {
-      // 播放历史记录的第二首
-      const prevSong = this.historyList[1];
-      this.curIndex = this.songList.findIndex(song => song.filePath === prevSong.filePath);
-      this.CONTROL_PlayStatus = PlayStatus.INIT;
-      this.stop();
-      this.currentSong = prevSong;
-      this.videoUrl = prevSong.filePath;
-      this.cover = prevSong.pixelMapPath
-      this.artist = prevSong.artist
-      this.name = prevSong.name;
-      this.startPlayOrResumePlay();
-    } else {
-      // 如果历史记录不足两首,可根据需求处理,这里简单按普通逻辑处理
-      if (this.curIndex === 0) {
-        this.curIndex = this.songList.length - 1;
-      } else {
-        this.curIndex--;
-      }
-      this.CONTROL_PlayStatus = PlayStatus.INIT;
-      this.stop();
-      this.currentSong = this.songList[this.curIndex];
-      this.videoUrl = this.songList[this.curIndex].filePath;
-      this.artist = this.songList[this.curIndex].artist
-      this.name = this.songList[this.curIndex].name;
-      this.changeImageAnimation()
-    }
-  }
-
   debounce() {
     const delay = 600;
     let cur = new Date().getTime();