基于全志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 分钟前
Gradle命令编译Android Studio工程项目并签名
android·ide·android studio·gradlew
problc42 分钟前
Flutter中文字体设置指南:打造个性化的应用体验
android·javascript·flutter
帅得不敢出门11 小时前
安卓设备adb执行AT指令控制电话卡
android·adb·sim卡·at指令·电话卡
我又来搬代码了13 小时前
【Android】使用productFlavors构建多个变体
android
德育处主任14 小时前
Mac和安卓手机互传文件(ADB)
android·macos
芦半山14 小时前
Android“引用们”的底层原理
android·java
迃-幵15 小时前
力扣:225 用队列实现栈
android·javascript·leetcode
大风起兮云飞扬丶15 小时前
Android——从相机/相册获取图片
android
Rverdoser16 小时前
Android Studio 多工程公用module引用
android·ide·android studio
aaajj16 小时前
[Android]从FLAG_SECURE禁止截屏看surface
android