Android之调节屏幕亮度(文末附源码),面试字节跳动被问Android屏幕适配方案

//小于0或大于1.0默认为系统亮度
window.attributes = window.attributes.apply {
screenBrightness = if (brightness > 1.0 || brightness < 0) -1.0F else brightness
}
}

改变窗口亮度的上下文必须是Activity,所以我给Activity加了一个扩展属性windowBrightness,它的值就是当前的窗口亮度,改变它的值就可以改变窗口亮度。它的范围是0~1.0,从0到1.0亮度逐渐增大;如果赋值为-1,那就表示跟随系统的亮度。

使用起来也很简单:

tvWindowBright.text = “当前窗口亮度=KaTeX parse error: Expected '}', got 'EOF' at end of input: …text = "当前窗口亮度=windowBrightness”
}

override fun onStartTrackingTouch(seekBar: SeekBar?) {
}

override fun onStopTrackingTouch(seekBar: SeekBar?) {
}

})

没有接触过Kotlin的小伙伴们可能会不知道这属性在Java中怎么用?毕竟我们连类名都没有看到。其实Kotlin会默认为Java生成一个“类名+kt”的类,属性则会生成getter和setter静态方法。所以在Java代码中只需要 这么写:

BrightnessUtilKt.getWindowBrightness(Activity);
BrightnessUtilKt.setWindowBrightness(Activity,brightness);

4、改变系统亮度

比起改变窗口亮度,改变系统亮度就要麻烦一点了。作为个人,我们改变世界都是不容易的,那么一个应用想要改变系统自然也不会轻而易举。

4.1 清单文件申请权限

第一步,我们需要到AndroidManifest.xml中申请权限:

之所以加上tools:ignore="ProtectedPermissions"是因为改变系统设置的权限一般只归系统App所有,所以编译器会报一个警告,加上这个可以忽略警告。

4.2 申请动态权限

如果你的手机系统是Android6.0以上的,那么还得动态申请权限。系统设置权限的动态申请有点特别,它需要跳转到系统的“可修改系统设置”界面,让用户决定是否允许当前应用修改系统设置,然后再在onActivityResult中处理回调结果。

我们在进入BrightnessActivity时就动态申请权限,代码如下:

//修改系统屏幕亮度需要修改系统设置的权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//如果当前平台版本大于23平台
if (!Settings.System.canWrite(mContext)) {
val intent = with(Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS)) {
data = Uri.parse(“package:$packageName”)
this
}
startActivityForResult(intent, RQ_WRITE_SETTINGS)
} else {
changeSystemBrightness()
}
} else {
//Android6.0以下的系统则直接修改亮度
changeSystemBrightness()
}

首先调用Settings.System.canWrite(Context)判断手机系统,Android6.0以下的直接允许修改亮度的操作;Android6.0以上的则要进一步判断是否已经获得了修改系统设置的权限,没有的话就要打开如下界面去设置。

修改系统设置界面

无论用户是否授权,我们都需要一个回调,这时onActivityResult就可以派上用场了:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
RQ_WRITE_SETTINGS -> {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Settings.System.canWrite(mContext)) {
shortToast(“已获取权限”)
changeSystemBrightness()
} else {
shortToast(“你拒绝了权限”)
}
}
}
}
}

代码很简单,就不做过多解释了。

4.3 去除自动亮度

前面我们虽然解决了权限问题,但是还要考虑到一个实际情况,那就是用户可能会设置了自动亮度,在这个前提下是无法改变系统屏幕亮度的。所以这里要做两步处理:

  1. 判断用户是否开启了自动亮度;
  2. 如果当前开启了自动亮度,则需要将其关闭。
4.3.1 判断是否自动亮度

我们在工具类中添加isAutoBrightness属性,它只有Getter方法,返回一个布尔值。这里调用Settings.System.getInt()方法,第二个参数传入 Settings.System.SCREEN_BRIGHTNESS_MODE表示我们要获取系统屏幕亮度模式,如果是Settings.System.SCREEN_BRIGHTNESS_MODE,则表示当前自动亮度模式。

val isAutoBrightness:Boolean
get() = try {
Settings.System.getInt(
AndUtil.appContext.contentResolver,
Settings.System.SCREEN_BRIGHTNESS_MODE
) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
} catch (e: Settings.SettingNotFoundException) {
e.printStackTrace()
false
}

4.3.2 设置开启和关闭自动亮度

前面我们获取了系统亮度模式,通过设置它的值,我们就可以控制自动亮度模式的开关了。
在工具类中创建一个setAutoBrightness()函数,如果设置成功就返回true。这里用到的是Settings.System.putInt(),第二个参数即为我们要设置的亮度模式。当参数enable为true时就是自动模式了。

/**

  • 设置是否开启自动亮度
  • @param enable : 为true时开启,false时关闭
  • @return 设置成功返回true
    */
    fun setAutoBrightness(enable: Boolean) = Settings.System.putInt(
    AndUtil.appContext.contentResolver, Settings.System.SCREEN_BRIGHTNESS_MODE,
    if (enable) Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC else Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL
    )

4.4 封装改变系统屏幕亮度属性

现在我们总算可以编写修改系统亮度的代码了。跟修改窗口亮度一样,我们这里也使用了一个属性,命名为systemBrightness

/**

  • 系统屏幕亮度,需要WRITE_SETTINGS权限,并在代码中申请系统设置权限
  • 范围为0~255
    */
    var systemBrightness

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。

[外链图片转存中…(img-xwQgBXia-1711913997440)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

  • 43
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值