一部の電話、特に古いものや遅いものでは、リソース (バッテリーなど) を節約するために、設定 ContentObserver 機能の一部が取り除かれています。私の記憶が正しければ、これは古い API のデフォルトの動作でした。回避策は、次のような非 UI アクティビティを介して手動で明るさの新しい設定をトリガーすることです。
public class act_brightnesshelper extends Activity {
//----- Private Static Members -----
private static final String TAG = "act_brightnesshelper";
//----- Private Static Members END -----
//----- Private Members -----
private int brightnessLevel;
//----- Private Members END -----
//----- Activity Overrides -----
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate");
super.onCreate(savedInstanceState);
brightnessLevel = this.getIntent().getExtras().getInt("brightnessLevel");
}
@Override
public void onAttachedToWindow() {
Log.d(TAG, "onAttachedToWindow brightnessLevel = " + brightnessLevel);
super.onAttachedToWindow();
WindowManager.LayoutParams lp = getWindow().getAttributes();
try {
lp.screenBrightness = brightnessLevel / 255f;
getWindow().setAttributes(lp);
} catch(Exception ex) {
//Do Nothing...
}
//Finish the Activity after 500ms...
Thread WaitThread = new Thread(){
@Override
public void run() {
try {Thread.sleep(500);} catch (InterruptedException e) {}
finish();
}
};
WaitThread.start();
}
//----- Activity Overrides END-----
}
次のようにインテントエクストラで必要な明るさレベルを渡して明るさ設定を変更した後に呼び出します。
Settings.System.putInt(<cnt resolver>, Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
Settings.System.putInt(<cnt resolver>, Settings.System.SCREEN_BRIGHTNESS, <your level>);
Intent iBriHelper = new Intent(cx, act_brightnesshelper.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
iBriHelper.putExtra("brightnessLevel", <your level>);
context.startActivity(iBriHelper);
これを正しく行うには、次のようにマニフェストでアクティビティを宣言する必要があります。
<activity android:name=".act_brightnesshelper"
android:theme="@style/Theme.Transparent"
android:configChanges="orientation"
android:noHistory="true"
android:excludeFromRecents="true">
</activity>
アクティビティ内で明るさを変更する場合は、その中で直接行うことができます。私が提供するコードは、アプリ ウィジェットなどのアクティビティのコンテキスト外で明るさを変更するためのものです。
OPコメントに基づく編集
164行目でわかるように、AndroidソースコードからBrightnessController.javaを見てみましょう。これは、ユーザーがシステム設定UIで明るさスライダーを変更するたびに呼び出される関数です。174 行目では、Settings.system クラスを介して明るさの設定を更新しています。しかし、その前に 170 行目に setBrightness 関数の呼び出しがあります (193 行目で宣言されています)。
setBrightness は、IPowerManager.Stub.asInterface(ServiceManager.getService("power")) への呼び出しである setTemporaryScreenBrightnessSettingOverride への呼び出しを介して輝度レベルを設定します。実際、Android自体は私が提案したことを行っています。これは、次のように見えるシステム コールを介して輝度レベルを設定します。
lp.screenBrightness = brightnessLevel / 255f;
getWindow().setAttributes(lp);
アクティビティで呼び出され、データベースに実際の設定を設定します。したがって、実際に私が提案するのは回避策ではなく、システムがそれを行う方法です。あなたが言及しているデバイスに実装エラーがあるとは思いませんが、それはハードウェア自体に関係していると思います.Androidはハードウェアと直接通信しないため(here を参照)、ハードウェアの方法にある可能性がありますまたはドライバーはこの電話で設計されています。
お役に立てれば...