21

Androidで好みの画面の明るさを取得するにはどうすればよいですか?

画面の明るさを変更するには、WindowManager.LayoutParams.screenBrightnessを使用します。ドキュメントによると:

これは、ユーザーの好みの画面の明るさをオーバーライドするために使用できます。デフォルトの 0 未満の値は、優先される画面の明るさを使用することを意味します。0 から 1 で、明るさを暗いから完全に明るいまで調整します。

が 0 未満の場合screenBrightnessは、好みの画面の明るさから始めたいと思います。この値を取得するにはどうすればよいですか?

4

3 に答える 3

47

以前から検索していたので回答させていただきます。私の簡単な答えは次のとおりです。広範な調査の結果、自動モードのときに現在の明るさレベルを取得する方法が見つかりませんでした。

これを複数の回答に分割します。グーグル社員がこれを参考にできるように、私は前提をスキップしません。必要のないものはスキップしてください。

1- 明るさ設定値を取得

が 0 未満の場合screenBrightness、優先する画面の明るさから始めたいと思います。この値を取得するにはどうすればよいですか?

その程度の評判を持っている人にとって、あなたはすでに検索についてのドリルを知っていると思います. ここSOには、これに関するたくさんの答えがあります。同様の質問で右側のパネルを確認してください...とは言っても、あまり詳しくは説明しません。

int oldBrightness = Settings.System.getInt(getContext().getContentResolver(), 
             Settings.System.SCREEN_BRIGHTNESS);

これは、AndroidBrightnessPreference.javaが 2.3.5 で行う方法です (68 行を参照)。また、(実際的な理由から) lfor が投稿したものと同じです。

古いブライトネスと名付けられたのは何のためでもありません。これは現在の値ではなく、どこかに保存されている設定です。手動の明るさモードを使用している場合に、ユーザーが経験していることと同じであることを確認することしかできません. そうでなければ、あなたは知らないだけです。以下を確認する必要があります。

int mode = Settings.System.getInt(getContext().getContentResolver(),
                     Settings.System.SCREEN_BRIGHTNESS_MODE);

2-画面の明るさの変化を聞く

私たちが知っているように、一般的に、Android の変更をリッスンしたいときは、Intentアクションをリッスンしたり、 BroadcastReceivers を登録したりすることができます。ただし、の知る限り、たとえばACTION_のような明るさの変化はありません。SCREEN_[ON|OFF]システムに隠されている可能性がありますが、私はそれを見たことがありません。公開されていない場合は、それに対処するためのあらゆる落とし穴があります。

Dianne Hackborn からの 2010 年 12 月付けのメッセージがあり、彼女は「画面の明るさの変化に関するブロードキャストはありません」と述べています。

ですから、そのようなものに接続する方法があるとは思いません。もちろん、設定自体を変更することもできます。

Settings.System.putInt(getContext().getContentResolver(),
    SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_AUTOMATIC);

3- 周囲光の変化を聞く

ただし、おおよそできます。光量を検出します。あなたがする必要がimplements SensorEventListenerあります:

// class definition:
private SensorManager sensorManager;

@Override
public void onSensorChanged(SensorEvent event) {
    float values = event.values[0]; // Ambient LUX
}
// onCreate:
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);   
sensorManager.registerListener(this,
    sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),
    SensorManager.SENSOR_DELAY_UI);

4-明るさの変化を推測する

結局のところ、私はハックボーンの質問を繰り返さなければなりません。「あなたは何を達成しようとしていますか?」(これはバウンティ所有者向けです)。Android が周囲のルクスを画面の明るさにどのようにマッピングするかを知りたいです。私はそれが線形のものではないことを確信しています(Sensor.getMaximumRange()0..1浮動小数点間隔に線形にマップします)。一般に、これは対数的にマッピングされていることがわかりました (より低い輝度範囲に微調整を提供します) が、パラメーターについてはわかりません。おそらく、誰もが使用する推奨されるデフォルトの方法があると思いますが、私は専門家ではありません。

Android がそれを行うソースの場所を調べて、Android がそれを行う方法を見つけることができれば、それは素晴らしいことです。とにかく、私はあなたに同じ質問をするためにここまで来たわけではありません。私が見つけたのは、Sensor.getMaximumRange()から得られるものと一致しないということですSensorEvent values[0]。ここでは、Sharp センサー (Nexus S) を使用しています。レポートの最大数は 3,000 ですが、最大 10,240 の値が表示されています。

そのため、センサーの取得は信頼できません (?)。Android を使用して見た動作から、どういうわけか getMaximumValue() を最大輝度にマップし、それを超える値は違いを生まないと推測しています。

5-ここからどこへ行く

私はAndroidのソースをもっと調べたいと思います。どこかで、おそらく下位レベルのハードウェア管理機能で、それらがどのようにマッピングされているかを見ることができました。それでも、ダイアン・ハックボーンが言ったことを考えると、それは信頼できるかどうか疑問に思います (彼らはあなたにそうしてほしくないようです)。それを公開しない理由があったと思います。おそらく必要です: アプリがシステム設定を知る必要があるのはなぜですか? 独自のアプリ全体のレベルを提供するか、極端な場合には、システム全体の交換またはマネージャーに独自の「自動輝度変更メソッド」(上記のポイント 4 のように) を提供する必要があります。おそらくそれが元の開発者の考えでした。

とにかく、誰かが他の詳細を見つけたら、私は非常に嬉しく思います.

于 2011-11-13T20:02:23.133 に答える
-1

質問に答えるには、Settings.system.SCREEN_BRIGHTNESSから好みの明るさを取得できます。範囲は 0 ~ 255 のようです。

int UserBrightness = Settings.System.getInt(getContentResolver(), 
            Settings.System.SCREEN_BRIGHTNESS,-1); 

自動モードまたはアプリ設定で設定されている現在の明るさは、実際には別の質問であり、答えにも興味があります。

于 2011-11-13T16:05:37.110 に答える