Kotlin开发Android:蓝光滤镜开关实现及相关问题咨询
安卓蓝光滤镜开/关功能实现相关说明
之前调用系统设置Intent报错的原因
android.settings.NIGHT_DISPLAY_SETTINGS是安卓7.0之后才加入的标准夜间模式设置跳转Action,不同厂商定制ROM、不同版本的系统对这个页面的入口封装存在差异,部分机型根本没有匹配这个Action的可响应Activity,因此会直接抛出“没有可处理该Intent的Activity”的报错- 这个跳转逻辑本质只是引导用户跳转到系统设置页面,无法实现应用内一键开启/关闭滤镜的核心需求
能否通过ContentResolver直接修改系统蓝光滤镜配置
普通第三方应用没有直接修改的权限,强行尝试写入一定会触发系统安全拦截抛出SecurityException
- 系统夜间模式的核心配置值,是存储在系统Settings.Global的全局存储区里,对应的键值分别为:
night_display_activated(布尔值,代表夜间模式是否处于开启状态)、night_display_color_temperature(整数,代表当前设置的色温值) - 这类属于系统级的受保护配置,只有持有WRITE_SECURE_SETTINGS特殊权限的应用,才能通过ContentResolver查询、修改对应的数值。普通应用既无法通过常规权限申请拿到这个能力,也很难适配全机型的参数读取逻辑
- 对刚接触安卓开发3天的新手来说,走系统权限适配的路径成本极高,不建议在这个方向投入时间
无特殊权限的可落地方案
- 不需要调用系统蓝光滤镜接口,就能实现等效的滤镜效果:在应用的根布局上层叠加一层半透明的暖色View,将View背景设置为低透明度的暖黄色,调整参数到视觉舒适度合适的阈值,就能达到和系统蓝光滤镜一致的视觉效果
- 开/关逻辑仅需控制这层View的显示与隐藏即可,不需要申请任何特殊权限,兼容所有安卓版本与厂商机型,开发成本极低
- 如果确实需要实现全局控制系统级蓝光滤镜的效果:一方面可以针对不同厂商的ROM做跳转适配,检测到没有对应系统设置入口时,将用户引导到对应机型的显示设置页手动开启;另一方面可以引导用户通过adb命令给应用授予WRITE_SECURE_SETTINGS权限,拿到权限后即可直接通过ContentResolver修改对应的全局配置值,这种方案上手门槛高,不适合入门阶段尝试
内容的提问来源于stack exchange,提问作者AT-martins
相关产品推荐
相关产品推荐

