增加了 Duration 检查:在 updateMediaSessionPosition 函数中,现在会先判断 duration 是否为有效的正数。如果 duration <= 0,则不再调用 setPositionState,避免触发浏览器的错误行为。
移除了错误的重置调用:删除了在切歌或清空播放时调用的 setPositionState({ duration: 0 ... })。根据 Media Session API 规范,duration 必须为正数,传入 0 往往是导致 Firefox 隐藏通知栏控制条的主要原因。
This commit is contained in:
12
index.html
12
index.html
@@ -1152,14 +1152,20 @@
|
||||
if (typeof navigator.mediaSession.setPositionState !== 'function') return;
|
||||
const audio = audioRef.current;
|
||||
if (!audio) return;
|
||||
|
||||
const duration = resolveDurationSeconds(audio, currentSongRef.current);
|
||||
|
||||
// 兼容性修复:duration 必须为正有限数,否则某些浏览器(如 Firefox)会隐藏通知栏或报错
|
||||
if (!Number.isFinite(duration) || duration <= 0) return;
|
||||
|
||||
const position = Number.isFinite(audio.currentTime) ? audio.currentTime : 0;
|
||||
const playbackRate = Number.isFinite(audio.playbackRate) ? audio.playbackRate : 1;
|
||||
|
||||
try {
|
||||
navigator.mediaSession.setPositionState({
|
||||
duration: duration,
|
||||
playbackRate: playbackRate,
|
||||
position: duration > 0 ? Math.min(position, duration) : position
|
||||
position: Math.min(position, duration)
|
||||
});
|
||||
} catch (e) {}
|
||||
};
|
||||
@@ -1245,10 +1251,10 @@
|
||||
]
|
||||
});
|
||||
// Reset position state when song changes
|
||||
try { navigator.mediaSession.setPositionState({ duration: 0, playbackRate: 1, position: 0 }); } catch(e) {}
|
||||
// 注意:不要调用 setPositionState({ duration: 0 }),因为规范要求 duration 必须为正数
|
||||
// 错误的调用可能导致 Firefox 等浏览器隐藏播放控件
|
||||
} else {
|
||||
navigator.mediaSession.metadata = null;
|
||||
try { navigator.mediaSession.setPositionState({ duration: 0, playbackRate: 1, position: 0 }); } catch(e) {}
|
||||
}
|
||||
}, [currentSong]);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user