chendeben 1 year ago
parent
commit
cc23876415

+ 215 - 90
entry/src/main/ets/common/service/UnifiedPlayerService.ets

@@ -41,6 +41,16 @@ import { FormInfo } from '../../viewmodel/FormInfo';
 import { WidgetDataRdbHelper } from '../../database/WidgetDataRdbHelper';
 import { WidgetDataInfo } from '../../viewmodel/WidgetDataInfo';
 import { PreferencesUtil, IWidgetData } from '../utils/PreferencesUtil';
+import { SettingPage } from '../../pages/SettingPage';
+
+/**
+ * 跳过设置接口
+ */
+interface JumpSettings {
+  isEnabled: boolean;
+  jumpTopTime: number;
+  jumpEndTime: number;
+}
 
 /**
  * 存储方式枚举
@@ -501,7 +511,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
     this.playlistSync = PlaylistSyncService.getInstance();
     this.errorRecovery = ErrorRecoveryStrategy.getInstance();
 
-    LogUtils.getInstance().LOGI('UnifiedPlayerService: Instance created');
+    LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Instance created');
   }
 
   public static getInstance(): UnifiedPlayerService {
@@ -513,7 +523,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
 
   async initialize(context: common.UIAbilityContext): Promise<void> {
     if (this.isInitialized && this.context === context) {
-      LogUtils.getInstance().LOGI('UnifiedPlayerService已经初始化过了');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService已经初始化过了');
       return;
     }
 
@@ -548,7 +558,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
       // 清理无效的Form ID
       this.cleanupInvalidFormIds();
 
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Core initialization completed');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Core initialization completed');
     } catch (error) {
       LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService initialization error: ${error}`);
       throw new Error(`初始化失败: ${error}`);
@@ -564,7 +574,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
       this.context = context as common.UIAbilityContext;
       // 同时设置到AppStorage,确保卡片进程中其他地方能访问
       AppStorage.setOrCreate('context', context);
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Form context set successfully');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Form context set successfully');
     } catch (error) {
       LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Failed to set form context: ${error}`);
     }
@@ -628,14 +638,14 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
         setTimeout(async () => {
           try {
              this.saveCurrentState()
-            LogUtils.getInstance().LOGI('UnifiedPlayerService: Player state synced to UI after initialization');
+            LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Player state synced to UI after initialization');
           } catch (error) {
             LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Failed to sync player state after initialization: ${error}`);
           }
         }, 500); // 延迟500ms确保初始化完全完成
 
         console.log("Heanup2 UnifiedPlayerService: 异步组件初始化完成");
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: Heavy components initialized');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Heavy components initialized');
       } catch (error) {
         console.log(`Heanup2 UnifiedPlayerService: 异步组件初始化失败: ${error}`);
         LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService heavy components init error: ${error}`);
@@ -900,7 +910,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
     try {
       // 检查服务是否已准备就绪
       if (!this.isAllServicesReady()) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: pause - 服务未就绪');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: pause - 服务未就绪');
         // 对于暂停操作,如果服务未就绪,可以尝试简单的状态更新
         this.stateModel.updatePlayingState(false);
         return;
@@ -956,7 +966,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
       // 更新卡片显示停止状态
       await this.updateWidgetsForPlayStateChange();
 
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Stop completed, all states cleared');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Stop completed, all states cleared');
     } catch (error) {
       LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService stop error: ${error}`);
       throw new Error;
@@ -1078,7 +1088,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
           // 移除此处的AVSession更新,避免与onPrepared中的更新冲突
           // AVSession会在onPrepared回调中正确更新
 
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: Widget state updated after track change');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Widget state updated after track change');
         } catch (error) {
           LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Failed to update widgets after track change: ${error}`);
         }
@@ -1272,7 +1282,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
       // 触发状态变化通知,确保LocalMusic UI能收到收藏状态变化
       this.stateModel.forceNotifyStateChanged();
 
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Favorite status refreshed and state change notified');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Favorite status refreshed and state change notified');
     } catch (error) {
       LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Failed to refresh favorite status: ${error}`);
     }
@@ -1320,11 +1330,11 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
    */
   async forceDataRestoration(): Promise<boolean> {
     try {
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Force data restoration started');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Force data restoration started');
 
       // 如果数据已经恢复,直接返回
       if (this.isDataRestored) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: Data already restored');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Data already restored');
         return true;
       }
 
