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

简介: 本文介绍了在全志H713 Android 11平台上为TvSettings应用添加HDMI CEC功能的默认设置值的方法,通过修改SettingsProvider的源码和配置文件来实现默认值的设置,并提供了详细的步骤和测试结果。

篇头

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

一、问题及需求

1.1 需求

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

1.2 问题

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

1.3 CEC设置界面

  • TvSettings->Device Preferences->Inputs

image

二、源码分析

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
 @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个则找不到
    <!-- 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
        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
                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的逻辑一致
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的结果如下,可见已为我们添加了相关字段
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都是自定义的
     <!-- 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
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 测试结果

  • 烧录后,第一次开机,测试结果如下
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

image

相关文章
|
7月前
|
XML API PHP
Android使用XML-RPC实现blog客户端
Android使用XML-RPC实现blog客户端
63 2
|
7月前
|
Java Android开发 开发者
Android10 修改开发者选项中动画缩放默认值
Android10 修改开发者选项中动画缩放默认值
213 0
|
4月前
|
Java Android开发
全志 Android 11:实现响应全局按键
本文介绍了在全志平台Android 11上实现响应全局按键的方法,通过修改`TvWindowManager.java`来全局拦截特定的热键事件,并在`FocusActivity`中处理这些事件以启动调焦界面和控制步进电机调整焦距。
43 2
|
4月前
|
Java Android开发 芯片
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
本文介绍了如何将基于全志H713芯片的AOSP Android源码导入Android Studio以解决编译和编码问题,通过操作步骤的详细说明,展示了在Android Studio中利用代码提示和补全功能快速定位并修复编译错误的方法。
186 0
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
|
4月前
|
XML Android开发 UED
"掌握安卓开发新境界:深度解析AndroidManifest.xml中的Intent-filter配置,让你的App轻松响应scheme_url,开启无限交互可能!"
【8月更文挑战第2天】在安卓开发中,scheme_url 通过在`AndroidManifest.xml`中配置`Intent-filter`,使应用能响应特定URL启动或执行操作。基本配置下,应用可通过定义特定URL模式的`Intent-filter`响应相应链接。
119 12
|
4月前
|
Shell Android开发
安卓scheme_url调端:在AndroidManifest.xml 中如何配置 Intent-filter?
为了使Android应用响应vivo和oppo浏览器的Deep Link或自定义scheme调用,需在`AndroidManifest.xml`中配置`intent-filter`。定义启动的Activity及其支持的scheme和host,并确保Activity可由外部应用启动。示例展示了如何配置HTTP/HTTPS及自定义scheme,以及如何通过浏览器和adb命令进行测试,确保配置正确无误。
|
4月前
|
开发工具 Android开发 git
全志H713 Android 11 :给AOSP源码,新增一个Product
本文介绍了在全志H713 Android 11平台上新增名为myboard的产品的步骤,包括创建新的device目录、编辑配置文件、新增内核配置、记录差异列表以及编译kernel和Android系统的详细过程。
200 0
|
6月前
|
Android开发 开发者
Android UI设计中,Theme定义了Activity的视觉风格,包括颜色、字体、窗口样式等,定义在`styles.xml`。
【6月更文挑战第26天】Android UI设计中,Theme定义了Activity的视觉风格,包括颜色、字体、窗口样式等,定义在`styles.xml`。要更改主题,首先在该文件中创建新主题,如`MyAppTheme`,覆盖所需属性。然后,在`AndroidManifest.xml`中应用主题至应用或特定Activity。运行时切换主题可通过重新设置并重启Activity实现,或使用`setTheme`和`recreate()`方法。这允许开发者定制界面并与品牌指南匹配,或提供多主题选项。
94 6
|
6月前
|
XML 存储 JavaScript
50. 【Android教程】xml 数据解析
50. 【Android教程】xml 数据解析
74 1
|
7月前
|
Android开发
android string.xml文件中的整型和string型代替
android string.xml文件中的整型和string型代替
53 0