近接センサーで画面をオフにするには、以下のコードで可能です。
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "tag");
:
// 有効にする
wakeLock.acquire();
:
// 無効にする.
wakeLock.release();
これをどのタイミングで実行するかですが、
Activity のライフサイクルから考えると、onStart() または onResume() で有効にして、onStop() または onPause() で無効にする、でだいたい動きます。
Samsung ではうまく機能しない
ところが、Samsung で確認すると、画面がオフにならずにちらついてしまいます!
全てで確認したわけではありませんが、Samsung以外では近接センサーを塞ぐと画面がオフになるだけですが、Samsung では onPause()/onStop() がコールされてしまいます。
onPause() または onStop() で wakeLock.release() すると、画面が表示されることで今度は onStart()/onResume() が呼ばれ、再度 wakeLock.acquire() で有効になり画面がオフになる。すると、また onPause()/onStop() がコールされ・・・・以降処理がループされることで画面がちらつく結果となります。
対策
対策として、無効にする処理を行うイベントを onPause() から onWindowFocusChanged() に変更しました。
画面のフォーカスが外れた場合に無効とするようにすることで、有効/無効ループに入らないようにするとともに、画面が裏に回った場合は無効にできるようになりました。
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "tag");
if(!wakeLock.isHeld()) {
wakeLock.acquire();
}
onWindowFocusChanged(boolean hasFocus) {
if (!hasFocus) {
// 近接センサーを無効
if(wakeLock.isHeld()) {
wakeLock.release();
}
}
}
if(wakeLock.isHeld()) {
wakeLock.release();
}
Android の機種依存、面倒だなぁ・・・