|
|
@@ -3,7 +3,7 @@ import { PlayerManager, IPlayerManager, PlayerStateCallback } from './PlayerMana
|
|
|
import { PlayerStateModel, PlayerState, PlayerStateListener, PlayMode, PlayerError, PlayerErrorType } from './PlayerStateModel';
|
|
|
import { PlaylistModel } from './PlaylistModel';
|
|
|
import { PlayProgress, WidgetData, WidgetSize, WidgetTheme } from '../widget/WidgetTypes';
|
|
|
-import { IjkMediaPlayer, LogUtils } from '@ohos/ijkplayer';
|
|
|
+import { IjkMediaPlayer, LogUtils, InterruptEvent, InterruptHintType } from '@ohos/ijkplayer';
|
|
|
import { common } from '@kit.AbilityKit';
|
|
|
import { PreferencesUtil, StrUtil } from '@pura/harmony-utils';
|
|
|
import { DataPersistenceService, PlaylistSyncService, PlaylistSyncListener, IDataPersistenceService, PlaylistData,
|
|
|
@@ -148,6 +148,12 @@ export interface IPlayerService {
|
|
|
* @returns
|
|
|
*/
|
|
|
isAllServicesReady(): boolean;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理音频中断事件
|
|
|
+ * @param event 音频中断事件
|
|
|
+ */
|
|
|
+ handleAudioInterrupt(event: InterruptEvent): Promise<void>;
|
|
|
/**
|
|
|
* 等待服务就绪
|
|
|
* @param maxWaitMs 最大等待时间(毫秒),默认为-1(无限等待)
|
|
|
@@ -311,6 +317,10 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 初始化PlaylistModel的MediaTable
|
|
|
this.playlistModel.initializeMediaTable(context);
|
|
|
|
|
|
+ // 设置音频中断监听
|
|
|
+ // 音频中断处理已移至LocalMusic中,响应更快
|
|
|
+ // this.setupAudioInterruptListener();
|
|
|
+
|
|
|
// 设置同步监听器
|
|
|
this.playlistSync.addSyncListener(this);
|
|
|
this.stateSync.subscribeToStateChanges(this);
|
|
|
@@ -2264,6 +2274,75 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
// ==================== 私有辅助方法 ====================
|
|
|
|
|
|
+ /**
|
|
|
+ * 设置音频中断监听器
|
|
|
+ */
|
|
|
+ private setupAudioInterruptListener(): void {
|
|
|
+ try {
|
|
|
+ const ijkPlayer = this.playerManager.getIjkPlayer();
|
|
|
+ if (ijkPlayer) {
|
|
|
+ ijkPlayer.on('audioInterrupt', (event: InterruptEvent) => {
|
|
|
+ this.handleAudioInterrupt(event);
|
|
|
+ });
|
|
|
+ LogUtils.getInstance().LOGI('UnifiedPlayerService: Audio interrupt listener set up successfully');
|
|
|
+ } else {
|
|
|
+ LogUtils.getInstance().LOGI('UnifiedPlayerService: Failed to set up audio interrupt listener - no player instance');
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Error setting up audio interrupt listener: ${error.message}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理音频中断事件
|
|
|
+ */
|
|
|
+ async handleAudioInterrupt(event: InterruptEvent): Promise<void> {
|
|
|
+ try {
|
|
|
+ LogUtils.getInstance().LOGI(`onecold 与其他应用音频冲突 被截断点event: ${JSON.stringify(event)}`);
|
|
|
+
|
|
|
+ // 首先保存当前播放位置
|
|
|
+ await this.savePlaybackPosition();
|
|
|
+
|
|
|
+ switch (event.hintType) {
|
|
|
+ case InterruptHintType.INTERRUPT_HINT_PAUSE:
|
|
|
+ LogUtils.getInstance().LOGI('UnifiedPlayerService: Audio interrupt - pausing playback');
|
|
|
+ await this.pause();
|
|
|
+ break;
|
|
|
+
|
|
|
+ case InterruptHintType.INTERRUPT_HINT_RESUME:
|
|
|
+ LogUtils.getInstance().LOGI('UnifiedPlayerService: Audio interrupt - resuming playback');
|
|
|
+ await this.startPlayOrResumePlay();
|
|
|
+ break;
|
|
|
+
|
|
|
+ case InterruptHintType.INTERRUPT_HINT_STOP:
|
|
|
+ LogUtils.getInstance().LOGI('UnifiedPlayerService: Audio interrupt - stopping playback');
|
|
|
+ await this.stop();
|
|
|
+ break;
|
|
|
+
|
|
|
+ case InterruptHintType.INTERRUPT_HINT_DUCK:
|
|
|
+ LogUtils.getInstance().LOGI('UnifiedPlayerService: Audio interrupt - ducking (lowering volume)');
|
|
|
+ // 可以实现音量降低逻辑
|
|
|
+ break;
|
|
|
+
|
|
|
+ case InterruptHintType.INTERRUPT_HINT_UNDUCK:
|
|
|
+ LogUtils.getInstance().LOGI('UnifiedPlayerService: Audio interrupt - unducking (restoring volume)');
|
|
|
+ // 可以实现音量恢复逻辑
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Unknown audio interrupt hint type: ${event.hintType}`);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 通知状态变化
|
|
|
+ await this.updatePlaylistStateInModel();
|
|
|
+ await this.broadcastCurrentState();
|
|
|
+
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Error handling audio interrupt: ${error.message}`);
|
|
|
+ await this.handlePlaybackError(error as Error, PlayerErrorType.AUDIO_INTERRUPT_ERROR);
|
|
|
+ }
|
|
|
+ }
|
|
|
/**
|
|
|
* 更新状态模型中的播放列表状态
|
|
|
*/
|