@@ -1333,7 +1343,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
 
       // 如果播放列表仍为空,尝试从内存快速恢复
       if (this.playlistModel.getTotalCount() === 0) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: Playlist empty, trying memory restore');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Playlist empty, trying memory restore');
         await this.fastRestoreFromMemory();
       }
 
@@ -1358,30 +1368,30 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
       try {
         // 检查基本初始化状态
         if (!this.isInitialized) {
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: Service not initialized');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Service not initialized');
           return false;
         }
 
         // 检查核心组件是否就绪
         if (!this.playerManager || !this.stateModel || !this.playlistModel) {
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: Core components not ready');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Core components not ready');
           return false;
         }
 
         // 检查 PlayerManager 是否已经初始化
         const playerInstance = this.playerManager.getIjkPlayer();
         if (!playerInstance) {
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: Player instance not ready');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Player instance not ready');
           return false;
         }
 
         // 检查上下文是否可用
         if (!this.context) {
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: Context not available');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Context not available');
           return false;
         }
 
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: All services ready');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: All services ready');
         return true;
       } catch (error) {
         LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Service readiness check failed: ${error}`);
@@ -1510,13 +1520,13 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
       if (this.isAllServicesReady()) {
         // 如果不需要检查数据恢复,直接返回成功
         if (!checkDataRestore) {
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: All services ready (data restore check skipped)');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: All services ready (data restore check skipped)');
           return true;
         }
 
         // 检查数据恢复状态
         if (this.isDataRestored) {
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: All services ready and data restored');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: All services ready and data restored');
           return true;
         }
 
@@ -1662,7 +1672,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
           LogUtils.getInstance().LOGI(`Heanup 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');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: syncPlaylistToService - No songs to sync');
       }
     } catch (error) {
       LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService syncPlaylistToService error: ${error}`);
@@ -1704,7 +1714,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
           this.playerManager.release() ;
         }
         
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: Forced stop state before release');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Forced stop state before release');
       } catch (error) {
         LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Failed to force stop state: ${error}`);
       }
@@ -1724,7 +1734,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
       this.playlistModel.clear();
       this.isInitialized = false;
 
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Resources released');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Resources released');
     } catch (error) {
       LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService release error: ${error}`);
     }
@@ -1739,12 +1749,12 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
     try {
 
       this.avSessionController = AvSessionController.getInstance(false);
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession controller created');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession controller created');
 
 
       setTimeout(() => {
         this.setAvSessionListener();
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession listeners configured');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession listeners configured');
       }, 500);
 
     } catch (error) {
@@ -1764,7 +1774,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
 
     const avSession = this.avSessionController.getAvSession();
     if (!avSession) {
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession not available for listener setup');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession not available for listener setup');
       return;
     }
 
@@ -1779,7 +1789,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
 
       // 暂停事件监听
       avSession.on('pause', () => {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession pause command received');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession pause command received');
         this.pause().catch((error: Error) => {
           LogUtils.getInstance().LOGI(`AVSession pause command failed: ${error}`);
         });
@@ -1787,7 +1797,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
 
       // 停止事件监听
       avSession.on('stop', () => {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession stop command received');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession stop command received');
         this.stop().catch((error: Error) => {
           LogUtils.getInstance().LOGI(`AVSession stop command failed: ${error}`);
         });
@@ -1795,7 +1805,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
 
       // 下一首事件监听
       avSession.on('playNext', () => {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession playNext command received');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession playNext command received');
         this.playNext().catch((error: Error) => {
           LogUtils.getInstance().LOGI(`AVSession playNext command failed: ${error}`);
         });
@@ -1803,7 +1813,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
 
       // 上一首事件监听
       avSession.on('playPrevious', () => {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession playPrevious command received');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession playPrevious command received');
         this.playPrevious().catch((error: Error) => {
           LogUtils.getInstance().LOGI(`AVSession playPrevious command failed: ${error}`);
         });
@@ -1835,7 +1845,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
         this.toggleFavorite() ;
       });
 
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession listeners set up successfully');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession listeners set up successfully');
     } catch (error) {
       LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Failed to set AVSession listeners: ${error}`);
     }
