检测设备是否在振动?

时间:2015-04-25 08:40:10

标签: android events android-vibration vibration

我使用下面的代码来振动设备。

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

我们能否以编程方式检测此事件(检查是设备振动)?

3 个答案:

答案 0 :(得分:2)

不,你不能。

同样的问题是here

您只能检查设备振动是否受支持:

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

查看更多内容:

答案 1 :(得分:2)

简介

Vibrator类没有您要查找的isVibrating()方法。它使用服务,因此您无法轻松覆盖Vibrator并添加额外功能。

ManagedVibrator

下面是一个ManagedVibrator类,它是Vibrator类的包装器。所有Vibrator方法都包含在内,并附加isVibrating()方法。

具有接受long[] pattern签名的constant vibration methods很容易跟踪,因为需要调用cancel()来结束振动。但是,具有接受long millseconds签名的one time vibration methods更难以跟踪。

此实施使用ScheduledThreadPoolExecutor来跟踪one time validation methods。在one time vibration method完成后,它会将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. 非常长的振动时间或非常频繁的一次振动可能会导致问题

答案 2 :(得分:0)

对于有根电话的手机来说,这是一种糟糕的方式,但你至少会得到一些东西。

您可以在以下位置阅读该文件:

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

它将设备振动时留下的时间保存为微秒。 (试过5.1)

对于无根电话,您只需使用Process检查"dumpsys vibrator" BufferedReader输出即可。 一旦振动器完成振动,它就会更新。