小程序上,如何实现播放课程不可以拖动,切到后台报警并停止播放? - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 小程序相关 >

小程序上,如何实现播放课程不可以拖动,切到后台报警并停止播放?

发表时间:2026-4-15

发布人:葵宇科技

浏览次数:0

在微信小程序实现课程视频不可拖动、切后台立即报警并停止播放,核心是:用 enable-progress-gesture="false" + 遮罩防拖动;监听 onHide 切后台,调用 pause() + 弹窗 / 震动报警;同时禁用小窗、禁止后台音频。下面是完整可直接复用的方案。
 

 

一、禁止拖动进度条(双重保险)

 

1. 原生 video 组件配置(WXML)

<video id="courseVideo" src="{{videoUrl}}" controls enable-progress-gesture="{{false}}" <!-- 禁止拖动手势 --> show-bottom-progress="{{true}}" <!-- 保留进度条显示 --> auto-pause-if-navigate="{{true}}" <!-- 跳转页面自动暂停 --> auto-pause-if-open-native="{{true}}" <!-- 跳微信原生页自动暂停 --> picture-in-picture-mode="none" <!-- 禁用画中画小窗 --> bindtimeupdate="onTimeUpdate" ></video> <!-- 遮罩层:覆盖进度条区域,防止误触拖动 --> <cover-view class="progress-mask"></cover-view>

2. 遮罩样式(WXSS)

.progress-mask { position: absolute; bottom: 0; left: 0; width: 100%; height: 60rpx; /* 覆盖进度条高度 */ background: rgba(0,0,0,0.01); /* 透明但可拦截点击 */ z-index: 999; }

3. 关键说明

 
  • enable-progress-gesture="false":官方属性,直接禁用进度条拖动。
  • 遮罩层:防止部分机型 / 版本下手势失效,双重保障。
  • picture-in-picture-mode="none":彻底关闭小窗,避免后台继续播放。
 

 

二、切后台报警 + 停止播放(核心逻辑)

 

 

1. 页面 JS 逻辑(.js)

Page({ data: { videoUrl: 'https://xxx.mp4', isPlaying: false }, onLoad() { // 获取视频上下文 this.videoCtx = wx.createVideoContext('courseVideo', this) }, // 监听切后台(最可靠) onHide() { if (this.data.isPlaying) { // 1. 立即停止播放 this.videoCtx.pause() this.setData({ isPlaying: false }) // 2. 触发报警:弹窗 + 震动 wx.showModal({ title: '警告', content: '课程不可后台播放,请返回前台继续学习', showCancel: false, confirmText: '知道了' }) wx.vibrateShort({ type: 'heavy' }) // 震动提醒 } }, // 监听切回前台(可选:自动续播) onShow() { // 可根据业务决定是否自动续播 // this.videoCtx.play() }, // 监听播放状态更新 onTimeUpdate(e) { this.setData({ isPlaying: true }) } })

 

2. 全局禁用后台音频(app.json)

 

 

防止视频音频在后台偷偷播放:
 
{ "enableBackgroundAudio": false }
 

三、进阶加固(防作弊)

 

1. 禁止全屏拖动

<video ... vslide-gesture="{{false}}" <!-- 非全屏禁止亮度/音量滑动 --> vslide-gesture-in-fullscreen="{{false}}" <!-- 全屏也禁止 --> ></video>

2. 监听页面卸载(onUnload)

onUnload() { this.videoCtx.stop() // 彻底停止并释放资源 }

3. 服务端校验(推荐)

 
  • 前端上报播放时长 / 进度,服务端校验是否连续。
  • 若出现跳变或后台时长异常,标记为异常学习记录。
 

 

 

四、UniApp 适配(若用 UniApp)

<template> <view> <video id="courseVideo" :src="videoUrl" controls :enable-progress-gesture="false" :picture-in-picture-mode="'none'" ></video> <cover-view class="progress-mask"></cover-view> </view> </template> <script> export default { onHide() { const videoCtx = uni.createVideoContext('courseVideo', this) videoCtx.pause() uni.showModal({ title: '警告', content: '不可后台播放' }) uni.vibrateShort() } } </script>

五、常见问题

 
  1. 部分机型仍可拖动:确保 enable-progress-gesturefalse + 遮罩层覆盖到位。
  2. 切后台不触发 onHide:检查是否开启了后台音频 / 小窗,需全部禁用。
  3. 报警不生效wx.showModal 必须在 onHide 中同步调用,不可异步。
 

 

六、完整流程总结

 

 

  1. 配置 video 组件:禁用拖动、禁用小窗、自动暂停。
  2. 加遮罩层:覆盖进度条,防止误触。
  3. 监听 onHide:暂停播放 + 弹窗报警 + 震动。
  4. 全局禁用后台音频,彻底杜绝后台播放。
  5. (可选)服务端校验,防止前端作弊。

相关案例查看更多