@@ -1941,7 +1951,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
    */
   private async skipToNextSong(): Promise<void> {
     try {
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Skipping to next song due to error');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Skipping to next song due to error');
 
       // 重置重试计数
       this.currentRetryCount = 0;
@@ -1953,7 +1963,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
       } else {
         // 没有下一首,停止播放
         await this.stop();
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: No next song available, stopping playback');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: No next song available, stopping playback');
       }
 
     } catch (skipError) {
@@ -2141,7 +2151,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
 
     // 启动新的定时器
     this.setupProgressTimer();
-    LogUtils.getInstance().LOGI('UnifiedPlayerService: Progress timer started');
+    LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Progress timer started');
   }
 
   /**
@@ -2151,7 +2161,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
     if (this.progressTimer !== -1) {
       clearInterval(this.progressTimer);
       this.progressTimer = -1;
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Progress timer stopped');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Progress timer stopped');
     }
   }
 
@@ -2364,7 +2374,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
       // 立即更新播放列表状态,确保上一首/下一首状态正确
       this.updatePlaylistStateInModelSync();
 
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Data restoration completed');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Data restoration completed');
     } catch (error) {
       console.log(`Heanup2 UnifiedPlayerService: 恢复持久化状态时出错: ${error}`);
       LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService restorePersistedState error: ${error}`);
@@ -2471,13 +2481,13 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
         this.stateModel.updateCurrentIndex(playlistData.currentIndex);
         this.stateModel.updatePlayMode(playlistData.playMode);
 
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: Local playlist updated from storage');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Local playlist updated from storage');
       }
 
       // 更新数据恢复状态(如果还没有恢复的话)
       if (!this.isDataRestored) {
         this.isDataRestored = true;
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: Data restoration completed via onPlaylistLoaded');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Data restoration completed via onPlaylistLoaded');
       }
     } catch (error) {
       LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService onPlaylistLoaded error: ${error}`);
@@ -2542,7 +2552,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
    */
   public async onPlayPause(params?: PlayPauseInterface): Promise<void> {
     try {
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Received play/pause command from widget');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Received play/pause command from widget');
       const widgetIsPlaying = params?.widgetIsPlaying;
 
       if (widgetIsPlaying !== undefined) {
@@ -2550,16 +2560,16 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
         LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Using widget state - widgetIsPlaying=${widgetIsPlaying}`);
         if (widgetIsPlaying) {
           // 卡片显示的是暂停按钮(UI为播放状态),所以执行暂停
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: Widget state is PLAYING, will pause.');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Widget state is PLAYING, will pause.');
           await this.pause();
         } else {
           // 卡片显示的是播放按钮(UI为暂停/停止状态),所以执行播放
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: Widget state is PAUSED, will play.');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Widget state is PAUSED, will play.');
           await this.startPlayOrResumePlay();
         }
       } else {
         // 向后兼容的旧逻辑:根据播放器实际状态切换
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: widgetIsPlaying not provided, using fallback logic.');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: widgetIsPlaying not provided, using fallback logic.');
       const isActuallyPlaying = this.getActualPlayingState();
       if (isActuallyPlaying) {
         await this.pause();
@@ -2577,9 +2587,9 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
    */
   async onNextSong?(): Promise<void> {
     try {
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Received next song command from widget');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Received next song command from widget');
       await this.playNext();
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Next song command executed successfully');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Next song command executed successfully');
     } catch (error) {
       LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService onNextSong error: ${error}`);
       throw new Error;
@@ -2591,9 +2601,9 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
    */
   async onPreviousSong?(): Promise<void> {
     try {
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Received previous song command from widget');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Received previous song command from widget');
       await this.playPrevious();
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Previous song command executed successfully');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Previous song command executed successfully');
     } catch (error) {
       LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService onPreviousSong error: ${error}`);
       throw new Error;
@@ -2607,7 +2617,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
     try {
       LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Received seek to command from widget - position: ${position}`);
       await this.seekTo(position.toString());
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Seek to command executed successfully');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Seek to command executed successfully');
     } catch (error) {
       LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService onSeekTo error: ${error}`);
       throw new Error;
@@ -2619,9 +2629,9 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
    */
   async onStateRequest?(): Promise<void> {
     try {
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Received state request from widget');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Received state request from widget');
       await this.broadcastCurrentState();
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: State request handled successfully');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: State request handled successfully');
     } catch (error) {
       LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService onStateRequest error: ${error}`);
       throw new Error;
