增加了 Duration 检查:在 updateMediaSessionPosition 函数中,现在会先判断 duration 是否为有效的正数。如果 duration <= 0,则不再调用 setPositionState,避免触发浏览器的错误行为。

移除了错误的重置调用:删除了在切歌或清空播放时调用的 setPositionState({ duration: 0 ... })。根据 Media Session API 规范,duration 必须为正数,传入 0 往往是导致 Firefox 隐藏通知栏控制条的主要原因。
This commit is contained in:
史悦
2026-01-06 16:04:24 +08:00
parent 9a220dfe78
commit 6b182ceba8

View File

@@ -1152,14 +1152,20 @@
if (typeof navigator.mediaSession.setPositionState !== 'function') return; if (typeof navigator.mediaSession.setPositionState !== 'function') return;
const audio = audioRef.current; const audio = audioRef.current;
if (!audio) return; if (!audio) return;
const duration = resolveDurationSeconds(audio, currentSongRef.current); 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 position = Number.isFinite(audio.currentTime) ? audio.currentTime : 0;
const playbackRate = Number.isFinite(audio.playbackRate) ? audio.playbackRate : 1; const playbackRate = Number.isFinite(audio.playbackRate) ? audio.playbackRate : 1;
try { try {
navigator.mediaSession.setPositionState({ navigator.mediaSession.setPositionState({
duration: duration, duration: duration,
playbackRate: playbackRate, playbackRate: playbackRate,
position: duration > 0 ? Math.min(position, duration) : position position: Math.min(position, duration)
}); });
} catch (e) {} } catch (e) {}
}; };
@@ -1245,10 +1251,10 @@
] ]
}); });
// Reset position state when song changes // Reset position state when song changes
try { navigator.mediaSession.setPositionState({ duration: 0, playbackRate: 1, position: 0 }); } catch(e) {} // 注意:不要调用 setPositionState({ duration: 0 }),因为规范要求 duration 必须为正数
// 错误的调用可能导致 Firefox 等浏览器隐藏播放控件
} else { } else {
navigator.mediaSession.metadata = null; navigator.mediaSession.metadata = null;
try { navigator.mediaSession.setPositionState({ duration: 0, playbackRate: 1, position: 0 }); } catch(e) {}
} }
}, [currentSong]); }, [currentSong]);