[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以后很多权限需要动态申请,以下是我这个项目中动态申请权限的一个方法:
这是一个大神封装好的关于动态申请权限。用起来非常简单:
大神的传送门:http://www.yanzhenjie.com/#/
这里就不多介绍了,代码如下:
//动态申请权限
// 先判断是否有权限。
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();
}
//权限请求的回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {
AndPermission.onRequestPermissionsResult(requestCode, permissions, grantResults, listener);
}
private PermissionListener listener = new PermissionListener() {
@Override
public void onSucceed(int requestCode, List<String> grantPermissions) {
//权限申请成功回调
if (requestCode == 100) {
//在这个方法里面去
processShow();
} else if (requestCode == 101) {
Toast.makeText(MainActivity.this, "权限申请失败", Toast.LENGTH_SHORT).show();
}
}
@Override
public 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() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
//设置屏幕的亮度
setScreenBrightness(seekBar.getProgress());
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
/**
* 设置屏幕的亮度
*/
private void setScreenBrightness(int process) {
//设置当前窗口的亮度值.这种方法需要权限android.permission.WRITE_EXTERNAL_STORAGE
WindowManager.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);
}