MediaSession: setActionHandler() 方法
setActionHandler() 是 接口的一个方法,用于为媒体会话操作设置一个处理程序。这些操作允许 Web 应用在用户触发设备内置的物理或屏幕媒体控件(如播放、停止或跳转按钮)时接收通知。MediaSession
语法
setActionHandler(type, callback)
参数
type-
表示要监听的操作类型的字符串。它将是以下值之一:
hangup-
挂断电话。
nextslide-
切换到下一张幻灯片,当演示幻灯片时。
nexttrack-
将播放前进到下一曲。
pause-
暂停媒体播放。
play-
开始(或恢复)媒体播放。
previousslide-
切换到上一张幻灯片,当演示幻灯片时。
previoustrack-
将播放后退到上一曲。
seekbackward-
从当前位置向后跳转媒体。传递给回调函数的
seekOffset属性指定向后跳转的时间量。 seekforward-
从当前位置向前跳转媒体。传递给回调函数的
seekOffset属性指定向前跳转的时间量。 seekto-
将播放位置跳转到媒体中的指定时间。要跳转到的时间在传递给回调函数的
seekTime属性中指定。如果你打算连续执行多个seekto操作,你也可以将传递给回调函数的fastSeek属性设置为true。这会让浏览器知道它可以采取措施来优化重复操作,并可能提高性能。 skipad-
跳过当前正在播放的广告或宣传片。此操作可能可用,也可能不可用,具体取决于平台和 用户代理,或者由于订阅级别或其他情况而被禁用。
stop-
完全停止播放。
togglecamera-
开启或关闭用户的活动摄像头。
togglemicrophone-
静音或取消静音用户的麦克风。
-
开启或关闭用户的活动屏幕共享。
回调-
当指定的操作类型被调用时要调用的函数。回调函数不应返回值。回调函数接收一个包含以下属性的字典:
action-
表示操作类型的字符串。此属性允许单个回调函数处理多种操作类型。
fastSeek可选-
seekto操作可以*可选*包含此属性,它是一个布尔值,指示是否执行“快速”跳转。快速跳转是指在快速序列中执行的跳转,例如快进或快退媒体,快速跳过它。此属性可用于指示应使用最短可能的方法来跳转媒体。在这种情况下,fastSeek不会包含在跳转序列的最终操作中。 seekOffset可选-
如果
action是seekforward或seekbackward并且此属性存在,它是一个浮点值,表示要将播放位置向前或向后移动的秒数。如果此属性不存在,则这些操作应选择一个合理的默认跳转距离(例如 7 或 10 秒)。 seekTime可选-
如果
action是seekto,则此属性必须存在,并且必须是一个浮点值,表示要将播放位置跳转到的媒体中的绝对时间,其中 0 表示媒体的开始。此属性对于其他操作类型不存在。
返回值
无(undefined)。
描述
要删除先前设置的操作处理程序,请再次调用 setActionHandler(),并将 null 指定为 callback。
操作处理程序接收一个参数:一个对象,该对象同时提供了操作类型(因此同一个函数可以处理多种操作类型)以及执行操作所需的数据。
示例
为音乐播放器设置操作处理程序
此示例创建一个新的媒体会话,并为其分配操作处理程序(它们什么也不做)。
if ("mediaSession" in navigator) {
navigator.mediaSession.metadata = new MediaMetadata({
title: "Unforgettable",
artist: "Nat King Cole",
album: "The Ultimate Collection (Remastered)",
artwork: [
{
src: "https://dummyimage.com/96x96",
sizes: "96x96",
type: "image/png",
},
{
src: "https://dummyimage.com/128x128",
sizes: "128x128",
type: "image/png",
},
{
src: "https://dummyimage.com/192x192",
sizes: "192x192",
type: "image/png",
},
{
src: "https://dummyimage.com/256x256",
sizes: "256x256",
type: "image/png",
},
{
src: "https://dummyimage.com/384x384",
sizes: "384x384",
type: "image/png",
},
{
src: "https://dummyimage.com/512x512",
sizes: "512x512",
type: "image/png",
},
],
});
navigator.mediaSession.setActionHandler("play", () => {
/* Code excerpted. */
});
navigator.mediaSession.setActionHandler("pause", () => {
/* Code excerpted. */
});
navigator.mediaSession.setActionHandler("stop", () => {
/* Code excerpted. */
});
navigator.mediaSession.setActionHandler("seekbackward", () => {
/* Code excerpted. */
});
navigator.mediaSession.setActionHandler("seekforward", () => {
/* Code excerpted. */
});
navigator.mediaSession.setActionHandler("seekto", () => {
/* Code excerpted. */
});
navigator.mediaSession.setActionHandler("previoustrack", () => {
/* Code excerpted. */
});
navigator.mediaSession.setActionHandler("nexttrack", () => {
/* Code excerpted. */
});
navigator.mediaSession.setActionHandler("skipad", () => {
/* Code excerpted. */
});
navigator.mediaSession.setActionHandler("togglecamera", () => {
/* Code excerpted. */
});
navigator.mediaSession.setActionHandler("togglemicrophone", () => {
/* Code excerpted. */
});
navigator.mediaSession.setActionHandler("hangup", () => {
/* Code excerpted. */
});
}
以下示例为播放和暂停设置了两个函数,然后将它们用作相关操作处理程序的がコールバック。
const actionHandlers = [
// play
[
"play",
async () => {
// play our audio
await audioEl.play();
// set playback state
navigator.mediaSession.playbackState = "playing";
// update our status element
updateStatus(allMeta[index], "Action: play | Track is playing…");
},
],
[
"pause",
() => {
// pause out audio
audioEl.pause();
// set playback state
navigator.mediaSession.playbackState = "paused";
// update our status element
updateStatus(allMeta[index], "Action: pause | Track has been paused…");
},
],
];
for (const [action, handler] of actionHandlers) {
try {
navigator.mediaSession.setActionHandler(action, handler);
} catch (error) {
console.log(`The media session action "${action}" is not supported yet.`);
}
}
此示例使用适当的操作处理程序来允许在播放的媒体中向任一方向进行跳转。
navigator.mediaSession.setActionHandler("seekbackward", (evt) => {
// User clicked "Seek Backward" media notification icon.
let skipTime = evt.seekOffset || 10; // Time to skip in seconds
audio.currentTime = Math.max(audio.currentTime - skipTime, 0);
});
navigator.mediaSession.setActionHandler("seekforward", (evt) => {
// User clicked "Seek Forward" media notification icon.
let skipTime = evt.seekOffset || 10; // Time to skip in seconds
audio.currentTime = Math.min(audio.currentTime + skipTime, audio.duration);
});
要删除媒体操作处理程序,请将其设置为 null。
navigator.mediaSession.setActionHandler("nexttrack", null);
在一个处理程序函数中支持多个操作
如果您愿意,您也可以通过检查 action 属性的值来使用单个函数处理多种操作类型。
let skipTime = 7;
navigator.mediaSession.setActionHandler("seekforward", handleSeek);
navigator.mediaSession.setActionHandler("seekbackward", handleSeek);
function handleSeek(details) {
switch (details.action) {
case "seekforward":
audio.currentTime = Math.min(
audio.currentTime + skipTime,
audio.duration,
);
break;
case "seekbackward":
audio.currentTime = Math.max(audio.currentTime - skipTime, 0);
break;
}
}
在这里,handleSeek() 函数处理 seekbackward 和 seekforward 操作。
使用操作处理程序控制幻灯片演示
"previousslide" 和 "nextslide" 操作处理程序可用于处理幻灯片演示的前进和后退,例如当用户将演示文稿放入 画中画 窗口,并按下浏览器提供的控件来导航幻灯片时。
try {
navigator.mediaSession.setActionHandler("previousslide", () => {
log('> User clicked "Previous Slide" icon.');
if (slideNumber > 1) slideNumber--;
updateSlide();
});
} catch (error) {
log('Warning! The "previousslide" media session action is not supported.');
}
try {
navigator.mediaSession.setActionHandler("nextslide", () => {
log('> User clicked "Next Slide" icon.');
slideNumber++;
updateSlide();
});
} catch (error) {
log('Warning! The "nextslide" media session action is not supported.');
}
请参阅 演示幻灯片 / 媒体会话示例 以获取可用的示例。
规范
| 规范 |
|---|
| 媒体会话 # dom-mediasession-setactionhandler |
浏览器兼容性
加载中…