我有一个服务,无休止的振动,但振动停止时,屏幕关闭。在添加了正确的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
}最奇怪的是,振动方法中的重复参数设置为-1 (不重复)时振动工作,但当设置为其他值时,振动不起作用。
有什么办法吗?或者它只适用于其他手机?我在Google和4.1.2 Android上运行的
编辑:
经过一些测试,我确定:
如果我没有找到任何“正常”的解决方案,我只需要创建我自己的Vibrator类--可能.
发布于 2012-11-30 11:41:01
我仍然不确定是什么原因导致了这种奇怪的行为,或者是否发生在其他手机模型上,但下面是我的简单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);
}}
它还没有经过彻底的测试,但到目前为止,它似乎运转良好。通过一些工作,它可以很容易地改变使用更长的模式。
https://stackoverflow.com/questions/13643669
复制相似问题