Android无法通过VIBRATOR_SERVICE cancel()取消振动



信息:Android编译SDK 33设备:像素6

问题:我在使用VIBRATOR_SERVICE时有麻烦。我所要做的就是在运行时取消和激活振动,并启动一个新的振动命令(具有不同的强度/持续时间)

例子:

  1. 正如你所期望的,这段代码震动我的设备1秒:
// create vibrator instance
Vibrator vib = (Vibrator) MainActivity.this.getSystemService(Context.VIBRATOR_SERVICE);
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_GAME)
.build();
// vibrate for 20 seconds (unless cancelled)
vib.vibrate(20000, audioAttributes);
// wait 1 second and then cancel the vibrator
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
Log.e("TAG", "Cancel Vibration");
vib.cancel();
}
}, 1000);
  1. 现在问题来了。这个代码会震动我的设备20秒。为什么这不会震动设备1秒钟?
// create vibrator instance
Vibrator vib = (Vibrator) MainActivity.this.getSystemService(Context.VIBRATOR_SERVICE);
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_GAME)
.build();
// vibrate for 20 seconds (unless cancelled)
vib.vibrate(20000, audioAttributes);
// ============== NEW CODE HERE ================
vib.cancel(); // cancel the active vibration at any point
vib.vibrate(20000, audioAttributes); // start a new vibrate command
// =============== END NEW CODE ================
// wait 1 second and then cancel the vibrator
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
Log.e("TAG", "Cancel Vibration");
vib.cancel();
}
}, 1000);

我在这里错过了什么?取消主动振动并开始新振动的正确方法是什么?当我第一次取消它时,我似乎失去了取消任何未来振动命令的能力。希望这是一些简单的东西,我错过了,谢谢你的帮助!

Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// Vibrate for 500 milliseconds
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
v.vibrate(VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE));
} else {
//deprecated in API 26 
v.vibrate(500);
}
v.cancel();//For stop vibrator

最新更新