SCREEN_ON意图后无法启动重复振动

时间:2012-11-30 10:47:30

标签: android android-vibration

我的服务有无尽的振动,但是当屏幕关闭时振动会停止。添加正确的BroadcastReceiver后,我注意到在打开或关闭屏幕后,我根本无法播放重复振动。示例简单代码如下:

//VibratingService class
Vibrator mVibrator;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    mVibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);

    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            vibrate();
        }
    }, filter);

    vibrate();
    return START_STICKY;
}

@Override
public void onDestroy() {
    mVibrator.cancel();
    super.onDestroy();
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

private void vibrate() {
    Log.d("TAG", "vibrate");
    mVibrator.vibrate(new long[] { 1000, 500 }, 0); //doesn't work
    //mVibrator.vibrate(new long[] { 1000, 500 }, -1); //works
}

什么是最奇怪的,当vibrate方法中的 repeat 参数设置为-1(不重复)时振动起作用,但设置为其他值时不起作用。

任何想法,解决方法?或者它可能只适用于其他手机?我在谷歌Nexus和4.1.2 Android上运行它

编辑:

经过一些测试后我确定了:

    如果在屏幕关闭之前停止振动,
  • 振动将正确启动(但不是onReceive - 这似乎为时已晚)
  • “系统振动”(例如解锁屏幕时)让振动在下一个屏幕打开/关闭时正确启动。直到下一个“休息”,等等
  • (edit2) - 这绝对与模式相关 - 振动(长毫米)没有这样的问题 - 一切正常

如果我找不到任何“正常”解决方案,我只需创建自己的振动器类......

1 个答案:

答案 0 :(得分:0)

我仍然不确定是什么原因引起了这种奇怪的行为,或者是否会在其他手机型号上发生,但下面是我的简单MyVibrator类的代码,它可以在屏幕打开和关闭后工作,其他人是否应该有这个问题并没有更好的解决方案提出。

public class MyVibrator {

Vibrator mVibrator;
Handler mHandler = new Handler();

boolean mIsVibrateOn;
private long mVibrateOnLength;
private long mVibrateOffLength;

private Runnable mVibrateRunnable = new Runnable() {
    @Override
    public void run() {
        if (mIsVibrateOn) {
            mVibrator.vibrate(mVibrateOnLength);
            postVibrateRunnable(mVibrateOnLength + mVibrateOffLength);
        } else {
            mVibrator.cancel();
        }
    }
};

public MyVibrator(Context context) {
    mVibrator = (Vibrator) context
            .getSystemService(Context.VIBRATOR_SERVICE);
}

public void vibrate(long vibrateOn, long vibrateOff) {
    mVibrateOnLength = vibrateOn;
    mVibrateOffLength = vibrateOff;
    mIsVibrateOn = true;
    postVibrateRunnable(0);
}

public void stopVibrating() {
    mIsVibrateOn = false;
    mHandler.removeCallbacks(mVibrateRunnable);
    mVibrator.cancel();
}

private void postVibrateRunnable(long delay) {
    mHandler.removeCallbacks(mVibrateRunnable);
    mHandler.postDelayed(mVibrateRunnable, delay);
}

}

它还没有经过彻底的测试,但到目前为止似乎工作正常。通过一些工作,可以很容易地改变以使用更长的模式