基于全志H713 Android 11:给TvSettings添加default.xml默认值

篇头

如今去过厂家的SOC,尤其是国产芯片,在设计其Android AOSP系统的时候,基本都会遵循谷歌的架构和规范。本文基于全志H713 Android 11平台,介绍如何给谷歌标准版的TvSettings添加default.xml默认值。

一、问题及需求

1.1 需求

给投影的HDMI CEC功能,配置几个默认值;

1.2 问题

  • TvSettings的默认值在哪配置,如何配置?

1.3 CEC设置界面

  • TvSettings->Device Preferences->Inputs

二、源码分析

2.1 查找思路

根据UI上的字符串,如"TV auto set language",顺藤摸瓜,在代码中找到set value 的地方,之后进一步找到配置文件位置。

2.2 TvSettings 数据设置

  • 如下,找到了点击CEC界面开关后,写入值的地方
  • 从 writeCecOption(Settings.Global.HDMI_CONTROL_AUTO_SET_LANGUAGE, mTvAutoSetLanguage.isChecked());等语句,可以得知值存储在Settings Global数据库中。
  • A:\works\aw\android\packages\apps\TvSettings\Settings\src\com\android\tv\settings\system\InputsFragment.java
Plain 复制代码
 @Override
    public boolean onPreferenceTreeClick(Preference preference) {
        final String key = preference.getKey();
        if (key == null) {
            return super.onPreferenceTreeClick(preference);
        }
        switch (key) {
            case KEY_HDMI_CONTROL:
                writeCecOption(Settings.Global.HDMI_CONTROL_ENABLED, mHdmiControlPref.isChecked());
                /// AW CODE: [feat] support hdmi cec with more switches
                setPreferncesEnabled(mHdmiControlPref.isChecked());
                /// AW:add end
                return true;
            case KEY_DEVICE_AUTO_OFF:
                writeCecOption(Settings.Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED,
                        mDeviceAutoOffPref.isChecked());
                return true;
            case KEY_TV_AUTO_ON:
                writeCecOption(Settings.Global.HDMI_CONTROL_AUTO_WAKEUP_ENABLED,
                        mTvAutoOnPref.isChecked());
                return true;
            /// AW CODE: [feat] support hdmi cec with more switches
            case KEY_TV_AUTO_SET_LANGUAGE:
                writeCecOption(Settings.Global.HDMI_CONTROL_AUTO_SET_LANGUAGE,
                        mTvAutoSetLanguage.isChecked());
                return true;
            case KEY_TV_AUTO_INPUT_PASSTHROUGH:
                writeCecOption(Settings.Global.HDMI_CONTROL_AUTO_INPUT_PASSTHROUGH,
                        mTvAutoInputPassThrough.isChecked());
                return true;
            /// AW:add end
            /// AW CODE: [feat] add item for AwLiveTv recovery
            case KEY_INPUT_RECOVERY:
                writeCecOption(Settings.Global.INPUT_RECOVERY,
                        mInputRecovery.isChecked());
                return true;
            /// AW:add end
        }
        return super.onPreferenceTreeClick(preference);
    }

2.3 配置文件

  • 位置:A:\works\aw\android\frameworks\base\packages\SettingsProvider\res\values\defaults.xml
  • 新的问题:从配置文件中,只找到1个HDMI CEC的开关的默认值,其余5个则找不到
Plain 复制代码
    <!-- Default for setting for Settings.Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED -->
    <bool name="def_hdmiControlAutoDeviceOff">false</bool>

2.4 Global 枚举定义的地方

  • 位置 A:\works\aw\android\frameworks\base\core\java\android\provider\Settings.java
  • 在这个文件里,定义了Global.xxxx枚举,例如Settings.Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED
Plain 复制代码
        public static final String HDMI_CONTROL_AUTO_WAKEUP_ENABLED =
                "hdmi_control_auto_wakeup_enabled";

        /**
         * Whether TV will also turn off other CEC devices when it goes to standby mode.
         * (0 = false, 1 = true)
         *
         * @hide
         */
        public static final String HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED =
                "hdmi_control_auto_device_off_enabled";

        /// AW CODE: [feat] HDMI-CEC: supprot device auto power on
        /**
         * Whether TV will also turn on other CEC devices when it goes to wakeup mode.
         * (0 = false, 1 = true)
         *
         * @hide
         */
        public static final String HDMI_CONTROL_AUTO_DEVICE_ON_ENABLED =
                "hdmi_control_auto_device_on_enabled";
        /// AW: add end.

2.5 加载默认值的地方

  • 位置:android\frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\SettingsProvider.java
  • 通过关键字符串的查找,可以定位到默认值加载的地方,如下即使用字符串:def_hdmiControlAutoDeviceOff找到的
  • 大致阅读此处代码,可知此处的作用就是在Settings.Gloabl数据表中插入新的字段,并赋予默认值,而默认值就是来自default.xml
