2015-04-25 3 views
5

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

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

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

+1

Наверное, нет обратных вызовов для проверки вибрации вибратора на данный момент. – TheLittleNaruto

+0

Когда вы говорите, что хотите проверить, вибрирует ли устройство - ** вы хотите проверить, вибрирует ли ваше собственное приложение, или какие-либо другие приложения/службы? ** – Jamie

+0

Я хочу проверить, является ли мое приложение видоизмененным , – user3586231

ответ

1

Нет, вы не можете.

Тот же вопрос: here.

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

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

Подробнее:

-1

Введение

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 
} 

Ограничения

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

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

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

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

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

Для некорневых телефонов, вы можете просто проверить "dumpsys vibrator"Process выход с BufferedReader. Он обновляется после того, как вибратор будет вибрировать.