[toc]
Android系统的亮度值取值范围在0~255,数据类型是int型.
下面分两步介绍:
介绍关于系统亮度的一些常用的方法结合一个案例说说
一.系统亮度常用的方法
1. 获得当前屏幕亮度的模式
/** 2. SCREEN_BRIGHTNESS_MODE_AUTOMATIC=1 为自动调节屏幕亮度 3. SCREEN_BRIGHTNESS_MODE_MANUAL=0 为手动调节屏幕亮度 */ private int getScreenMode(){ int screenMode=0; try{ screenMode =Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE); } catch (Exception localException){ } return screenMode; }
2.获取当前屏幕亮度值0—255
/** * 获得当前屏幕亮度值 0--255 */ private int getScreenBrightness(){ int screenBrightness=255; try{ screenBrightness = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS); } catch (Exception localException){ } return screenBrightness; }
3.设置当前屏幕亮度的模式
/** * 设置当前屏幕亮度的模式* SCREEN_BRIGHTNESS_MODE_AUTOMATIC=1 为自动调节屏幕亮度 * SCREEN_BRIGHTNESS_MODE_MANUAL=0 为手动调节屏幕亮度 */ private void setScreenMode(int paramInt){ try{ Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, paramInt); }catch (Exception localException){ localException.printStackTrace(); } }
4.设置当前屏幕亮度值0–255
/** * 设置当前屏幕亮度值 0--255 */ private void saveScreenBrightness(int paramInt){ try{ Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, paramInt); } catch (Exception localException){ localException.printStackTrace(); } }
5.保存当前的屏幕亮度值,并使之生效
/** * 保存当前的屏幕亮度值,并使之生效 */ private void setScreenBrightness(int paramInt){ Window localWindow = getWindow(); WindowManager.LayoutParams localLayoutParams = localWindow.getAttributes(); float f = paramInt / 255.0F; localLayoutParams.screenBrightness = f; localWindow.setAttributes(localLayoutParams); }
二.案例分析
1.在布局文件中用了一个seekbar控制屏幕的亮度
<SeekBar android:id="@+id/sb"android:layout_width="match_parent"android:layout_height="wrap_content"/>
2.在清单文件中添加权限,这里有个坑
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_SETTINGS"/>
聪明的你会发现这里有两个用户权限。一个是sdk写入权限,一个是修改系统设置权限这是一个特殊的权限。
在android 6.0及以后,WRITE_SETTINGS权限的保护等级已经由原来的dangerous升级为signature,这意味着我们的APP需要用系统签名或者成为系统预装软件才能够申请此权限,并且还需要提示用户跳转到修改系统的设置界面去授予此权限。
很多大神已经给出了答案:
//申请android.permission.WRITE_SETTINGS权限的方式if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//如果当前平台版本大于23平台if (!Settings.System.canWrite(this)) {//如果没有修改系统的权限这请求修改系统的权限Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);intent.setData(Uri.parse("package:" + getPackageName()));intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivityForResult(intent, 0);} else {//有了权限,你要做什么呢?具体的动作}}
安装demo的时候会进入如下界面:只有我们允许了,才能对系统的屏幕亮度进行修改。
android6.0以后很多权限需要动态申请,以下是我这个项目中动态申请权限的一个方法:
这是一个大神封装好的关于动态申请权限。用起来非常简单:
大神的传送门:/#/
这里就不多介绍了,代码如下:
//动态申请权限// 先判断是否有权限。if (AndPermission.hasPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {// 有权限,直接do anything.processShow();} else {// 申请权限。链式调用非常简单AndPermission.with(this).requestCode(100).permission(Manifest.permission.WRITE_EXTERNAL_STORAGE).send();}//权限请求的回调@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {AndPermission.onRequestPermissionsResult(requestCode, permissions, grantResults, listener);}private PermissionListener listener = new PermissionListener() {@Overridepublic void onSucceed(int requestCode, List<String> grantPermissions) {//权限申请成功回调if (requestCode == 100) {//在这个方法里面去processShow();} else if (requestCode == 101) {Toast.makeText(MainActivity.this, "权限申请失败", Toast.LENGTH_SHORT).show();}}@Overridepublic void onFailed(int requestCode, List<String> deniedPermissions) {//权限申请失败的回调if (AndPermission.hasAlwaysDeniedPermission(MainActivity.this, deniedPermissions)) {//第一种默认的提示语,会弹出一个对话框AndPermission.defaultSettingDialog(MainActivity.this, requestCode).show();}}};/*** 对seekBar进行监听*/private void processShow() {sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {//设置屏幕的亮度setScreenBrightness(seekBar.getProgress());}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});}/*** 设置屏幕的亮度*/private void setScreenBrightness(int process) {//设置当前窗口的亮度值.这种方法需要权限android.permission.WRITE_EXTERNAL_STORAGEWindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();float f = process / 255.0F;localLayoutParams.screenBrightness = f;getWindow().setAttributes(localLayoutParams);//修改系统的亮度值,以至于退出应用程序亮度保持saveBrightness(getContentResolver(),process);}public static void saveBrightness(ContentResolver resolver, int brightness) {//改变系统的亮度值//这里需要权限android.permission.WRITE_SETTINGS//设置为手动调节模式Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS_MODE,Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);//保存到系统中Uri uri = android.provider.Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);android.provider.Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS, brightness);resolver.notifyChange(uri, null);}
案例Demo下载
如果觉得《Android 修改系统屏幕亮度》对你有帮助,请点赞、收藏,并留下你的观点哦!