我使用下面的代码来振动设备。
public void vibrator() {
try {
Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(5000);
} catch (Exception e) {
Log.d(TAG, "vibrator exception: " + e);
}
}
我们能否以编程方式检测此事件(检查是设备振动)?
答案 0 :(得分:2)
不,你不能。
同样的问题是here。
您只能检查设备振动是否受支持:
Vibrator mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
boolean hasVibrator = mVibrator.hasVibrator();
查看更多内容:
答案 1 :(得分:2)
Vibrator类没有您要查找的isVibrating()
方法。它使用服务,因此您无法轻松覆盖Vibrator并添加额外功能。
下面是一个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
}
答案 2 :(得分:0)
对于有根电话的手机来说,这是一种糟糕的方式,但你至少会得到一些东西。
您可以在以下位置阅读该文件:
"/sys/class/timed_output/vibrator/enable"
它将设备振动时留下的时间保存为微秒。 (试过5.1)
对于无根电话,您只需使用Process检查"dumpsys vibrator"
BufferedReader输出即可。
一旦振动器完成振动,它就会更新。