介绍
的Vibrator班级没有您正在查找的isVibrating()
方法。它使用服务,因此您无法轻松覆盖Vibrator并添加额外的功能。
ManagedVibrator
下面,是一个ManagedVibrator类,它是为Vibrator类的包装。包括所有Vibrator方法,附加isVibrating()
方法。
具有接受long[] pattern
的签名的constant vibration methods很容易追踪,因为需要调用cancel()
来结束振动。但是,接受long millseconds
的签名的one time vibration methods要难以跟踪。
此实施方式使用ScheduledThreadPoolExecutor
来跟踪one time validation methods。它在one time vibration method完成后立即将mIsVibrating
标志设置为false
。
public class ManagedVibrator {
public static final String TAG = ManagedVibrator.class.getSimpleName();
private Context mContext;
private Vibrator mVibrator;
private boolean mIsVibrating = false;
private ScheduledThreadPoolExecutor mExecutor;
private Runnable mVibrationEndRunnable = new Runnable() {
@Override
public void run() {
setVibrating(false);
}
};
public ManagedVibrator(Context context) {
this.mContext = context;
mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
mExecutor = new ScheduledThreadPoolExecutor(1);
}
public boolean hasVibrator() {
return mVibrator.hasVibrator();
}
public void vibrate(long milliseconds) {
setVibrating(true);
mVibrator.vibrate(milliseconds);
notifyOnVibrationEnd(milliseconds);
}
// Requires API v21
public void vibrate(long milliseconds, AudioAttributes attributes) {
setVibrating(true);
mVibrator.vibrate(milliseconds, attributes);
notifyOnVibrationEnd(milliseconds);
}
public void vibrate(long[] pattern, int repeat) {
setVibrating(true);
mVibrator.vibrate(pattern, repeat);
}
// Requires API v21
public void vibrate(long[] pattern, int repeat, AudioAttributes attributes) {
setVibrating(true);
mVibrator.vibrate(pattern, repeat, attributes);
}
public void cancel() {
mVibrator.cancel();
setVibrating(false);
}
public boolean isVibrating() {
return mIsVibrating;
}
private void setVibrating(boolean isVibrating) {
mIsVibrating = isVibrating;
}
private void notifyOnVibrationEnd(long milliseconds) {
try {
mExecutor.schedule(mVibrationEndRunnable, milliseconds, TimeUnit.MILLISECONDS);
} catch (RejectedExecutionException e) {
Log.e(TAG, e.getMessage());
}
}
}
使用
ManagedVibrator vibrator = new ManagedVibrator(this);
vibrator.vibrate(5000);
...
if (vibrator.isVibrating()) {
// Do something
}
限制
- 您需要使用一个ManagedVibrator实例在你的应用
- ManagedVibrator只能告诉你关于你的应用程序发起的振动。 它不知道其他应用服务引起的震动。
- 很长振次或非常频繁的一次振动可能导致问题
我想,现在没有检查振动器是否振动的回调。 – TheLittleNaruto
当你说你想检查设备是否在振动时 - **你是否希望检查自己的应用程序是否在振动或其他应用程序/服务?** – Jamie
我想检查的是我的应用程序使其振动。 – user3586231