设置中添加UI设置系统默认NTP服务器

news2024/12/24 9:38:20

经常遇到客户在内网中使用无法与ntp服务器通讯导致系统时间错乱,他们想自己替换ntp地址要么是用adb命令要么是重新刷机,这样比较浪费客户的时间。
看了一下Android系统中选择ntp地址的逻辑,发现在framework中已经有了个ntp地址那么系统将会选择framework中默认的ntp服务器作为系统ntp服务器,如果framework中没有那么将会选择settings数据库中存储的ntp服务器作为系统ntp服务器
framework/base/core/java/android/util/NtpTrustedTime.java在这里插入图片描述
根据上面逻辑咋们可以推断,是可以在app中通过写数据库的值来更改系统的ntp地址。
以下代码是在设置中添加UI来更改ntp地址(基于Android10)

vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values-zh-rCN/strings.xml
+	<string name="date_and_time_ntp_server">NTP服务器</string>
vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/strings.xml
+	<string name="date_and_time_ntp_server">NTP server</string>
vendor/mediatek/proprietary/packages/apps/MtkSettings/res_ext/xml/date_time_ext_prefs.xml
+	<com.android.settings.widget.ValidatedEditTextPreference
+        android:key="ntp_server"
+        android:title="@string/date_and_time_ntp_server"
+        android:summary="@string/summary_placeholder"
+		settings:controller="com.android.settings.datetime.NtpServerPreferenceController"
+        settings:enableCopying="true"/>

新建文件
vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/datetime/NtpServerPreferenceController.java
package com.android.settings.datetime;


import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.text.SpannedString;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.widget.ValidatedEditTextPreference;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnCreate;
import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
import android.util.Log;


public class NtpServerPreferenceController extends BasePreferenceController
        implements ValidatedEditTextPreference.Validator,
        Preference.OnPreferenceChangeListener,
        LifecycleObserver,
        OnSaveInstanceState{ 
		
    private String defaultServer;
	private String secureServer = null;
	private String mPendingNtpName;
    private ValidatedEditTextPreference mPreference;
	private String TAG = "NtpServerPreferenceController";
	
    public NtpServerPreferenceController(Context context, String key) {
        super(context, key);
		//Log.d(TAG,"NtpServerPreferenceController is run..");
		initializeDeviceName();
    }

    private void initializeDeviceName(){
		defaultServer = Settings.Global.getString(mContext.getContentResolver(), Settings.Global.NTP_SERVER);
	    //Log.d(TAG,"defaultserver=" + defaultServer);
		if(defaultServer == null){
			Log.d(TAG,"defaultservr is null");
		}
		//Settings.Global.getString(resolver, Settings.Global.NTP_SERVER);
	}

    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
		mPreference = screen.findPreference(getPreferenceKey());
		final CharSequence ntpserverName = getSummary();
		if(ntpserverName != null){ 
			//Log.d(TAG,"ntpserverName=" + ntpserverName);
			mPreference.setSummary(ntpserverName);
			mPreference.setText(ntpserverName.toString());
			mPreference.setValidator(this);
		} else {
		    Log.d(TAG,"ntpserverName is null");
		}

    }
	
	@Override
	public CharSequence getSummary() {
	     return defaultServer;
	}
	
	public void updateDeviceName(boolean update) {
	 
	}
	
	private void setSettingsGlobalDeviceName(String ntpserver) {
	    Settings.Global.putString(mContext.getContentResolver(), Settings.Global.NTP_SERVER,ntpserver);
		//Log.d(TAG,"set ntpserver is:" + ntpserver);
	}
 
	
	@Override
    public int getAvailabilityStatus() {
        return 0;
    }
	
	@Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
		//Log.d(TAG,"newValue=" + newValue);
		mPendingNtpName = (String) newValue; 
		setSettingsGlobalDeviceName(mPendingNtpName);
        return true;
    }
	
	@Override
    public boolean isTextValid(String deviceName) {
        // BluetoothNameDialogFragment describes BT name filter as a 248 bytes long cap.
        // Given the restrictions presented by the SSID name filter (32 char), I don't believe it is
        // possible to construct an SSID that is not a valid Bluetooth name.
        return true;
    }
	

    @Override
    public void onSaveInstanceState(Bundle outState) {

    }
}

