1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

近接センサーで画面をオフにする(Android)

Posted at

近接センサーで画面をオフにするには、以下のコードで可能です。

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() に変更しました。
画面のフォーカスが外れた場合に無効とするようにすることで、有効/無効ループに入らないようにするとともに、画面が裏に回った場合は無効にできるようになりました。

onCreate()
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "tag");
onResume()
if(!wakeLock.isHeld()) {
    wakeLock.acquire();
}
onWindowFocusChanged()
onWindowFocusChanged(boolean hasFocus) {
    if (!hasFocus) {
        // 近接センサーを無効
        if(wakeLock.isHeld()) {
            wakeLock.release();
        }
    }
}
onDestroy()
if(wakeLock.isHeld()) {
    wakeLock.release();
}

Android の機種依存、面倒だなぁ・・・

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?