Android:设置屏幕亮度的几种方法

Android:设置屏幕亮度的几种方法,有需要的朋友可以参考下。


首先,设置屏幕亮度分为两种:1、设置系统的亮度,即是在手机的设置->亮度中的设置。2、设置应用的亮度,即某一个activity的亮度

一:

设置系统亮度,显然,设置系统亮度是需要系统权限的,所以这个只适用于进行源码开发的猿们,这个怎么做应该不用我啰嗦了,有3中常规方法:

设置系统亮度,主要通过电源管理操作,即对上层开放的PowerManager,所以第一种方法即是调用PowerManager中的方法

1。因为查看PowerManager源码可以知道,他的设置backlight的函数是private的,所以使用反射来调用:

private void setBrightnessReflectPowerManager(int brightness) {
try {
Class pmClass = Class.forName(pm.getClass().getName());
Method method = pmClass.getDeclaredMethod("setBacklightBrightness",
int.class);//此处的函数名setBacklightBrightness看具体的源码决定
logd("can setBacklightBrightness() access? " + method.isAccessible());
method.setAccessible(true);
method.invoke(pm, brightness);
} catch (Exception e) {
e.printStackTrace();
}
}

2。在查看源码的时候可以发现,PowerManager其实由对应的PowerManagerService进行具体的动作实现,所以咱们的第二种方法即是调用PowerManagerService中的方法来实现:

private void setBrightnessReflectPowerManagerService(int brightness) {
try {
// 得到PowerManager类对应的Class对象
Class pmClass = Class.forName(pm.getClass().getName());
// 得到PowerManager类中的成员mService(mService为PowerManagerService类型)
Field field = pmClass.getDeclaredField("mService");
logd("IPowerManager can be access? " + field.isAccessible());
field.setAccessible(true);
// 实例化mService
Object iPM = field.get(pm);
// 得到PowerManagerService对应的Class对象
Class iPMClass = Class.forName(iPM.getClass().getName());
/*
* 得到PowerManagerService的函数setTemporaryScreenBrightnessSettingOverride对应的Method对象,

* setTemporaryScreenBrightnessSettingOverride,这个函数名由具体的源码文件决定
* PowerManager的函数setBacklightBrightness实现在PowerManagerService中
*/
Method method = iPMClass.getDeclaredMethod(
"setTemporaryScreenBrightnessSettingOverride", int.class);
method.setAccessible(true);
// 调用实现PowerManagerService的setTemporaryScreenBrightnessSettingOverride
method.invoke(iPM, brightness);
} catch (Exception e) {
e.printStackTrace();
}
}

3。再看PowerManagerService.java,发现他是继承与IPowerManager.Stub,所以,咱们也可以使用IPowerManager来实现:

private void setBrightness(int brightness) {
try {//
IPowerManager power = IPowerManager.Stub.asInterface(ServiceManager
.getService("power"));
if (power != null) {
logd("set brightness to " + brightness);
if (power.isScreenOn()) {
power.setTemporaryScreenBrightnessSettingOverride(brightness);

//setTemporaryScreenBrightnessSettingOverride,这个函数名由具体的源码文件决定
} else {
power.setTemporaryScreenBrightnessSettingOverride(-1);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

系统亮度的值一般在0-255之间,但是系统会设置一个最小值,比如30,所以我们在调用上述3个方法的时候,即便你传入0,但是系统依旧只是将当前亮度设置最低值,而不是0(即黑屏),所以这里再介绍一个直接写文件的方法去实现,一般貌似也不需要用,

private void setBirghtnessWriteFile(int bightness) {
String command = "echo 0 > /sys/class/leds/lcd-backlight/brightness";
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(command);
}

因为今天忘记带这个平台的手机来,所以这个方法没有试过,不过我有一个同事是用过可用的,具体的大家自己琢磨下就好了。

咱们也可以在cmd命令行中adb shell后去echo /sys/class/leds/lcd-backlight/brightness查看当前屏幕亮度值

二:

下面来看第二种,只修改当前activity的亮度,这个就相对简单点了,只要设置WindowManager.LayoutParams.screenBrightness值在0-1之间即可

private void setCurrentActivityBrightness () {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness = 0.5;
getWindow().setAttributes(lp);
}

以上的方法传入的参数都是整数,猿们也可以用个seekbar什么的来作为界面,而不是用干巴巴的edittext和button,这个大家就自己添加了

你可能感兴趣的:(linux命令)