实际效果如下:
在这里插入图片描述
设置ntp地址后需要重启系统新设置的ntp地址才有效

此功能实现并无难度,好在方便了用户使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1127119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

window10彻底关闭系统管理员控制(所有软件以管理员身份运行)

window10彻底关闭系统管理员控制&#xff08;所有软件以管理员身份运行&#xff09; gpedit.msc》计算机配置》windows设置》安全设置》安全选项》 1.用户账户控制&#xff1a;以管理员批准模式运行所有管理员 2.用户账户控制&#xff1a;用于内置管理员账户的管理员批准模式 1…

GeoHash分享

写在前边 复制的一个内部分享&#xff0c;所以可能更偏向PPT性质&#xff0c;本文提出的问题&#xff0c;在末尾参考材料中都会有所提及&#xff0c;包括更深层次的实现原理和各大API对于GeoHash的优化。感兴趣的读者可以拓展看一下。 START GeoHash是一种地址编码&#xff…

又被罚了~新生支付

近日&#xff0c;中国人民银行海南省分行公布行政处罚公示信息内容&#xff0c;具有清算机构新生支付有限公司因存违规行为领罚款单。 行政处罚决定书批准文号“琼银罚决字〔2023〕22号”表明&#xff0c;新生支付有限公司&#xff08;通称“新生支付”&#xff09;存有三项违…

深入 Maven:构建杰出的软件项目的完美工具

掌握 Meven&#xff1a;构建更强大、更智能的应用程序的秘诀 Maven1.1 初识Maven1.1.1 什么是Maven1.1.2 Maven的作用 02. Maven概述2.1 Maven介绍2.2 Maven模型2.3 Maven仓库2.4 Maven安装2.4.1 下载2.4.2 安装步骤 03. IDEA集成Maven3.1 配置Maven环境3.1.1 当前工程设置3.1.…

PX4-Autopilot下载与编译

文章目录 1 Git clone 代码2 下载子模块3 编译4 可能遇到的问题参考 1 Git clone 代码 Github Repository 链接&#xff1a;PX4-Autopilot 查看现有版本&#xff1a; 在终端用命令下载&#xff0c;-b表示branch git clone -b v1.14.0 https://github.com/PX4/PX4-Autopilot.…

最新Workerman 在线客服系统源码/附搭建教程-ThinkPHP网站在线客服系统源码

源码简介&#xff1a; Workerman开发的Ai智能客服在线客服系统网站源码,里面有附带安装教程文档搭建教程。它是最新Workerman 在线客服系统源码。 源码链接&#xff1a; 网盘源码 密码&#xff1a;hma8 源码特点&#xff1a; 作为网站在线客服系统源码&#xff0c;它有下…

【Java】【PAT】Basic Level 1018 锤子剪刀布

题目 1018 锤子剪刀布 作者 CHEN, Yue 单位 浙江大学 大家应该都会玩“锤子剪刀布”的游戏&#xff1a;两人同时给出手势&#xff0c;胜负规则如图所示&#xff1a; 现给出两人的交锋记录&#xff0c;请统计双方的胜、平、负次数&#xff0c;并且给出双方分别出什么手势的胜…

Python 中的函数包装器:模型运行时和调试

一、说明 在Python中&#xff0c;函数包装器被称为装饰器&#xff0c;它们在数据科学中具有各种有用的应用。本指南介绍如何使用它们来管理模型运行时和调试。 二、函数的封装 函数包装器是用于修改函数行为的有用工具。在Python中&#xff0c;它们被称为装饰器。装饰器允许我们…

