增加了 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;
|
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]);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user