@@ -2641,7 +2651,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
 
       // 更新桌面卡片
       await this.updateAllForms(true); // 强制更新
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Current state broadcasted manually');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Current state broadcasted manually');
     } catch (error) {
       LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService broadcastCurrentState error: ${error}`);
       throw new Error;
@@ -2660,10 +2670,10 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
         ijkPlayer.on('audioInterrupt', (event: InterruptEvent) => {
           this.handleAudioInterrupt(event);
         });
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: Audio interrupt listener set up successfully');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Audio interrupt listener set up successfully');
       } else {
         LogUtils.getInstance()
-          .LOGI('UnifiedPlayerService: Failed to set up audio interrupt listener - no player instance');
+          .LOGI('Heanup UnifiedPlayerService: Failed to set up audio interrupt listener - no player instance');
       }
     } catch (error) {
       LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Error setting up audio interrupt listener: ${error.message}`);
@@ -2682,27 +2692,27 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
 
       switch (event.hintType) {
         case InterruptHintType.INTERRUPT_HINT_PAUSE:
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: Audio interrupt - pausing playback');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Audio interrupt - pausing playback');
           await this.pause();
           break;
 
         case InterruptHintType.INTERRUPT_HINT_RESUME:
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: Audio interrupt - resuming playback');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Audio interrupt - resuming playback');
           await this.startPlayOrResumePlay();
           break;
 
         case InterruptHintType.INTERRUPT_HINT_STOP:
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: Audio interrupt - stopping playback');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Audio interrupt - stopping playback');
           await this.stop();
           break;
 
         case InterruptHintType.INTERRUPT_HINT_DUCK:
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: Audio interrupt - ducking (lowering volume)');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Audio interrupt - ducking (lowering volume)');
           // 可以实现音量降低逻辑
           break;
 
         case InterruptHintType.INTERRUPT_HINT_UNDUCK:
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: Audio interrupt - unducking (restoring volume)');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Audio interrupt - unducking (restoring volume)');
           // 可以实现音量恢复逻辑
           break;
 
