Introduction
The Vibrator class does not have the isVibrating() method you are looking for. It uses services, so you cannot easily override Vibrator and add additional features.
Managedvibrator
The following is the ManagedVibrator class, which is a wrapper for the Vibrator class. All Vibrator methods are included with the optional isVibrating() method.
constant vibration methods with signatures that accept a long[] pattern are easily tracked because cancel() must be called to stop the vibration. However, one-time vibration methods with signatures that accept long millseconds are much more difficult to track.
This implementation uses the ScheduledThreadPoolExecutor to track one-time validation methods . It sets the mIsVibrating flag to false immediately after the completion of the 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); }
Using
ManagedVibrator vibrator = new ManagedVibrator(this); vibrator.vibrate(5000); ... if (vibrator.isVibrating()) {
Limitations
- You need to use one instance of ManagedVibrator in your application.
- ManagedVibrator can only inform you of vibrations triggered by your application. He does not know anything about vibrations caused by other service applications.
- Very long vibrations or very frequent vibrations at the same time can cause problems.
Jamie source share