Plain 复制代码
                if (currentVersion == 190) {
                    // Version 190: get HDMI auto device off from overlay
                    final SettingsState globalSettings = getGlobalSettingsLocked();
                    final Setting currentSetting = globalSettings.getSettingLocked(
                            Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED);
                    if (currentSetting.isNull()) {
                        globalSettings.insertSettingLocked(
                                Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED,
                                getContext().getResources().getBoolean(
                                        R.bool.def_hdmiControlAutoDeviceOff) ? "1" : "0",
                                null, true, SettingsState.SYSTEM_PACKAGE_NAME);
                    }
                    currentVersion = 191;
                }

                // vXXX: Add new settings above this point.

2.6 查看实时数据

2.6.1 查看默认数据

  • 烧录镜像后,不要操作UI开关,可查询到如下数据;
  • 可得知,此时,数据库中只有一个HDMI的开关默认值,和楼上default.xml与SettingsProvider.java的逻辑一致
Plain 复制代码
h713-tuna_p3:/ # settings list global  | grep hdmi
hdmi_control_auto_device_off_enabled=1
h713-tuna_p3:/ # pwd

2.6.2 写入值

  • 将UI里的HDMI CEC开关,全部关闭,再打开
  • 查询DB的结果如下,可见已为我们添加了相关字段
Plain 复制代码
h713-tuna_p3:/ # settings list global  | grep hdmi
hdmi_control_auto_device_off_enabled=1
hdmi_control_auto_input_passthrough=1
hdmi_control_auto_set_language=1
hdmi_control_auto_wakeup_enabled=1
hdmi_control_enabled=1
h713-tuna_p3:/ # pwd

三、举例:添加两个HDMI CEC开关的默认值

3.1 添加默认值:defaults.xml

  • A:\works\aw\android\frameworks\base\packages\SettingsProvider\res\values\defaults.xml
  • 以下def_xxx都是自定义的
Plain 复制代码
     <!-- Default for setting for  Settings.Global.HDMI_CONTROL_ENABLED -->
     <bool name="def_hdmi_control_enabled">false</bool>

     <!-- Default for setting for  Settings.Global.HDMI_CONTROL_AUTO_SET_LANGUAGE -->
     <bool name="def_hdmi_control_auto_set_language">false</bool>

3.2 加载默认值:SettingsProvider.java

  • A:\works\aw\android\frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\SettingsProvider.java
  • 如下,找到if (currentVersion == 190),按格式,追加我们需要设定的两个def_xxxx 默认值
  • R.bool.def_hdmi_control_enabled =>Global.HDMI_CONTROL_ENABLED
  • R.bool.def_hdmi_control_auto_set_language=>Global.HDMI_CONTROL_AUTO_SET_LANGUAGE
Plain 复制代码
if (currentVersion == 191) {
                    // 
                    final SettingsState globalSettings = getGlobalSettingsLocked();
                    final Setting currentSetting = globalSettings.getSettingLocked(
                            Global.HDMI_CONTROL_ENABLED);
                    if (currentSetting.isNull()) {
                        globalSettings.insertSettingLocked(
                                Global.HDMI_CONTROL_ENABLED,
                                getContext().getResources().getBoolean(
                                        R.bool.def_hdmi_control_enabled) ? "1" : "0",
                                null, true, SettingsState.SYSTEM_PACKAGE_NAME);
                    }
                    currentVersion = 192;
                }

                if (currentVersion == 192) {
                    // 
                    final SettingsState globalSettings = getGlobalSettingsLocked();
                    final Setting currentSetting = globalSettings.getSettingLocked(
                            Global.HDMI_CONTROL_AUTO_SET_LANGUAGE);
                    if (currentSetting.isNull()) {
                        globalSettings.insertSettingLocked(
                                Global.HDMI_CONTROL_AUTO_SET_LANGUAGE,
                                getContext().getResources().getBoolean(
                                        R.bool.def_hdmi_control_auto_set_language) ? "1" : "0",
                                null, true, SettingsState.SYSTEM_PACKAGE_NAME);
                    }
                    currentVersion = 193;
                }

                // vXXX: Add new settings above this point.

3.3 测试结果

  • 烧录后,第一次开机,测试结果如下
Plain 复制代码
C:\Users\szhou\Desktop>adb shell
h713-tuna_p3:/ # settings list global  | grep hdmi
hdmi_control_auto_device_off_enabled=0
hdmi_control_auto_set_language=0
hdmi_control_enabled=0
h713-tuna_p3:/ #

3.4 运行效果图

  • 效果如下图,CEC总开关【HDMI control】和子开关【TV auto set language】均被设置成了FALSE
相关推荐
还鮟2 小时前
CTF Web的数组巧用
android
小蜜蜂嗡嗡4 小时前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio
aqi004 小时前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体
zhangphil5 小时前
Android理解onTrimMemory中ComponentCallbacks2的内存警戒水位线值
android
你过来啊你6 小时前
Android View的绘制原理详解
android
移动开发者1号9 小时前
使用 Android App Bundle 极致压缩应用体积
android·kotlin
移动开发者1号9 小时前
构建高可用线上性能监控体系:从原理到实战
android·kotlin
ii_best13 小时前
按键精灵支持安卓14、15系统,兼容64位环境开发辅助工具
android
美狐美颜sdk14 小时前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
恋猫de小郭18 小时前
Meta 宣布加入 Kotlin 基金会,将为 Kotlin 和 Android 生态提供全新支持
android·开发语言·ios·kotlin