首页 > 其他分享 >TimeZoneDetectorService浅析--上

TimeZoneDetectorService浅析--上

时间:2024-01-26 12:07:49浏览次数:32  
标签:getDetectionMode 01 23 -- 53 TimeZoneDetectorService currentUserConfig null 浅析

一:问题描述:

客户有一个关闭通话功能的需求,根据MTK的配置方法关闭了大概8个宏开关后,实现通话功能,但是导致插好sim卡开机后,时间和时区不能更新的问题。

二:问题分析:

(1).MTK的日志分析,可以确认为时间已经更新,但是时区确实是没有更新

//收到NITZ

AT      : [0] AT< +CTZEU: "+32",0,"2024/01/23,01:52:53" (RIL_URC_READER, tid:518565289216)
SST     : NITZ: 24/01/23,01:52:53+32,0,39429, ageMs=0 start=41502 delay=2073

//更新时间

NitzStateMachineImpl: doTimeZoneDetection: countryIsoCode=null, nitzSignal=NitzSignal{mReceiptElapsedMillis=PT39.429S, mNitzData=NitzData{mOriginalString=24/01/23,01:52:53+32,0, mZoneOffset=28800000, mDstOffset=0, mCurrentTimeMillis=1705974773000, mEmulatorHostTimeZone=null}, mAgeMillis=0}, suggestion=TelephonyTimeZoneSuggestion{mSlotIndex=0, mZoneId='null', mMatchType=0, mQuality=0, mDebugInfo=[getTimeZoneSuggestion: nitzSignal=NitzSignal{mReceiptElapsedMillis=PT39.429S, mNitzData=NitzData{mOriginalString=24/01/23,01:52:53+32,0, mZoneOffset=28800000, mDstOffset=0, mCurrentTimeMillis=1705974773000, mEmulatorHostTimeZone=null}, mAgeMillis=0}, countryIsoCode=null, Detection reason=handleNitzReceived(NitzSignal{mReceiptElapsedMillis=PT39.429S, mNitzData=NitzData{mOriginalString=24/01/23,01:52:53+32,0, mZoneOffset=28800000, mDstOffset=0, mCurrentTimeMillis=1705974773000, mEmulatorHostTimeZone=null}, mAgeMillis=0})]}, reason=handleNitzReceived(NitzSignal{mReceiptElapsedMillis=PT39.429S, mNitzData=NitzData{mOriginalString=24/01/23,01:52:53+32,0, mZoneOffset=28800000, mDstOffset=0, mCurrentTimeMillis=1705974773000, mEmulatorHostTimeZone=null}, mAgeMillis=0})
AlarmManagerService: Setting time of day to sec=1705974775

//detect timezone, 但是没有更新时区

NitzStateMachineImpl: doTimeZoneDetection: countryIsoCode=cn, nitzSignal=NitzSignal{mReceiptElapsedMillis=PT39.429S, mNitzData=NitzData{mOriginalString=24/01/23,01:52:53+32,0, mZoneOffset=28800000, mDstOffset=0, mCurrentTimeMillis=1705974773000, mEmulatorHostTimeZone=null}, mAgeMillis=0}, suggestion=TelephonyTimeZoneSuggestion{mSlotIndex=0, mZoneId='Asia/Shanghai', mMatchType=3, mQuality=1, mDebugInfo=[findTimeZoneFromCountryAndNitz: countryIsoCode=cn, nitzSignal=NitzSignal{mReceiptElapsedMillis=PT39.429S, mNitzData=NitzData{mOriginalString=24/01/23,01:52:53+32,0, mZoneOffset=28800000, mDstOffset=0, mCurrentTimeMillis=1705974773000, mEmulatorHostTimeZone=null}, mAgeMillis=0}, findTimeZoneFromCountryAndNitz: lookupResult=OffsetResult{mTimeZone(ID)=Asia/Shanghai, mIsOnlyMatch=true}, Detection reason=handleCountryDetected("cn")]}, reason=handleCountryDetected("cn")

(2).分析bugreport日志:

可以确定时区识别策略已经通过Telephony suggestion history成功的识别到了Asia/Shanghai,但是为什么没有更新时区,原因未知。

TimeZoneDetectorService浅析--上_android

其实上面的数据,我们也可以看出时区的更新和三个有关:

(一):Manual

(二):Geolocation

(三):Telephony


(3).添加日志分析

我在TimeZoneDetectorStrategyImpl.doAutoTimeZoneDetection添加相关的日志,

Slog.d(LOG_TAG, "doAutoTimeZoneDetection currentUserConfig.getDetectionMode()=" + currentUserConfig.getDetectionMode());

发现其返回的识别模式为DETECTION_MODE_MANUAL:

time_zone_detector: doAutoTimeZoneDetection currentUserConfig.getDetectionMode()=1

time_zone_detector: doAutoTimeZoneDetection currentUserConfig.getDetectionMode()=1

