uni.getAccelerometerFrequency无反应是因为它仅设置频率,需配合uni.startAccelerometer()启动并用uni.onAccelerometerChange监听;H5不支持,真机调试须用iOS/Android设备。

uni.getAccelerometerFrequency 为什么调用没反应
因为这个 API 不是直接返回数据,它只负责设置采集频率,真正读取要靠 uni.onAccelerometerChange 监听。很多人写了 uni.getAccelerometerFrequency 就以为“启动了”,结果监听函数压根没触发——根本没开监听。
- 必须先调用
uni.startAccelerometer(),否则uni.onAccelerometerChange不会收到任何数据 -
uni.getAccelerometerFrequency是异步接口,需用success回调确认是否设置成功(iOS 最高支持 100Hz,Android 通常 50Hz,设太高会静默降级) - H5 端不支持该系列 API,真机调试务必用 iOS 或 Android 设备,模拟器无效
摇一摇逻辑怎么写才不容易误触发
直接比对加速度绝对值很容易被走路、放手机、按屏幕等动作干扰。关键不是“动得大”,而是“动得快且方向突变”——也就是加速度变化率(jerk)。
- 缓存最近 3–5 帧的
x/y/z值,算每帧与前一帧的差值平方和:(dx² + dy² + dz²) - 只在差值平方和连续 2–3 帧超过阈值(比如 15–25)时才记为一次“抖动”,再累计抖动次数
- 加防抖:一次摇一摇判定后,清空缓存并停用监听 800ms,避免连续触发
- 别用
Math.abs(x) > 1.5这种单轴判断,躺着摇、侧着摇、边走边摇都会漏判或误判
uni.onAccelerometerChange 在页面卸载后还在执行?
这是典型内存泄漏:监听没关,页面跳走了,回调却还挂着,不仅耗电,还可能报错 Cannot read property 'xxx' of null。
- 必须在
onUnload或onHide钩子中调用uni.offAccelerometerChange - 推荐封装成可取消的监听:
const handle = res => { /* 处理逻辑 */ }<br>uni.onAccelerometerChange(handle)<br>// 卸载时:<br>uni.offAccelerometerChange(handle) - 如果用了
uni.startAccelerometer,对应也要uni.stopAccelerometer,不然后台持续采样
Android 上偶尔收不到数据或延迟高
不是代码问题,是系统层限制:Android 8.0+ 对后台传感器访问做了收紧,且不同厂商对 startAccelerometer 的实现差异极大。
- 确保
manifest.json中已开启"usingComponents": true和必要权限(虽然加速度计不需要 manifest 权限,但部分厂商 ROM 会连带检查) - 避免在
onLaunch全局启动,优先在页面onShow启动,onHide停止 - 实测发现:华为/小米部分机型在省电模式下会强制降频到 5Hz 甚至暂停,建议加个 fallback 提示:“请关闭省电模式以获得更好体验”
陀螺仪数据本身不可靠,尤其低端 Android 机型;摇一摇本质是信号处理问题,不是调个 API 就完事。采样频率、滤波策略、设备兼容性,三者缺一不可。