设计模式:建造者模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《策略模式》 下一篇《适配器模式》 简介&#xff1a; 建造者模式&#xff0c;它是一种对象构建模式&#xff0c;它提供了一种构建对象的最佳方式。这种模式适用于当对象的构建过程需要涉及到多个部分&#xff…

观察者模式 vs 发布-订阅模式:两种设计模式的对决!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一…

设备标识牌不锈钢二维码制作

一、设备标识牌二维码好处&#xff1a; 1、设备信息管理&#xff1a;传统标识牌容纳的信息有限&#xff0c;将二维码用于设备标识牌&#xff0c;可实现设备信息丰富展示、设备文档资料可存储二维码云端、微信扫码检查查阅&#xff0c;无需携带纸质&#xff0c;同时凡尔码云端后…

JSX 动态类名控制

学习目标&#xff1a; 根据需求判断是否显示某个类名的样式 实现&#xff1a; 使用三元表达式或逻辑&&运算 import ./app.css; function App() {const color1 trueconst color2 truereturn (<div className"App">1. 三元&#xff1a;<div classN…

android项目实践说明

权限与存储 本地读取文件&#xff08;IO流&#xff09; 网络传输&#xff08;Socket通信&#xff09; 串口通信&#xff08;串行传输接口通信&#xff09; 而串口通信是应用在智能家居和单片机通信的场景&#xff0c;人脸识别门禁&#xff0c;利用串口控制门开关&#xff0…

SHELL基础编程

文章目录 SHELL基础查看有哪些解释器使用usermod修改用户解释器BASH基本特性 shell脚本的设计与运行编写问世脚本脚本格式规范执行shell脚本方法一方法二实验 变量自定义变量环境变量位置变量预定义变量 变量的扩展运用多种引号的区别双引号的应用单引号的应用反撇号或$()的应用…

leetcode 29

dividend 和 divisor都是int 类型&#xff0c;返回值也是int类型&#xff0c; 在C中&#xff0c;int类型表示整数类型&#xff0c;其范围取决于具体的实现。通常情况下&#xff0c;int类型的范围为-2147483648到2147483647&#xff0c;即-231到231-1。这是因为int类型通常为32…

Fwupd 1.9.6 Linux 固件升级工具已于近日发布

导读Fwupd 1.9.6 Linux 固件升级工具已于近日发布&#xff0c;支持更多硬件设备、新功能和十几处错误修复。 Fwupd 1.9.6 是在 fwupd 1.9.5 发布一个月后推出的&#xff0c;它引入了对更多硬件设备的支持&#xff0c;包括 AMD dGPUs Navi3x 及更高版本、Star Labs StarBook Mk …

假脸检测:Exploring Decision-based Black-box Attacks on Face Forgery Detection

论文作者&#xff1a;Zhaoyu Chen,Bo Li,Kaixun Jiang,Shuang Wu,Shouhong Ding,Wenqiang Zhang 作者单位&#xff1a;Fudan University;Yiwu Research Institute of Fudan University 论文链接&#xff1a;http://arxiv.org/abs/2310.12017v1 内容简介&#xff1a; 1&…

GeoServer改造Springboot源码二(数据源管理设计)

一、界面设计 图 1数据源管理列表 图 2选择数据源类型 1、PostGis 图 3新增PostGis数据源 2、Shapefile

Delay问题分析

【在刚刚过去的SAFe Scrum Master课程上有学员提出了Delay问题&#xff0c;进行了重点分析&#xff0c;颇有意义&#xff0c;因此整理得到本文】 大致背景情况&#xff1a;To B软件开发&#xff0c;已经启用了敏捷开发&#xff0c;迭代周期2周。 问题&#xff1a;经常出现Del…

因修改 MySQL 复制账号密码导致主从复制中断

作者 | JiekeXu 来源 |公众号 JiekeXu DBA之路&#xff08;ID: JiekeXu_IT&#xff09; 如需转载请联系授权 | (个人微信 ID&#xff1a;JiekeXu_DBA) 大家好&#xff0c;我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看因修改 MySQL 复制账号密码导致主从复制异常&am…