2015-04-25 93 views
5

我已经使用下面的代码来振动设备。检测设备是否振动?

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

+0

当你说你想检查设备是否在振动时 - **你是否希望检查自己的应用程序是否在振动或其他应用程序/服务?** – Jamie

+0

我想检查的是我的应用程序使其振动。 – user3586231

回答

1

不,你不能。

同样的问题是here

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

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

查看更多:

-1

介绍

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. 很长振次或非常频繁的一次振动可能导致问题
0

有根深蒂固的手机坏的方式,但你会得到ATLEAST东西。

您可以在读取文件:

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

它存储留给微秒当设备振动的时间。 (试用于5.1)

对于无根据的手机,您可以检查"dumpsys vibrator"Process输出BufferedReader。 振动器振动完成后更新。