增加了 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;
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]);