@@ -2784,13 +2794,18 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
   // ==================== PlayerStateCallback 实现 ====================
 
   onPrepared(): void {
-    LogUtils.getInstance().LOGI('UnifiedPlayerService: Player prepared');
+    LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Player prepared');
     this.stateModel.updateLoadingState(false);
 
     // 标记播放器已为当前歌曲准备就绪
     this.isPlayerPreparedForCurrentSong = true;
     console.log("Heanup2 UnifiedPlayerService: onPrepared - 播放器已为当前歌曲准备就绪");
 
+    // 执行跳过片头和记忆播放恢复逻辑
+    setTimeout(() => {
+      this.checkAndHandleOnPreparedLogic();
+    }, 200);
+
     setTimeout(() => {
       const ijkPlayer = this.playerManager.getIjkPlayer();
       const isActuallyPlaying = ijkPlayer ? ijkPlayer.isPlaying() : false;
@@ -2826,8 +2841,118 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
     this.updateWidgetsForStateChange();
   }
 
+  /**
+   * 播放器准备完成后的特殊逻辑处理
+   * 包括跳过片头和记忆播放恢复
+   */
+  private checkAndHandleOnPreparedLogic(): void {
+    try {
+      const currentSong = this.playlistModel.getCurrentSong();
+      if (!currentSong) {
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: No current song, skipping onPrepared logic');
+        return;
+      }
+
+      const videoUrl = currentSong.filePath;
+      const duration = this.playerManager.getIjkPlayer()?.getDuration() || 0;
+
+      // 检查跳过片头功能
+      const jumpSettings = this.loadJumpSettings(currentSong);
+      
+      if (jumpSettings.isEnabled && jumpSettings.jumpTopTime > 0) {
+        if (jumpSettings.jumpTopTime * 1000 <= duration) {
+          // 需要跳过片头
+          if (videoUrl && !videoUrl.toLowerCase().endsWith('.ts')) {
+            LogUtils.getInstance().LOGI(`UnifiedPlayerService: Jumping to intro end: ${jumpSettings.jumpTopTime}s`);
+            this.seekTo((jumpSettings.jumpTopTime * 1000).toString());
+          }
+        } else {
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Jump time exceeds video duration');
+        }
+      } else {
+        // 没有跳过片头,检查记忆播放
+        this.handleMemoryPlayback(currentSong, videoUrl);
+      }
+    } catch (error) {
+      LogUtils.getInstance().LOGI(`UnifiedPlayerService: Error in checkAndHandleOnPreparedLogic: ${error}`);
+    }
+  }
+
+  /**
+   * 加载跳过头尾设置
+   */
+  private loadJumpSettings(currentSong: VideoItem): JumpSettings {
+    try {
+      // 这里应该根据播放模式来获取设置,但因为我们在 UnifiedPlayerService 中,
+      // 暂时从当前歌曲的文件路径获取文件夹设置
+      const parentPath = this.getParentPath(currentSong.filePath);
+      
+      const jumpTopTime: number = PuraPreferencesUtil.getNumberSync(parentPath + 'jumpTopTime', 0);
+      const jumpEndTime: number = PuraPreferencesUtil.getNumberSync(parentPath + 'jumpEndTime', 0);
+      const isEnabled: boolean = PuraPreferencesUtil.getBooleanSync(parentPath + 'isOpenJump', false);
+      
+      LogUtils.getInstance().LOGI(`UnifiedPlayerService: Loaded jump settings - enabled: ${isEnabled}, top: ${jumpTopTime}s, end: ${jumpEndTime}s`);
+      
+      const settings: JumpSettings = { isEnabled, jumpTopTime, jumpEndTime };
+      return settings;
+    } catch (error) {
+      LogUtils.getInstance().LOGI(`UnifiedPlayerService: Error loading jump settings: ${error}`);
+      const defaultSettings: JumpSettings = { isEnabled: false, jumpTopTime: 0, jumpEndTime: 0 };
+      return defaultSettings;
+    }
+  }
+
+  /**
+   * 处理记忆播放
+   */
+  private handleMemoryPlayback(currentSong: VideoItem, videoUrl: string): void {
+    try {
+      // 检查用户是否启用了记忆播放功能
+      const isMusicMemoryPlay: boolean = PuraPreferencesUtil.getBooleanSync(SettingPage.iS_MUSIC_MEMORY_PLAY, false);
+      const isMemoryLastPlay: boolean = PuraPreferencesUtil.getBooleanSync(SettingPage.iS_MEMORY_LAST_PLAY, false);
+      
+      // 只在首次启动时检查 isMemoryLastPlay
+      // 这里我们假设如果是首次播放,会有特殊标记
+      if (!isMusicMemoryPlay && !isMemoryLastPlay) {
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Memory play disabled, skipping restore');
+        return;
+      }
+
+      if (videoUrl && !videoUrl.toLowerCase().endsWith('.ts')) {
+        // 优先从 AppStorage 获取,如果没有则从 PreferencesUtil 获取
+        let position: number = AppStorage.get<number>(`playback_${videoUrl}`) || 0;
+        if (position === 0) {
+          position = PuraPreferencesUtil.getNumberSync(videoUrl, 0);
+        }
+
+        if (position > 0) {
+          LogUtils.getInstance().LOGI(`UnifiedPlayerService: Restoring playback position: ${position}ms for ${currentSong.name}`);
+          this.seekTo(position.toString());
+        }
+      }
+    } catch (error) {
+      LogUtils.getInstance().LOGI(`UnifiedPlayerService: Error in handleMemoryPlayback: ${error}`);
+    }
+  }
+
+  /**
+   * 获取文件的父目录路径
+   */
+  private getParentPath(filePath: string): string {
+    try {
+      const lastSlashIndex = filePath.lastIndexOf('/');
+      if (lastSlashIndex > 0) {
+        return filePath.substring(0, lastSlashIndex + 1);
+      }
+      return filePath;
+    } catch (error) {
+      LogUtils.getInstance().LOGI(`UnifiedPlayerService: Error getting parent path: ${error}`);
+      return filePath;
+    }
+  }
+
   onPlaybackStarted(): void {
-    LogUtils.getInstance().LOGI('UnifiedPlayerService: Playback started (new song)');
+    LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Playback started (new song)');
 
     // 这个回调只应该在新歌曲开始播放时被调用(通过onPrepared触发)
     // 不应该在暂停恢复时被调用
@@ -2836,7 +2961,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
     const playMode = this.stateModel.getState().playMode;
     if (playMode === PlayMode.RANDOM) {
       this.playlistModel.ensureCurrentSongInHistory();
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Ensured current song in play history for random mode');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Ensured current song in play history for random mode');
     }
 
     // 立即更新播放状态
@@ -2850,7 +2975,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
 
     // 立即更新系统播控状态,确保与播放状态同步
     this.updateSessionPlayState(true); // 强制更新,不使用防抖
-    LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession state updated for new song playback');
+    LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession state updated for new song playback');
 
     // 播放开始时更新卡片显示播放状态
     this.updateWidgetsForPlayStateChange();
@@ -2858,11 +2983,11 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
     // 同步更新所有桌面卡片状态
     this.updateAllForms();
 
-    LogUtils.getInstance().LOGI('UnifiedPlayerService: New song playback started successfully');
+    LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: New song playback started successfully');
   }
 
   onPlaybackCompleted(): void {
-    LogUtils.getInstance().LOGI('UnifiedPlayerService: Playback completed');
+    LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Playback completed');
     this.stateModel.updatePlayingState(false);
     this.stopProgressTimer();
 
@@ -2891,21 +3016,21 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
     try {
       // 检查是否正在进行手动歌曲切换,如果是则跳过自动播放
       if (this.isManualSongChange) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: Manual song change in progress, skipping auto-play');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Manual song change in progress, skipping auto-play');
         return;
       }
 
       // 防抖检查:避免快速连续的自动播放调用
       const currentTime = Date.now();
       if (currentTime - this.lastAutoPlayTime < this.autoPlayDebounceMs) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: Auto-play debounced, skipping');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Auto-play debounced, skipping');
         return;
       }
       this.lastAutoPlayTime = currentTime;
 
       // 检查服务状态,避免在服务未就绪时执行自动播放
       if (!this.isAllServicesReady()) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: Services not ready for auto-play, skipping');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Services not ready for auto-play, skipping');
         return;
       }
 
