干货总结,Android亮度调整有一下一些知识点需要注意:
1、Android亮度调整,包括调整系统亮度和调整指定Activity亮度。
2、Android系统亮度模式有两种,自动模式和手动模式。
3、自动模式下和手动模式下获取系统亮度值的方式不一样,具体请看代码(谢谢老大指点,差点以为没办法获取自动模式下的亮度)。
4、系统亮度值的区间为[0, 255]。需要注意的是,自动亮度模式下,直接获取到的系统亮度值区间为[-1,1]。
5、这一点可能很多人没注意,调整过Activity亮度之后,系统亮度调整在当前Activity中会失效。
6、系统亮度变化值,可以通过监听系统属性值变化获得,具体看代码。
7、Android 6.0 及以上系统,对系统变量相关操作,需要硬编码动态申请权限。
8、动态监听系统亮度变化,注意防止内存泄露。
好了,干货,请看代码,看代码,看代码
一、工具类BrightnessUtils
public class BrightnessUtils { private static final String TAG = BrightnessUtils.class.getSimpleName();
/** * 判断是否开启了自动亮度调节 */ public static boolean isAutoBrightness(Activity activity) {
boolean automicBrightness = false;
try {
automicBrightness = Settings.System.getInt(activity.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
} catch (Settings.SettingNotFoundException e){
e.printStackTrace();
}
return automicBrightness;
}
/** * 获取屏幕的亮度 */ public static int getScreenBrightness(Activity activity) {
// int nowBrightnessValue = 0; // ContentResolver resolver = activity.getContentResolver(); // try { // nowBrightnessValue = android.provider.Settings.System.getInt(resolver, Settings.System.SCREEN_BRIGHTNESS); // } catch (Exception e) { // e.printStackTrace(); // } // return nowBrightnessValue; if(isAutoBrightness(activity)){
return getAutoScreenBrightness(activity);
}else{
return getManualScreenBrightness(activity);
}
}
/** * 获取手动模式下的屏幕亮度 */ public static int getManualScreenBrightness(Activity activity) {
int nowBrightnessValue = 0;
ContentResolver resolver = activity.getContentResolver();
try {
nowBrightnessValue = android.provider.Settings.System.getInt(resolver, Settings.System.SCREEN_BRIGHTNESS);
} catch (Exception e) {
e.printStackTrace();
}
return nowBrightnessValue;
}
/** * 获取自动模式下的屏幕亮度 */ public static int getAutoScreenBrightness(Activity activity) {
float nowBrightnessValue = 0;
ContentResolver resolver = activity.getContentResolver();
try {
nowBrightnessValue = android.provider.Settings.System.getFloat(resolver, "screen_auto_brightness_adj"); //[-1,1],无法直接获取到Setting中的值,以字符串表示 Log.d(TAG, "[ouyangyj] Original AutoBrightness Value:" + nowBrightnessValue);
} catch (Exception e) {
e.printStackTrace();
}
float tempBrightness = nowBrightnessValue + 1.0f; //[0,2] float fValue = (tempBrightness/2.0f)*225.0f;
Log.d(TAG,"[ouyangyj] Converted Value: " + fValue);
return (int)fValue;
}
/** * 设置亮度 */ public static void setBrightness(Activity activity, int brightness) {
// Settings.System.putInt(activity.getContentResolver(), // Settings.System.SCREEN_BRIGHTNESS_MODE, // Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); try{
WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
lp.screenBrightness = Float.valueOf(brightness) * (1f / 255f);
MLog.debug(TAG, "set lp.screenBrightness == " + lp.screenBrightness);
activity.getWindow().setAttributes(lp);
}catch(Exception ex){
ex.printStackTrace();
}
}
/** * 停止自动亮度调节 */ public static void stopAutoBrightness(Activity activity) {
try{
Settings.System.putInt(activity.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
}catch (Exception ex) {
ex.printStackTrace();
}
}
/**0 * 开启亮度自动调节 * @param activity */ public static void startAutoBrightness(Activity activity) {
try{
Settings.System.putInt(activity.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
}catch (Exception ex){
ex.printStackTrace();
}
}
/** * 保存亮度设置状态 */ public static void saveBrightness(Activity activity, int brightness) {
try{
Uri uri = android.provider.Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
android.provider.Settings.System.putInt(activity.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, brightness);
// resolver.registerContentObserver(uri, true, myContentObserver); activity.getContentResolver().notifyChange(uri, null);
}catch(Exception ex){
ex.printStackTrace();
}
}
}
二、监听亮度变化
@Override
protected void onStart() {
super.onStart();
registerOberver();
MLog.info(TAG, "onStart");
}
@Override
protected void onStop() {
super.onStop();
unregisterOberver();
MLog.info(TAG, "onStop");
}
private final Uri BRIGHTNESS_MODE_URI =
Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE);
private final Uri BRIGHTNESS_URI =
Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
private final Uri BRIGHTNESS_ADJ_URI =
Settings.System.getUriFor("screen_auto_brightness_adj");//Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ); private boolean isRegistered = false;
private void registerOberver() {
try {
if (BrightnessObserver != null) {
if (!isRegistered) {
MLog.debug(TAG, "[ouyangyj] register BrightnessObserver");
final ContentResolver cr = getContentResolver();
cr.unregisterContentObserver(BrightnessObserver);
cr.registerContentObserver(BRIGHTNESS_MODE_URI, false, BrightnessObserver);
cr.registerContentObserver(BRIGHTNESS_URI, false, BrightnessObserver);
cr.registerContentObserver(BRIGHTNESS_ADJ_URI, false, BrightnessObserver);
isRegistered = true;
}
}
} catch (Throwable throwable) {
MLog.debug(TAG, "[ouyangyj] register BrightnessObserver error! " + throwable);
}
}
private void unregisterOberver() {
try {
if (BrightnessObserver != null) {
if (isRegistered) {
MLog.debug(TAG, "[ouyangyj] unregister BrightnessObserver");
getContentResolver().unregisterContentObserver(BrightnessObserver);
isRegistered = false;
}
}
} catch (Throwable throwable) {
MLog.debug(TAG, "[ouyangyj] unregister BrightnessObserver error! " + throwable);
}
}
private ContentObserver BrightnessObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
onChange(selfChange, null);
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange);
if (selfChange) return;
MLog.debug(TAG, "[ouyangyj] BrightnessObserver onChange");
if (BRIGHTNESS_MODE_URI.equals(uri)) {
MLog.debug(this, "[ouyangyj] 亮度模式改变");
// updateBrightnessInfo(); } else if (BRIGHTNESS_URI.equals(uri) && !BrightnessUtils.isAutoBrightness(BasicChannelTemplateActivity.this)) {
MLog.debug(this, "[ouyangyj] 亮度模式为手动模式 值改变");
// updateBrightnessInfo(); } else if (BRIGHTNESS_ADJ_URI.equals(uri) && BrightnessUtils.isAutoBrightness(BasicChannelTemplateActivity.this)) {
MLog.debug(this, "[ouyangyj] 亮度模式为自动模式 值改变");
// updateBrightnessInfo(); } else {
MLog.debug(this, "[ouyangyj] 亮度调整 其他");
// updateBrightnessInfo(); }
}
};
三、动态授权申请
对应异常
java.lang.SecurityException: balabalabala was not granted this permission: android.permission.WRITE_SETTINGS.
at android.os.Parcel.readException(Parcel.java:1602)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
at android.content.ContentProviderProxy.call(ContentProviderNative.java:646)
at android.provider.Settings$NameValueCache.putStringForUser(Settings.java:1325)
at android.provider.Settings$System.putStringForUser(Settings.java:1678)
at android.provider.Settings$System.putIntForUser(Settings.java:1783)
at android.provider.Settings$System.putInt(Settings.java:1777)

本文深入探讨了Android系统亮度调整的多种方式,包括自动与手动模式的区别、亮度值的获取与设置、不同模式下亮度值的转换,以及如何监听亮度变化并避免内存泄露。特别强调了在Android6.0以上系统中进行系统变量操作时动态权限申请的重要性。
4877

被折叠的 条评论
为什么被折叠?



