2

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

//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
}

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

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

编辑:

经过一些测试,我确定:

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

如果我没有找到任何“正常”的解决方案,我可能只需要创建自己的 Vibrator 类......

4

1 回答 1

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);
}

}

它尚未经过彻底测试,但到目前为止它似乎运行良好。通过一些工作可以很容易地改变它以使用更长的模式

于 2012-11-30T11:41:01.290 回答