強制的にスリープを解除する方法(備忘用の記事。調査中)
以下を参考にしました。
液晶パネルのWakeLockを取得し、Sleep状態からWake状態へ遷移する | TechBooster
実装
上のサイトにある通りのコードで、一応意図した動きになります。ただし、課題があります。
AndroidManifest.xml
<uses-permission android:name="android.permission.WAKE_LOCK" />
import
import android.os.PowerManager; import android.os.PowerManager.WakeLock;
処理
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); PowerManager.WakeLock wakelock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag"); // スリープを解除 wakelock.acquire(); // この間だけスリープに入れなくなる(時間制限あり) // これを呼ぶと再びスリープに入るようになる(すぐではない) wakelock.release();
※上記コードは、Activity からだけでなく、Service からでも実行可能。
課題
PowerManager.FULL_WAKE_LOCK は非推奨
PowerManager | Android Developers
PowerManager.newWakeLock()
の第一引数int levelAndFlags
に指定できるレベルには以下がありますが、FULL_WAKE_LOCK
は非推奨です(API Level 17以降)。
wake lock level | description |
---|---|
FULL_WAKE_LOCK | 非推奨(API level 17以降) |
SCREEN_BRIGHT_WAKE_LOCK | 非推奨(API level 15以降) |
SCREEN_DIM_WAKE_LOCK | 非推奨(API level 17以降) |
PARTIAL_WAKE_LOCK | 画面明るくならない |
PROXIMITY_SCREEN_OFF_WAKE_LOCK | PARTIAL_WAKE_LOCKに似ているが、近接センサがActive |
もっと言うと、指定可能なフラグはPARTIAL_WAKE_LOCK
と、API21から追加されたPROXIMITY_SCREEN_OFF_WAKE_LOCK
のみです。
FULL_WAKE_LOCK
を含む非推奨となったラベルの説明には、いずれも代わりに WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
を使うように書かれています。
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
WindowManager.LayoutParams | Android Developers
推奨に従って、WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
を使ってみました。
しかし、PARTIAL_WAKE_LOCK
+ FLAG_KEEP_SCREEN_ON
を組み合わせても、スクリーンをONにすることはできませんでした。属性は設定できるものの、スクリーンをONにする効果は無いようです。
尚、WindowManager.LayoutParams.FLAG_xxx
は、 Window.setFlags()
で設定します。Window
は Activity.getWindow()
で取得できます。
コード
getWindow().addFlags( WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON );
Activity.setTurnScreenOn()
同じく、スクリーンをONにする処理として、Activity.setTurnScreenOn()
があります。が、こちらも1回は起き上がってくるものの、2回目はうまくいきません。フラグを立てた後に落とす処理を入れても変わりませんでした。待ち時間を入れるなど、何か他に処理が必要なのかもしれません。
コード
setTurnScreenOn( true );
今のところ、FULL_WAKE_LOCK
の代替えとして提案されたものの中で、FULL_WAKE_LOCK
と同等の処理ができる組み合わせが見つかっていません。ただ、着呼や電源供給時に同じような処理をしているはずで、探せばまだ方法があるように思います。
(以上)