@@ -2916,28 +3041,28 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
 
       switch (playMode) {
         case PlayMode.SEQUENCE: // 0: 顺序播放/列表循环
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: Auto-playing next song in sequence mode');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Auto-playing next song in sequence mode');
           // 检查是否有下一首歌曲
           if (this.playlistModel.hasNext(playMode)) {
             await this.playNext();
           } else {
-            LogUtils.getInstance().LOGI('UnifiedPlayerService: No next song available in sequence mode');
+            LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: No next song available in sequence mode');
           }
           break;
 
         case PlayMode.SINGLE_REPEAT: // 1: 单曲循环
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: Repeating current song');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Repeating current song');
           // 重新播放当前歌曲
           await this.startPlayOrResumePlay();
           break;
 
         case PlayMode.NORMAL: // 2: 正常播放,播完停止
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: Normal mode - stopping after completion');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Normal mode - stopping after completion');
           // 不做任何操作,保持停止状态
           break;
 
         case PlayMode.RANDOM: // 3: 随机播放
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: Auto-playing random next song');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Auto-playing random next song');
           await this.playRandomNext();
           break;
 
@@ -2961,7 +3086,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
     try {
       const playlist = this.playlistModel.getSongs();
       if (playlist.length <= 1) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: Not enough songs for random play');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Not enough songs for random play');
         return;
       }
 
@@ -3041,13 +3166,13 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
     // 增强防抖保护,特别是在APP前台运行时
     const now = Date.now();
     if (!forceUpdate && this.lastFormUpdateTime && (now - this.lastFormUpdateTime < 200)) {
-      LogUtils.getInstance().LOGI('UnifiedPlayerService updateAllForms: Skipping due to debounce protection (200ms)');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService updateAllForms: Skipping due to debounce protection (200ms)');
       return;
     }
     
     // 防抖和重入保护,防止短时间内重复执行更新
     if (this.isUpdatingForms && !forceUpdate) {
-      LogUtils.getInstance().LOGI('UnifiedPlayerService updateAllForms: Update already in progress, skipping.');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService updateAllForms: Update already in progress, skipping.');
       return;
     }
     
@@ -3058,7 +3183,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
 
       const context = this.getContext();
       if (!context) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService updateAllForms: No context available');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService updateAllForms: No context available');
         return;
       }
 
@@ -3068,7 +3193,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
       // 优化:立即获取卡片数据,优先响应UI
       const widgetData = await this.getWidgetFormData();
       if (!widgetData) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService updateAllForms: Failed to get widget data.');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService updateAllForms: Failed to get widget data.');
         return;
       }
 
@@ -3077,7 +3202,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
       // 等待Form列表获取完成
       const formInfoList = await formInfoListPromise;
       if (formInfoList.length === 0) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService updateAllForms: No forms found');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService updateAllForms: No forms found');
         return;
       }
 
