首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SCREEN_ON意图后无法开始重复振动

SCREEN_ON意图后无法开始重复振动
EN

Stack Overflow用户
提问于 2012-11-30 10:47:29
回答 1查看 529关注 0票数 2

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

代码语言:javascript
复制
//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上运行的

编辑:

经过一些测试,我确定:

  • 如果在屏幕关闭前停止振动,振动将正确启动(但在onReceive中不是这样--这似乎太晚了)。
  • “系统振动”(例如,解锁屏幕时)让振动从下一个屏幕打开/关闭开始。直到下一次“休息”,等等
  • (edit2) --这绝对是与模式相关的--振动(Long millis)没有这样的问题--一切都很好。

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

EN

回答 1

Stack Overflow用户

发布于 2012-11-30 11:41:01

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

代码语言:javascript
复制
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);
}

}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13643669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档