private void setBrightness(int brightness) {
try {
IPowerManager power = IPowerManager.Stub.asInterface(
ServiceManager.getService("power"));
//Only set backlight value when screen is on
if (power != null && power.isScreenOn()) {
power.setBacklightBrightness(brightness);
}
} catch (RemoteException doe) {
}
}
该代码在settings模块,显然是android:sharedUserId="android.uid.system"(Androidmanifest.xml里面)。是因为这个原因所以能够访问。需要权限android.permission.DEVICE_POWER才能访问,并且该权限只限于使用系统固件签名的应用才能够授予,基本上只有一些系统应用才能够有该权限。所以权限问题导致了不能够授予给三方应用该权限。
但是360省电确能够调整屏幕亮度。看来还有其他方法。发现如下方法可行:
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // TODO Auto-generated method stub tv_brightnessPercent.setText((int)((progress/255.0) * 100) + "%"); int tmpInt = sb_modBrightness.getProgress(); Settings.System.putInt(XEnergyActivity.this.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, tmpInt); tmpInt = Settings.System.getInt(XEnergyActivity.this.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, -1); WindowManager.LayoutParams wl = getWindow().getAttributes(); float tmpFloat = (float) (tmpInt/255.0); if(tmpFloat > 0 && tmpFloat <= 1) { wl.screenBrightness = tmpFloat; } getWindow().setAttributes(wl); }
Settings.System.putInt(XEnergyActivity.this.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, tmpInt);
再调整当前窗口的亮度信息:
WindowManager.LayoutParams wl = getWindow().getAttributes(); float tmpFloat = (float) (tmpInt/255.0); if(tmpFloat > 0 && tmpFloat <= 1) { wl.screenBrightness = tmpFloat; } getWindow().setAttributes(wl);注意这里面的w1为float类型,最大值为1.0f。所以需要进行转换。如果没有下面这个调整当前活动屏幕亮度,需要开启关闭屏幕一次,上面的那个putInt函数才会起作用。
如果只需要调整程序内部屏幕亮度(比如一些阅读器)只需要后面的WindowManager设置即可。但是,当退出程序的时候,屏幕会恢复到系统本身设置的亮度。