我的服务有无尽的振动,但是当屏幕关闭时振动会停止。添加正确的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上运行它
编辑:
经过一些测试后我确定了:
如果我找不到任何“正常”解决方案,我只需创建自己的振动器类......
答案 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);
}
}
它还没有经过彻底的测试,但到目前为止似乎工作正常。通过一些工作,可以很容易地改变以使用更长的模式