逆引きAndroid入門 画面の明るさ(Screen brightness)を変更するには

画面の明るさ(Screen brightness)を変更するには

アプリケーション

画面の明るさを変更するには、
デフォルトでインストールされている「Settings」アプリケーションを起動し、
「Sound & Display」 > 「Brightness」から変更することができます。

Brightness

 

ソースコード

「Settings」アプリケーション > 「Sound & Display」 > 「Brightness」のソースコードは、以下にあります。

packages\apps\Settings\src\com\android\settings\BrightnessPreference.java
[platform/packages/apps/Settings.git] / src / com / android / settings / BrightnessPreference.java

内部的な処理を、簡単に解説しておくと、

Brightnessの設定値は、
android.providerパッケージ、Setting.Systemクラス、SCREEN_BRIGHTNESS定数として定義されており、
Settings.System.getInt()、または、Settings.System.putInt()を呼び出すことで、設定の読み書きをしています。
※Settings.System.putInt()を呼び出すには、android.permission.WRITE_SETTINGSも必要
※設定値(int)の範囲は、0(暗い)~255(明るい)
※この設定値は、システム全体に共通のものであり、すべてのアプリケーションに適用される

しかしながら、この設定値は、あくまでもアプリケーションのためのものであり、
実際にハードウェアの明るさを変更しているわけではありません。

言い換えると、この設定値を変更するだけでは、ハードウェアの明るさを変更できず、
実際にハードウェアの明るさを変更するためには、以下のような処理が必要です。

try {
    IHardwareService hardware = IHardwareService.Stub
            .asInterface(ServiceManager.getService("hardware"));
    if (hardware != null) {
        hardware.setBacklights(brightness);
    }
} catch (RemoteException doe) {
}

残念なことに、このIHardwareServiceは、非公開APIであり、SDKのバージョンによっては、変更される可能性があるため、
一般のアプリケーション開発者が使用することは好ましくありません。
※SDK1.0の時代にAndroid Marketに出回っている、いくつかの懐中電燈(FlashLight)アプリでは、この実装をしている模様

では、一般のアプリケーション開発者が、画面の明るさを変更する方法が全くないのかというと、そうではなく、
Android SDK 1.5から、新規にWindowManager.LayoutParams.screenBrightness定数が追加されており、
以下のような処理を実装することで、画面の明るさを変更することができます。
※設定値(float)の範囲は、0未満がデフォルト(システム設定)、0.0(暗い)~1.0(明るい)
※処理を呼び出す箇所は、例えば、Activity.onCreate()とか

WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness = 1.0f;
getWindow().setAttributes(lp);

ただし、明るさの変更が適用される範囲は、そのウィンドウだけであり、システム全体には適用されません。
※もっとも、先の懐中電燈(FlashLight)アプリでは、自分自身のアプリにのみ適用したいため、この方法の方が都合がよい