2

無限に振動するサービスを利用していますが、画面をオフにすると振動が止まります。正しい 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 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 に答える