private void doAutoTimeZoneDetection(
        @NonNull ConfigurationInternal currentUserConfig, @NonNull String detectionReason) {
    // Use the correct algorithm based on the user's current configuration. If it changes, then
    // detection will be re-run.
    Slog.d(LOG_TAG, "doAutoTimeZoneDetection currentUserConfig.getDetectionMode()=" + currentUserConfig.getDetectionMode());
    switch (currentUserConfig.getDetectionMode()) {
        case ConfigurationInternal.DETECTION_MODE_MANUAL:
            // No work to do.
            break;

那为什么明明是Telephony,返回是Manual呢?

进一步追踪代码,发现ConfigurationInternal.getDetectionMode():

应该是mTelephonyDetectionSupported为false,返回值为false,导致最后返回类型为manual,确实是我们关闭通话导致的。

public @DetectionMode int getDetectionMode() {
    if (!getAutoDetectionEnabledBehavior()) {
        return DETECTION_MODE_MANUAL;//返回为manual
    } else if (isGeoDetectionSupported() && getLocationEnabledSetting()
            && getGeoDetectionEnabledSetting()) {
        return DETECTION_MODE_GEO;
    } else {
        return DETECTION_MODE_TELEPHONY;
    }
}

public boolean getAutoDetectionEnabledBehavior() {
    return isAutoDetectionSupported() && mAutoDetectionEnabledSetting;
}

public boolean isAutoDetectionSupported() {
    return mTelephonyDetectionSupported || mGeoDetectionSupported;
    //应该是mTelephonyDetectionSupported为false,返回值为false,导致最后返回类型为manual
    //确实是我们关闭通话导致的。
}


三:问题解决

原因定位到了,那解决方案就好定了。

我们针对关闭通话的情况,进行适配处理一下,强行更新时区或强行修改返回类型都可以。




标签:getDetectionMode,01,23,--,53,TimeZoneDetectorService,currentUserConfig,null,浅析
From: https://blog.51cto.com/u_16502883/9426973

相关文章

  • 浅谈Python两大爬虫库——urllib库和requests库区别
    在Python中,网络爬虫是一个重要的应用领域。为了实现网络爬虫,Python提供了许多库来发送HTTP请求和处理响应。其中,urllib和requests是两个最常用的库。它们都能够帮助开发人员轻松地获取网页内容,但在使用方式、功能和效率上存在一些差异。本文将深入探讨这两个库的区别,帮助你更好地选......
  • 深度解析Java8社招面试题:Lambda序列化到底行不行?
    大家好,我是小米,一个热爱技术分享的小伙伴。今天,我们来聊一个关于Java8的话题,一个颇具技术深度的问题:“社招面试题:Java8中的Lambda表达式可以序列化吗?”废话不多说,让我们一起揭开这个技术的神秘面纱!Lambda表达式的崛起在Java8之前,我们编写代码时常常要依赖匿名内部类,这使得代码显得......
  • 安防视频汇聚平台智能边缘分析一体机视频算法分析识别打电话检测算法
    在智能视频监控的广阔舞台上,打电话检测算法如同一位细心的守护者,它基于图像处理和机器学习的先进技术,致力于识别和分析视频中的人物行为。这项技术不仅仅是一个简单的监控工具,它更是一种智能的分析手段,能够在复杂的场景中准确地判断个体是否在进行电话通话。首先,算法的工作流程是一......
  • 【解答】面试题:如何快速解决跨库join表关联?
    面试题:如何快速解决跨库join表关联?有一天产品经理提了一个需求,要关联查询A库的xxx表和B库的xxx表(跨库join),做实时分析(查询的表不固定,后期业务还会调整)。Java研发更改代码实现比较困难,大数据团队反馈可以,但不能保证实时性,会有30分钟左右的数据延迟。产品经理说我这个需求很急,30分......
  • 思科认证 | 思科认证考试常见问题Q&A
    Q:考试时长是多少?A:200-301:140分钟200-901:140分钟200-201:140分钟350-401:140分钟300-410:110分钟Q:笔试多少钱?A:200-301:USD300.00200-901:USD300.00200-201:USD300.00350-401:USD400.00300-410:USD300.00Q:一共考多少题?A:官方说明是90~110题,但是所有人考的时候都是考100题。各代码......
  • 美国本科就读期间因学业问题被遣返?这些方式帮你完成学业
    美国本科就读期间因学业问题被遣返?这些方式帮你完成学业学生留学期间会失去学生身份,不得不回到国内的这种情况,发生几率最高的就是在美国。被遣返,不仅仅是在当地做了不合规的事情会被遣返。学术不达要求,一样会被遣返。比如美国。留学美国的学生,在就读期间出现以下一些情况会导致自己......
  • 126邮箱授权码在哪里看
    了解126邮箱授权码的重要性在使用126邮箱时,用户常常需要授权码来进行各种操作。授权码是确保邮箱安全的一种重要方式,它可以保护用户的隐私信息不被恶意窃取。在使用126邮箱的过程中,了解授权码的作用和获取方式至关重要。126邮箱授权码的功能授权码是一种类似密码的机制,用于验证用户......
  • 二手旧物回收小程序:环保与价值的双重革命
    随着社会的快速发展,物质生活的丰富带来了大量的闲置物品。这些物品,在经过短暂的利用后,往往被遗忘在角落,造成了资源的浪费。然而,随着科技的发展,一个全新的平台正在出现,它可以帮助我们重新审视这些闲置的物品,让它们重新焕发生机。这就是二手旧物回收小程序。一、二手旧物回收小程序的......
  • 每日一练 | 华为认证真题练习Day172
    1、关于OSPF的ASBR-SUMMARY-LSA中LSA头部他、信息描述错误的是A.LINKSTATEID表示ASBR的ROUTERIDB.ADVERTISINGROUTER表示该ABR的ROUTERIDC.ADVERTISINGROUTER字段永远不会改变D.METRIC表示该ABR到达ASBR的OSPF开销2、关于OSPF外部路由种类描述错误的是A.OSPF分为第一类......
  • qq邮箱登录不了怎么解决
    在现代社会中,电子邮件已经成为人们生活和工作中不可或缺的一部分。而QQ邮箱作为中国最主流的邮件服务之一,被广泛应用于各行各业。然而,随着网络技术的不断更新和改进,有时候我们可能会遇到一些问题,比如QQ邮箱登录不了的情况。那么,面对这种情况,我们应该如何解决呢?检查网络连接首先,当我......