6

次の方法で、特定のイベントをユーザーに警告する必要があります。

  • 振動
  • 通知

ユーザーが通知を確認するまで、バイブレーションは無期限にオンのままにする必要があります。

問題は、デバイスがスリープ状態になると振動が停止することです。次の質問を読みました:
画面がオフになったときに携帯電話が振動することを許可
する Android で画面がスリープ モードになった後も振動を続ける

上記の質問の1つに対して、パターンなしで振動させるとうまくいくという答えがありました. Vibrator.vibrateそのため、多数のパターンの代わりにミリ秒を受け入れるバージョンを呼び出してみましたが、とにかく振動が止まります。

ACTION_SCREEN_OFF他の回答は、アクションにレシーバーを登録することを提案しています。これにより、アラームが開始された後にデバイスがスリープ状態になった場合に振動を再開できますが、デバイスが既にスリープ状態になっている場合は機能しません。

ただし、最初に画面をオンにしてから、レシーバーを登録して、そこから発生する可能性のある画面オフイベントに対処できれば、機能させることができます。そのため、トリガーイベントが受信されたときにサウンドまたはバイブレーションを開始する前に完全なウェイクロックを取得しようとしましたが、フラグ FULL_WAKE_LOCK および ACQUIRE_CAUSES_WAKEUP を使用しているにもかかわらず機能しません。ウェイクアップ部分は機能しますが、その後すぐにデバイスは再びスリープ状態になります。FULL_WAKE_LOCKフラグは API 17 で廃止されたため機能しないと思いますが、私のデバイスは API 16 である 4.1.2 を実行している Samsung です!

推奨されるアプローチは現在 WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ONを使用しているようですが、これはアクティビティから呼び出す必要があり、ユーザーが通知をクリックしない限り画面が表示されません。これが発生した場合、音と振動は既に発生しているはずです止められました。

そのため行き止まりのように見えます。

他に何を試すことができますか?

更新:
ウェイク ロックを使用して画面を常にオンにしておくことはできませんでしたが、一方で、数秒間だけでも画面をオンにすることができます。実際には画面をオンにしておく必要はないので、受信機をIntent.ACTION_SCREEN_OFFアクションに登録しており、画面が消えると受信機は再び振動を再開します。これは Samsung ではうまくいきましたが、テストを続けるために Huawei に切り替えましたが、受信機は機能しません。

更新:
Huawei デバイスでの例外のスタック トレースは次のとおりです。

    java.util.NoSuchElementException: Death link does not exist
    at android.os.BinderProxy.unlinkToDeath(Native Method)
    at com.android.server.VibratorService.unlinkVibration(VibratorService.java:294)
    at com.android.server.VibratorService.removeVibrationLocked(VibratorService.java:284)
    at com.android.server.VibratorService.cancelVibrate(VibratorService.java:213)
    at android.os.IVibratorService$Stub.onTransact(IVibratorService.java:83)
    at android.os.Binder.execTransact(Binder.java:338)
    at dalvik.system.NativeStart.run(Native Method)
4

2 に答える 2