使用Vibrator设置震动模式重复3次但设备无限震动如何解决
问题原因
你对Vibrator.vibrate()方法的第二个参数用法理解有误:
- 该参数不是重复执行的次数,而是指定循环震动时,从
pattern数组的哪个下标位置开始重复 - 当传入≥0的数值时,系统会无限循环震动,只有传入
-1时才代表只执行一次pattern,不循环
你现在传入了3,系统会一直从pattern的索引3位置开始循环执行,所以会出现无限震动的问题。
解决方法
要实现pattern重复3次、总震动6次的效果,有两种常用方案:
方案1:直接构造包含完整3次循环的pattern数组
你的原始pattern单次包含2次震动(2000ms震、1000ms停、2000ms震、1000ms停),重复3次直接拼接数组即可:
private void deviceVibration (){ // 拼接3次完整的震动停顿逻辑,开头保留0ms启动延迟 long[] pattern = {0, 2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000}; // 第二个参数传-1,只执行一次完整pattern就自动停止 vibrator.vibrate(pattern, -1); }
方案2:用延时任务控制震动停止(适配长pattern场景)
如果pattern本身很长不想拼接,可以计算3次循环的总时长,到点后主动取消震动:
private void deviceVibration (){ long[] pattern = {0, 2000, 1000, 2000,1000}; int repeatCount = 3; // 计算单次pattern总时长:2000+1000+2000+1000=6000ms long totalDuration = 6000 * repeatCount; // 从pattern起始位置开始循环震动 vibrator.vibrate(pattern,0); // 达到总时长后取消震动 new Handler(Looper.getMainLooper()).postDelayed(() -> { vibrator.cancel(); }, totalDuration); }
注意事项
- 需要在AndroidManifest.xml中申请震动权限:
<uses-permission android:name="android.permission.VIBRATE" /> - Android 12及以上系统推荐使用
VibratorManager替代旧的Vibrator接口,核心逻辑一致
内容的提问来源于stack exchange,提问作者zon1k
相关产品推荐
相关产品推荐

