更新记录

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 必须与此一致)。

息屏保活手段

  1. startForeground 常驻低重要性静音通知,进程提升为前台优先级,息屏不被回收。
  2. PARTIAL_WAKE_LOCK 持锁,CPU 息屏不休眠,硬件波形 / Handler 轮次不中断。
  3. 音量 0 的无声循环音频(res/raw/vibrate_loop_silent.wav),阻止 Doze 音频空闲挂起。
  4. 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(),否则前台服务与震动会持续运行。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

震动 VIBRATE;前台服务 FOREGROUND_SERVICE 及 MEDIA_PLAYBACK(Android10+);唤醒锁 WAKE_LOCK;通知 POST_NOTIFICATIONS(Android13+);电池优化豁免 REQUEST_IGNORE_BATTERY_OPTIMIZATIONS

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

许可协议

MIT协议

暂无用户评论。