更新记录
3.8.0(2026-11-15) 下载此版本
- 回退本地 HTTP 触发服务与 JS 轮询,仅保留保活与震动核心
- 删除 VibrateHttpServer.kt 与项目 utils/httpVibratePoll.js
- VibrateConfig 移除 httpServer* 字段;VibrateForegroundService 移除 applyHttpServerState 及服务启停
- UTS 移除 startHttpServer/stopHttpServer/isHttpServerRunning/getHttpServerStatus 与 HttpServerStatus 类型
- Manifest/config.json 移除 INTERNET、ACCESS_NETWORK_STATE 权限与 usesCleartextTraffic
- 测试页移除本地服务与轮询卡片、相关 data/方法/样式
- 保留:前台服务 + WakeLock + 无声循环音频 + 设备管理员 + 震动(短/长/节奏/亮屏告警)
平台兼容性
uni-app(5.34)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | - | - | - | - | - | - | - | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
fengyu-vibrate
Kotlin 原生 Android 震动插件。震动执行与息屏保活全部下沉到原生 .kt,UTS(index.uts)仅作参数校验与桥接。息屏长震动采用行业通用的前台服务保活方案(常驻提醒通知 + CPU 唤醒锁 + 无声循环音频 + START_STICKY 受控拉起),由本插件完全自包含实现,支持锁屏/后台下的长震动与短促震动,可自定义时长、振幅、节奏循环。
架构(UTS ↔ Kotlin)
index.uts (薄桥接: 参数校验 / 服务启停 / 回调登记)
│ 同包 Kotlin 类编译期全局可见,直接按类名引用(不可 import './Xxx.kt')
▼
VibrateApp 应用上下文持有者(幂等 init / requireContext)
VibrateConfig 提醒通知/无声循环/CPU 锁/任务计数 配置单例
VibrateCallbackBridge pattern 完成回调桥(Kotlin object,单槽)
VibrateManager 震动核心:fireOnce / launchPattern / cancelPattern / cancelAll
VibrateForegroundService 锁屏长震动前台服务:提醒通知 + CPU 锁 + 无声循环 + START_STICKY
VibratePermission 权限引导:电池优化豁免 / 厂商自启动 / 通知权限
原生统一包名:uts.sdk.modules.fengyuVibrate(由插件 id fengyu-vibrate 去连字符转驼峰,UTS 编译器强制生成,手写 .kt 必须与此一致)。
息屏保活手段
startForeground常驻低重要性静音通知,进程提升为前台优先级,息屏不被回收。PARTIAL_WAKE_LOCK持锁,CPU 息屏不休眠,硬件波形 / Handler 轮次不中断。- 音量 0 的无声循环音频(
res/raw/vibrate_loop_silent.wav),阻止 Doze 音频空闲挂起。 onStartCommand返回START_STICKY,onTaskRemoved受控拉起;任务清空后由 UTS 下发ACTION_EXIT_FOREGROUND自动释放锁/音频/通知并停服。
依赖与权限
- 最低 Android 5.0(API21);时长/振幅能力需 API26+(Android 8+)。
- 第三方依赖:
androidx.core:core-ktx(NotificationCompat / ActivityCompat)。 - 权限:
VIBRATE、FOREGROUND_SERVICE、FOREGROUND_SERVICE_MEDIA_PLAYBACK、FOREGROUND_SERVICE_SPECIAL_USE、WAKE_LOCK、POST_NOTIFICATIONS(13+)、REQUEST_IGNORE_BATTERY_OPTIMIZATIONS。 - 国产 ROM 需引导用户授予自启动、电池优化豁免、通知权限,锁屏长震动才稳定。
系统版本适配(前台服务类型)
Android 10(API29)起强制前台服务类型且必须与清单声明一致,否则 SecurityException。本插件按版本自动切换,无需业务处理:
| 系统 | 前台服务类型 | 说明 |
|---|---|---|
| Android 5.0–9(21–28) | 不传类型 | 两参 startForeground(id, notification) |
| Android 10–13(29–33) | mediaPlayback |
本服务确有无声 MediaPlayer 循环,类型合法 |
| Android 14+(34+) | specialUse |
配 PROPERTY_SPECIAL_USE_FGS_SUBTYPE 声明 |
- 清单以
mediaPlayback|specialUse组合声明,旧系统自动忽略未知标志;运行时由VibrateForegroundService.pickForegroundServiceType()按 SDK 显式传值。 - Android 12(API31)+ 后台启动前台服务受限,可能抛
ForegroundServiceStartNotAllowedException;授予电池优化豁免可豁免,代码已 try-catch 兜底不崩溃。 - Android 13(API33)通知需运行时授权,用
guideNoticePermission()引导。 - Android 11(API30)及以下无单独自启动检测 API,国产机型统一用
guideAutoStart()引导。
震动 API
| 方法 | 说明 |
|---|---|
vibrateShort(options?) |
短促震动,默认 40ms |
vibrateLong(options?) |
长震动,默认 400ms,可自定义时长 |
startVibratePattern(options) |
自定义节奏,repeat: -1 无限循环 |
stopVibrate(patternId?) |
停止指定或全部震动 |
isVibrating() |
是否有运行中的节奏任务 |
getVibrateCapabilities() |
设备能力快照(含前台服务状态) |
所有震动方法为同步调用(对齐传统 uni-app UTS 编译器),直接返回 VibrateResult,errCode === 0 表示系统已接受。
权限引导 API(锁屏长震动稳定性前提)
| 方法 | 说明 |
|---|---|
getVibratePermissionSnapshot() |
权限快照:电池豁免/通知/国内厂商/自启动入口/是否全就绪 |
isBatteryOptimizationExempted() |
是否已豁免电池优化 |
guideBatteryOptimization() |
拉起电池优化豁免授权,返回 VibratePermResult |
isDomesticBrand() |
是否国内厂商(需重点引导自启动) |
hasAutoStartEntry() |
是否存在已知可跳转的自启动设置页 |
guideAutoStart() |
跳转厂商自启动页,无匹配页回退应用详情页 |
isNoticeAllowed() |
通知权限是否已授予 |
guideNoticePermission() |
13+ 弹运行时授权框,低版本降级通知设置页 |
openNoticeSettings() |
跳转系统通知设置页 |
openVibrateAppDetail() |
打开应用详情页(自启动/电池手动设置统一入口) |
VibratePermResult = { success, granted, message }:仅打开设置页时 granted=false,需用户操作后用 getVibratePermissionSnapshot() 回查。
前端调用
import {
vibrateShort,
vibrateLong,
startVibratePattern,
stopVibrate,
getVibrateCapabilities,
getVibratePermissionSnapshot,
guideBatteryOptimization,
guideAutoStart,
guideNoticePermission
} from '@/uni_modules/fengyu-vibrate'
// 短震(自动拉起原生前台服务,锁屏可触发)
await vibrateShort()
await vibrateShort({ amplitude: 128 })
// 长震:自定义 3 秒
await vibrateLong({ duration: 3000 })
// 延迟 1 秒后长震 2 秒、半幅
await vibrateLong({ delay: 1000, duration: 2000, amplitude: 128 })
// 节奏:震 200ms → 停 300ms → 震 500ms,无限循环(闹钟/强提醒)
const res = await startVibratePattern({
segments: [
{ duration: 200 },
{ delay: 300, duration: 500, amplitude: 200 }
],
repeat: -1,
onComplete: () => console.log('有限次数播放完成')
})
console.log('patternId', res.patternId)
// 停止
await stopVibrate(res.patternId)
await stopVibrate() // 停止全部并回收前台服务
一键权限引导(建议在开启锁屏长震动前调用)
function ensureVibratePermissions() {
const p = getVibratePermissionSnapshot()
if (!p.batteryOptimizationExempted) {
guideBatteryOptimization() // 1. 电池优化豁免:防 Doze 杀前台服务
}
if (!p.noticeAllowed) {
guideNoticePermission() // 2. 通知权限:Android13+ 前台服务通知前提
}
if (p.domesticBrand && p.hasAutoStartEntry) {
guideAutoStart() // 3. 厂商自启动:无系统 API 检测,跳转后手动开启
}
return getVibratePermissionSnapshot().allReady
}
直接调用原生(Kotlin)
同包 Kotlin 类在 UTS 编译期全局可见,直接写类名即可,禁止 import './Xxx.kt'(uts-loader 无法解析 .kt 模块,会报 index not found):
// 无需任何 import,直接用类名
VibrateApp.init(UTSAndroid.getAppContext()!)
VibrateManager.fireOnce(0, 400, 255) // delayMs/durationMs/amplitude
VibrateManager.launchPattern(id, timings, amps, -1, roundMs) // 无限波形
VibrateManager.cancelPattern(id)
VibrateManager.cancelAll()
VibrateForegroundService.foregroundActive // 前台服务状态
参数
VibrateOptions
| 字段 | 类型 | 说明 |
|---|---|---|
| duration | number | 时长 ms,短震默认 40 / 长震默认 400,上限 60000 |
| delay | number | 触发前延迟 ms,默认 0 |
| amplitude | number | 振幅 1-255,仅 API26+,默认 255 |
VibratePatternOptions
| 字段 | 类型 | 说明 |
|---|---|---|
| segments | VibrateSegment[] | 必填,每段 { delay?, duration, amplitude? } |
| repeat | number | 1 一次 / N 次 / -1 无限循环,默认 1 |
| patternId | string | 自定义任务标识,不传自动生成 |
| onComplete | () => void | 有限次数播放完成回调 |
错误码
| 错误码 | 说明 |
|---|---|
| 9070002 | 震动参数无效 |
| 9070003 | 设备没有可用震动器 |
| 9070004 | 系统拒绝或执行失败 |
| 9070005 | 指定任务不存在 |
注意:无限循环(
repeat: -1)务必在业务结束或页面卸载时调用stopVibrate(),否则前台服务与震动会持续运行。

收藏人数:
下载插件并导入HBuilderX
赞赏(0)
下载 0
赞赏 0
下载 12765524
赞赏 1959
赞赏
京公网安备:11010802035340号