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
- È necessario utilizzo esempio uno ManagedVibrator nell'applicazione
- ManagedVibrator può dire solo di vibrazioni avviate dall'applicazione. Non sa nulla delle vibrazioni causate da altre applicazioni di servizi.
- tempi di vibrazione molto lunghi o molto frequenti vibrazioni una sola volta può causare problemi di
Immagino che non ci siano richiami per verificare se il vibratore sta vibrando per ora. – TheLittleNaruto
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
voglio controllare se la mia applicazione lo fa vibrare . – user3586231