2015-04-25 14 views
5

Ho usato il codice seguente per far vibrare il dispositivo.Rileva il dispositivo sta vibrando?

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

È possibile rilevare questo evento a livello di codice (controllare la vibrazione del dispositivo)?

+1

Immagino che non ci siano richiami per verificare se il vibratore sta vibrando per ora. – TheLittleNaruto

+0

Quando dici di voler controllare se il dispositivo sta vibrando - ** vuoi controllare se la tua app lo sta facendo vibrare, o qualsiasi altra applicazione/servizio? ** – Jamie

+0

voglio controllare se la mia applicazione lo fa vibrare . – user3586231

risposta

1

No, non è possibile.

La stessa domanda è here.

È possibile controllare solo se il dispositivo vibrante è supportato:

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

guarda anche:

-1

Introduzione

Il 012.360.629 La classenon ha il metodo isVibrating() che stai cercando. Utilizza i servizi, quindi non è possibile ignorare facilmente Vibrator e aggiungere la funzionalità aggiuntiva.

ManagedVibrator

Qui di seguito, è una classe ManagedVibrator che è un wrapper per la classe Vibrator. Sono inclusi tutti i metodi Vibrator, con il metodo aggiuntivo isVibrating().

Il constant vibration methods con firme che accettano long[] pattern è facile da tracciare perché cancel() deve essere chiamato per terminare la vibrazione. Tuttavia, lo one time vibration methods con firme che accettano long millseconds è molto più difficile da tracciare.

Questa implementazione utilizza un ScheduledThreadPoolExecutor per tracciare one time validation methods. Imposta il flag mIsVibrating su false subito dopo il 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()); 
     } 
    } 

} 

utilizzo

ManagedVibrator vibrator = new ManagedVibrator(this); 
vibrator.vibrate(5000); 
... 
if (vibrator.isVibrating()) { 
    // Do something 
} 

Limitazioni

  1. È necessario utilizzo esempio uno ManagedVibrator nell'applicazione
  2. ManagedVibrator può dire solo di vibrazioni avviate dall'applicazione. Non sa nulla delle vibrazioni causate da altre applicazioni di servizi.
  3. tempi di vibrazione molto lunghi o molto frequenti vibrazioni una sola volta può causare problemi di
0

C'è un brutto modo per i telefoni radicati ma si otterrà atleast qualcosa.

È possibile leggere il file in:

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

memorizza il tempo di sinistra come microsecondi quando il dispositivo vibra. (provato sulla 5.1)

Per i telefoni senza radici, si può solo controllare "dumpsys vibrator"Process uscita con un BufferedReader. Viene aggiornato una volta che il vibratore ha terminato di vibrare.

Problemi correlati