检测设备是否在振动?

9
我用以下代码来使设备振动:

我使用了以下代码来使设备振动。

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
当您说您想要检查设备是否在振动时 - 您是希望检查您自己的应用程序是否使其振动,还是任何其他应用程序/服务? - Jamie
我想要检查我的应用程序是否能够震动。 - user3586231
请查看我的答案,其中提供了一种可能的解决方案,可以让您跟踪应用程序何时正在振动(isVibrating())。 - Jamie
3个回答

3

介绍

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

ManagedVibrator

下面是一个ManagedVibrator类,它是Vibrator类的包装器。所有Vibrator方法都包括在内,还包括额外的isVibrating()方法。

具有接受long[] pattern签名的恒定振动方法易于跟踪,因为需要调用cancel()来结束振动。然而,具有接受long millseconds签名的一次性振动方法要难得多。

此实现使用ScheduledThreadPoolExecutor来跟踪一次性振动方法。它在一次性振动方法完成后立即将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
不,你不能。
同样的问题在这里
你只能检查设备是否支持震动:
Vibrator mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
boolean hasVibrator = mVibrator.hasVibrator();

看更多:

0

对于已经root的手机,有一种不好的方法,但至少你会得到一些东西。

你可以在以下位置读取文件:

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

设备振动时,它将剩余时间存储为微秒。 (在5.1上尝试)

对于未root的手机,您可以使用BufferedReader检查"dumpsys vibrator"Process输出。 振动器完成振动后会更新一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接