关于Android屏幕亮度的一个需求,嵌入式音视频开发书籍

但是啊,系统亮度是需要权限的,但是获取权限会影响用户体验,所以直接PASS。

如何解决?

然后发现了一个可以监听系统亮度发生变化的方法。

//监听屏幕亮度变化

getContentResolver().registerContentObserver(

Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS),

true,

mBrightnessObserver);

/*

  • 屏幕亮度变化监听的回调

  • */

private ContentObserver mBrightnessObserver = new ContentObserver(new Handler()) {

@Override

public void onChange(boolean selfChange) {

// 当前系统的屏幕亮度(当用户改变了系统亮度后,会回调到该方法)

int currentValue = Settings.System.getInt(getContentResolver(),Settings.System.SCREEN_BRIGHTNESS);

}

};

最终解决!

在监听里,当监听到用户第一次主动去修改屏幕亮度时,调用setActivityBrightness(2)让我们设置的屏幕亮度失效即可。

//在进入Act的时候调用

setActivityBrightness(1.0f)

//将当前Act的亮度设置为最亮(这个时候用户修改系统亮度是没法修改的)

//然后在刚才的监听里这样写

private ContentObserver mBrightnessObserver = new ContentObserver(new Handler()) {

@Override

public void onChange(boolean selfChange) {

//isSettingSystemLight为标记,只有当用户第一次主动修改屏幕亮度后设置,再次碰触就直接抛出,已减少性能损耗。

if (isSettingSystemLight) {

//如果标记用户已主动修改过屏幕亮度,就抛出

return;

}

//这里随便什么值,只要大于1.0f即可(这个时候当前Act的亮度会跟随用户的修改而变化)

setActivityBrightness(2);

isSettingSystemLight = true;

}

};

好了,讲到这里其实可以实现需求了,如果还有兴趣的可以向下看。

原理是什么?

具体什么原理,我也不知道,但是可以知道的是,在上边的监听模块,我本来的逻辑是,在拿到用户修改了系统亮度的回调后,我再调用

//其中currentValue是回调里获取的当前系统亮度,最大为255。然后出除一下,就可以得到当前的值了

setActivityBrightness(currentValue % 255)

一波操作后,测试了一下,发现,可以用哎。

然后又测试了一下,吧亮度调到了最低,发现,嗯???不对啊。

其实是我搞错了,我写成了

//这里应该是除以,但是我写成了取余,闹了个小乌龙,但是也解决了大问题。

setActivityBrightness(currentValue / 255)

推荐学习资料


  • 脑图
    关于Android屏幕亮度的一个需求,嵌入式音视频开发书籍_第1张图片
    关于Android屏幕亮度的一个需求,嵌入式音视频开发书籍_第2张图片
    关于Android屏幕亮度的一个需求,嵌入式音视频开发书籍_第3张图片
    由于文章篇幅问题点击链接查看详细文章以及获取学习笔记:GitHub

er/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)**

你可能感兴趣的:(程序员,面试,移动开发,android)