【Kotlin/Android】端末の画面の明るさをコードから変更する方法!WindowManager

この記事からわかること
- Android Studio/Kotlinで端末の画面の明るさを変更するには?
- window.attributes.screenBrightnessプロパティ
- WindowManager.LayoutParamsで指定できる値
\ アプリをリリースしました /
環境
- Android Studio:Meerkat
- Kotlin:2.0.21
- Pixel 5:Android14
- Mac M1:Sequoia 15.4
端末の画面の明るさをコードから変更する方法
Kotlinで端末の画面の明るさをコードから変更するにはwindow.attributes.screenBrightness
プロパティにWindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_OFF
/BRIGHTNESS_OVERRIDE_FULL
などを指定し再度attributes
にセットします。例えば以下のように実装すると端末の画面の明るさを最大にすることができます。
screenBrightness
に設定できる定数が3種類用意されています。
カスタム値を渡すことで微妙な明るさの調整を行うことも可能です。ただ例えば0.1
を指定しても明るい端末もあれば暗い端末もあり、端末によって設定される明るさはまちまちのようです。
またアプリ内から明るさを変更しても端末自体の設定は変更されないためアプリを停止させるとユーザーの設定していた明るさに戻ってくれるようです。これはwindow.attributes.screenBrightness
で制御できるのがあくまでActivity単位で設定しているためです。
ユーザーの設定値を取得する
ユーザーが現在端末で設定している明るさはscreenBrightness
に設定されている値を取得すればOKです。公式の実装でも以下のようにpreviousBrightness
に値をプールしておくような実装が推奨されています。
ただ私の端末のscreenBrightness
から取得できた値は常に-1.0
でした。ユーザーが例えば明るさを80%にしていても0.8f
が取得できるわけではないようで、おそらく「ユーザー設定値かどうか」だけが取得できるみたいです。
iOS
システム明るさを取得・更新する
screenBrightness
はアプリ表示中に限りの明るさを取得・制御していましたが、デバイス自体の明るさを取得・制御するためにはSettings.System
からSettings.System.SCREEN_BRIGHTNESS
を指定して取得します。取得できる値は0 ~ 255
の整数になっているようです。
ただ取得できた値は61%
の状態で38
となっており、本来なら255 × 0.61 ≒ 155
になるかと思いますが想定通りの値は取得できませんでした。これはデバイスに依存して値がぶれるのかもしれません。
明るさの自動調節のON/OFFを取得する
「設定」>「ディスプレイ」>「明るさの自動調節」から設定できる明るさの自動調節のON/OFF状態を取得することも可能です。Settings.System.SCREEN_BRIGHTNESS_MODE
を指定しSettings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
であればONになっている状態になります。
システムの明るさを更新する
システムの明るさを更新するためにはWRITE_SETTINGS
権限が必要になります。まずは「AndroidManifest.xml」に以下を追加します。
続いてアプリからシステム設定を変更できるようにユーザーに対して許可要求を実装します。
更新するにはputInt
を使用します。これでシステムの明るさをアプリから制御することが可能です。ただこちらの実装はアプリをキルしても明るさがそのままになってしまうので考慮してあげる必要がありそうです。
以下のように128
を指定してみましたが、デバイスでは87%
になったので意図しない明るさにならないように制御は必要そうです。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。