Обнаруживать устройство вибрирует?

Я использовал приведенный ниже код для вибрации устройства.

public void vibrator() { try { Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); vibrator.vibrate(5000); } catch (Exception e) { Log.d(TAG, "vibrator exception: " + e); } } 

Можем ли мы программно определить это событие (проверьте, что устройство вибрирует)?

    Нет, ты не можешь.

    Тот же вопрос здесь .

    Вы можете проверить, поддерживается ли вибрация устройства:

     Vibrator mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); boolean hasVibrator = mVibrator.hasVibrator(); 

    Узнать больше:

    • Android-вибратор

    Существует плохой способ для корневых телефонов, но вы получите по крайней мере что-то.

    Вы можете прочитать файл по адресу:

     "/sys/class/timed_output/vibrator/enable" 

    Он сохраняет время, оставшееся в течение микросекунды, когда устройство вибрирует. (Проверено 5.1)

    Для неиспользуемых телефонов вы можете просто проверить "dumpsys vibrator" с помощью BufferedReader . Он обновляется после вибрации вибратора.

    Введение

    Класс Vibrator не имеет isVibrating() который вы ищете. Он использует службы, поэтому вы не можете легко переопределить Вибратор и добавить дополнительные функции.

    ManagedVibrator

    Ниже приведен класс ManagedVibrator, который является оболочкой класса Vibrator . Все методы isVibrating() включены, с дополнительным isVibrating() .

    Способы постоянной вибрации с сигнатурами, которые принимают long[] pattern , легко отслеживаются, потому что cancel() необходимо вызвать для прекращения вибрации. Однако одноразовые вибрационные методы с сигнатурами, которые принимают long millseconds , намного сложнее отслеживать.

    Эта реализация использует ScheduledThreadPoolExecutor для отслеживания методов проверки времени . Он устанавливает флаг 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 } 

    Ограничения

    1. Вы должны использовать один экземпляр ManagedVibrator в своем приложении
    2. ManagedVibrator может только сообщать вам о вибрациях, инициированных вашим приложением. Он ничего не знает о вибрациях, вызванных другими приложениями услуг.
    3. Очень длительное время вибрации или очень частые однократные вибрации могут вызвать проблемы