2012-11-30 139 views
2

我有无尽的振动的服务后重复震动,但是当屏幕关闭振动停止。在添加了正确的BroadcastReceiver后,我注意到无论是在屏幕开启还是关闭之后,我都无法播放重复振动。下面的实施例简单的代码:无法启动SCREEN_ON意图

//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(未重复)振动工作,但是当设定为其他值不起作用。

任何想法,解决方法?或者,也许它只适用于其他手机?我拼命地跑它放在谷歌Nexus和Android的4.1.2

编辑:

一些测试后,我已经确定:如果他们之前的屏幕去了被拦

  • 震动会正常启动(但不中的onReceive - 这似乎为时已晚)
  • “系统振动”(例如解锁屏幕)时,允许振动与下一屏幕开/关正常启动。直到下一个“破发”,等等
  • (EDIT 2) - 这绝对是连接模式 - 不存在具有振动(long millis)来没有这样的问题 - 一切工作正常

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

+0

有可能是你的mVibrator是从服务的上下文中获取上不转播工作。尝试在再次的onReceive获取它(从上下文的背景下) – njzk2

+0

@ njzk2 - 我检查了,但它似乎并不如此。它有一些震动停止在“模式”,似乎我不能正确地重新启动它们,只有“系统振动”可以。请参阅我的编辑 – Koger

回答

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

}

它尚未经过彻底的测试,但到目前为止,它似乎是工作的罚款。一段时间的努力它可以很容易地改变使用较长的模式