Введение
Vibrator Класс не указан isVibrating()
, который вы ищите. Он использует службы, поэтому вы не можете легко переопределить Vibrator и добавить дополнительные функции.
ManagedVibrator
Ниже, является ManagedVibrator класс, который является оболочкой для Vibrator класса. Все методы Vibrator включены, с дополнительным методом isVibrating()
.
constant vibration methods с подписями, которые принимают long[] pattern
, просты в отслеживании, так как необходимо называть cancel()
, чтобы положить конец вибрации. Тем не менее, one time vibration methods с подписями, которые принимают long millseconds
, намного сложнее отслеживать.
Эта реализация использует ScheduledThreadPoolExecutor
для отслеживания one time validation methods. Он устанавливает флаг mIsVibrating
в false
сразу после завершения one time vibration method.
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