Android亮度调整解析
来源:互联网 发布:广西专业技术人员网络 编辑:程序博客网 时间:2024/05/29 12:04
干货总结,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(); } }}
二、监听亮度变化
@Overrideprotected void onStart() { super.onStart(); registerOberver(); MLog.info(TAG, "onStart");}
@Overrideprotected 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)
文档说明:
http://developer.android.com/reference/android/Manifest.permission.html
Android6.0动态权限申请参考
http://jijiaxin89.com/2015/08/30/Android-s-Runtime-Permission/
好了,下班了,客官慢走......把建议和意见留下......
0 0
- Android亮度调整解析
- 调整android手机屏幕亮度
- android屏幕亮度调整
- android调整屏幕亮度
- Android 调整屏幕亮度
- android屏幕亮度的调整
- android屏幕亮度的调整
- 调整Android的默认亮度
- 调整Android手机的默认亮度
- Android调整手机屏幕亮度Brightness seekbar实现
- 调整Android手机的默认亮度
- Android调整屏幕亮度和改变屏幕亮度调整模式的代码
- Android调整屏幕亮度和改变屏幕亮度调整模式的代码
- Android学习笔记(六) 调整手机屏幕亮度Brightness seekbar实现
- Android 播放电影时滑动屏幕调整屏幕亮度
- Android 播放电影时滑动屏幕调整屏幕亮度
- Android 实现调整屏幕亮度,以及自动适应
- Android学习笔记(六) 调整手机屏幕亮度Brightness seekbar实现
- Linux设备模型(2)_Kobject
- Android学习记录(十一) 填坑之inputStream close关闭慢的处理。
- PLSQL Developer使用技巧
- Vim:黑客帝国屏保
- 命名管道使用
- Android亮度调整解析
- 在Vim中玩俄罗斯方块
- Windows下游戏制作(1)---win32窗口创建(2)
- 高仿今日头条(2)
- 欢迎使用CSDN-markdown编辑器
- Mysql之建立主从同步
- python csv模块使用实例
- Cisco Packet Tracer Student的路由器接口配置
- c,c++中const的用法