@@ -3162,7 +3287,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
     };
 
     if (!formData) {
-      LogUtils.getInstance().LOGI('UnifiedPlayerService getWidgetFormData: No current song, returning default data.');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService getWidgetFormData: No current song, returning default data.');
       const defaultData: widgeData = {
         id: '',
         name: '未知歌曲',
@@ -3355,12 +3480,12 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
       }
 
       if (!context) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService saveWidgetDataToDatabase: No context available');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService saveWidgetDataToDatabase: No context available');
         return;
       }
 
       if (!formData || !formData.id) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService saveWidgetDataToDatabase: No valid current song');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService saveWidgetDataToDatabase: No valid current song');
         return;
       }
 
@@ -3513,7 +3638,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
   public async initializeWidgetDisplay(): Promise<void> {
     try {
       this.updateAllForms();
-      LogUtils.getInstance().LOGI('UnifiedPlayerService: Widget display initialized');
+      LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Widget display initialized');
     } catch (error) {
       LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Failed to initialize widget display: ${error}`);
     }
@@ -3606,14 +3731,14 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
   private doUpdateSessionPlayState(): void {
     try {
       if (!this.avSessionController) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession controller not initialized');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession controller not initialized');
         return;
       }
 
       // 避免过于频繁的更新(最小间隔1000ms,增加防抖时间)
       const now = Date.now();
       if (now - this.lastAvSessionUpdate < 1000) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: Skipping AVSession update due to rate limit');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Skipping AVSession update due to rate limit');
         return;
       }
 
@@ -3623,7 +3748,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
       
       // 添加数据一致性检查
       if (!currentSong) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: No current song available for AVSession update');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: No current song available for AVSession update');
         return;
       }
 
@@ -3723,7 +3848,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
   private async doUpdateAvSessionMetadata(song: VideoItem): Promise<void> {
     try {
       if (!this.avSessionController) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession controller not initialized');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession controller not initialized');
         return;
       }
 
@@ -3736,7 +3861,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
           song = currentSong;
           LogUtils.getInstance().LOGI(`UnifiedPlayerService: Using latest song data: ${song.name}`);
         } else {
-          LogUtils.getInstance().LOGI('UnifiedPlayerService: No current song available, skipping metadata update');
+          LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: No current song available, skipping metadata update');
           return;
         }
       }
@@ -3744,7 +3869,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
       // 减少防抖时间,提高响应速度
       const now = Date.now();
       if (now - this.lastAvMetadataUpdate < 300) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: Skipping AVSession metadata update due to rate limit');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Skipping AVSession metadata update due to rate limit');
         return;
       }
 
@@ -3993,7 +4118,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
   private async cleanupInvalidFormIds(): Promise<void> {
     try {
       if (!this.context) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService: No context for cleanup invalid form IDs');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: No context for cleanup invalid form IDs');
         return;
       }
       // 根据存储配置读取所有Form信息
@@ -4012,7 +4137,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
       }
 
       if (formInfoList.length === 0) {
-        LogUtils.getInstance().LOGI('UnifiedPlayerService cleanupInvalidFormIds: No forms found');
+        LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService cleanupInvalidFormIds: No forms found');
         return;
       }
 
@@ -4057,7 +4182,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
       // const formIds = await preferencesUtil.getFormIds(prefs);
       //
       // if (formIds.length === 0) {
-      //   LogUtils.getInstance().LOGI('UnifiedPlayerService: No form IDs to cleanup');
+      //   LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: No form IDs to cleanup');
       //   return;
       // }
       //

+ 51 - 14
entry/src/main/ets/view/LocalMusic.ets

@@ -876,6 +876,10 @@ export struct LocalMusic {
     this.volume = PreferencesUtil.getNumberSync('DefalutVolume', this.volume)
     this.isSwipe = PreferencesUtil.getBooleanSync(SettingPage.IS_SWIPE, false)
     this.openSkipSongAnimate = PreferencesUtil.getBooleanSync(SettingPage.OPEN_SKIPSONG_ANIMATE, true)
+    
+    // 添加缺失的设置初始化
+    this.isMusicMemoryPlay = PreferencesUtil.getBooleanSync(SettingPage.iS_MUSIC_MEMORY_PLAY, false)
+    this.isMusicBGCover = PreferencesUtil.getBooleanSync(SettingPage.iS_MUSIC_BG_COVER, true)
     //如果是hicar连接状态,这些都是false
     if(this.isHiCar()){
       this.isShowTitleBar = false//不显示导航栏
@@ -5004,6 +5008,10 @@ export struct LocalMusic {
 
         // 同步播放列表到UnifiedPlayerService
         this.unifiedPlayerService.syncPlaylistToService(this.songList, this.curIndex, this.playType);
+        
+        // 加载跳过头尾设置
+        this.loadJumpSettings();
+        
         // 强制播放特定歌曲
         this.playSpecificSong()
         break;
@@ -10285,6 +10293,42 @@ export struct LocalMusic {
   @State jumpEndTime: number = 0
   @State isOpenJump: boolean = false
 
+  // 加载跳过头尾设置
+  private loadJumpSettings() {
+    try {
+      if (this.modeType === 0) { // 文件夹
+        let parentPath = FileUtil.getParentPath(this.videoUrl)
+        this.jumpTopTime = PreferencesUtil.getNumberSync(parentPath + 'jumpTopTime', 0)
+        this.jumpEndTime = PreferencesUtil.getNumberSync(parentPath + 'jumpEndTime', 0)
+        this.isOpenJump = PreferencesUtil.getBooleanSync(parentPath + 'isOpenJump', false)
+      } else if (this.modeType === 1) { // 媒体库
+        this.jumpTopTime = PreferencesUtil.getNumberSync(1 + 'jumpTopTime', 0)
+        this.jumpEndTime = PreferencesUtil.getNumberSync(1 + 'jumpEndTime', 0)
+        this.isOpenJump = PreferencesUtil.getBooleanSync(1 + 'isOpenJump', false)
+      } else if (this.modeType === 2) { // 艺术家
+        if (this.currentSong?.artist) {
+          this.jumpTopTime = PreferencesUtil.getNumberSync(this.currentSong?.artist + 2 + 'jumpTopTime', 0)
+          this.jumpEndTime = PreferencesUtil.getNumberSync(this.currentSong?.artist + 2 + 'jumpEndTime', 0)
+          this.isOpenJump = PreferencesUtil.getBooleanSync(this.currentSong?.artist + 2 + 'isOpenJump', false)
+        }
+      } else if (this.modeType === 3) { // 专辑
+        if (this.currentSong?.album) {
+          this.jumpTopTime = PreferencesUtil.getNumberSync(this.currentSong?.album + 3 + 'jumpTopTime', 0)
+          this.jumpEndTime = PreferencesUtil.getNumberSync(this.currentSong?.album + 3 + 'jumpEndTime', 0)
+          this.isOpenJump = PreferencesUtil.getBooleanSync(this.currentSong?.album + 3 + 'isOpenJump', false)
+        }
+      }
+      
+      LogUtils.getInstance().LOGI(`Loaded jump settings: isOpen=${this.isOpenJump}, topTime=${this.jumpTopTime}s, endTime=${this.jumpEndTime}s for mode=${this.modeType}`);
+    } catch (error) {
+      LogUtils.getInstance().LOGI(`loadJumpSettings error: ${error}`);
+      // 发生错误时重置为默认值
+      this.jumpTopTime = 0;
+      this.jumpEndTime = 0;
+      this.isOpenJump = false;
+    }
+  }
+
   @Builder
   JumpTopEndSheet() {
     Scroll() {
@@ -12094,6 +12138,13 @@ export struct LocalMusic {
   //保持记忆播放功能
   private savePlaybackPosition() {
     try {
+      // 检查用户是否启用了记忆播放功能
+      const isMusicMemoryPlay = PreferencesUtil.getBooleanSync(SettingPage.iS_MUSIC_MEMORY_PLAY, false);
+      if (!isMusicMemoryPlay) {
+        LogUtils.getInstance().LOGI('记忆播放功能已关闭,跳过保存播放位置');
+        return; // 用户未启用,直接返回
+      }
+
       // 通过UnifiedPlayerService获取当前播放位置
       const currentState = this.unifiedPlayerService.getCurrentState();
       const position = currentState.currentPosition;
@@ -12113,21 +12164,7 @@ export struct LocalMusic {
     }
   }
 
-  //获取记忆播放功能
-  private restorePlaybackPosition() {
-    // 优先从AppStorage获取,如果没有则从PreferencesUtil获取
-    let position: number = AppStorage.get<number>(`playback_${this.videoUrl}`) || 0;
-    if (position === 0) {
-      position = PreferencesUtil.getNumberSync(this.videoUrl, 0);
-    }
 
-    // ToastUtil.showToast('position = ' + position)
-    if (position > 0) {
-      // ToastUtil.showToast('seekTo = ' + position)
-      this.seekTo(position + "");
-      LogUtils.getInstance().LOGI(`Restored playback position: ${position}ms for ${this.name}`);
-    }
-  }
 
   private async seekTo(value: string) {
     try {