بالنسبة للأجهزة التي تعمل بنظام Android 11 أو إصدار أقدم ، يعتمد الاكتشاف التلقائي للمنطقة الزمنية في AOSP على إشارات من النظام الفرعي للاتصالات الهاتفية. نظرًا للاعتماد على النظام الفرعي للاتصالات الهاتفية ، يقتصر الاكتشاف التلقائي للمنطقة الزمنية على نظام Android 11 أو إصدار أقل على الأجهزة الهاتفية.
عندما يكون اكتشاف المنطقة الزمنية للمهاتفة متاحًا ، فإنه يعمل باستخدام رمز الهاتف المحمول (MCC) وإشارات هوية الشبكة والمنطقة الزمنية (NITZ) .
على سبيل المثال ، يمكن لجهاز في فرنسا تحديد المنطقة الزمنية استنادًا فقط إلى مركز عملائي الذي تم الإبلاغ عنه بواسطة الأبراج الخلوية القريبة. هذا ممكن لأن فرنسا معروفة باستخدامها منطقة زمنية واحدة.
عندما يستخدم بلد ما مناطق زمنية متعددة ، فإن مركز عملائي وحده لا يكفي لتحديد المنطقة الزمنية. بالنسبة لهذه البلدان ، يستخدم الجهاز أيضًا إشارات NITZ لتحديد المنطقة الزمنية الصحيحة. يعمل هذا بشكل جيد في العديد من الأماكن حول العالم ولكنه يتطلب أن تكون إشارات NITZ متاحة وصحيحة وبالتالي فهي تعتمد على شركات الاتصالات.
يعد اكتشاف المنطقة الزمنية الهاتفية كاشفًا سلبيًا . يتم تشغيله في جميع الأوقات ولذا يتم تقديم اقتراحات الهاتف غالبًا حتى عندما لا يكون أصل time_zone_detector
عبارة عن اتصال هاتفي حاليًا.
حدود الكشف عن المنطقة الزمنية الهاتفية
حتى مع توفر إشارات NITZ الصحيحة ، لا يعمل اكتشاف المنطقة الزمنية الهاتفية دائمًا بشكل جيد في كل بلد. وذلك لأن NITZ يحتوي فقط على معلومات الإزاحة والتوفير الصيفي ، والتي لا تكفي دائمًا لتحديد منطقة زمنية بشكل فريد.
هناك العديد من الأماكن في العالم حيث قد تحدث مشكلة المنطقة الزمنية هذه. على سبيل المثال ، لا يمكن تمييز دنفر كولورادو وفينيكس أريزونا في الولايات المتحدة باستخدام إشارات NITZ خلال فصل الشتاء ، ولكن يمكن تمييزها خلال المواسم الأخرى. قد يواجه أي موقع به مناطق زمنية متداخلة بشكل مشابه هذا النوع من المشكلات.
يوضح الجدول التالي سلوك الجهاز بناءً على موسم دنفر وفينيكس كمثال:
الموقع والموسم | معلومات من MCC أو NITZ | تم الكشف عن المنطقة الزمنية والسلوك |
---|---|---|
دنفر، كولورادو شتاء | الوقت: 1 يناير 2021 12:00:00 الدولة: الولايات المتحدة الإزاحة: التوقيت العالمي المتفق عليه (UTC-7) ، بدون التوقيت الصيفي | تطابق معرفات منطقتين:
تم ضبط الجهاز بشكل صحيح على America / Denver. |
فينيكس، أريزونا شتاء | الوقت: 1 يناير 2021 12:00:00 الدولة: الولايات المتحدة الإزاحة: التوقيت العالمي المتفق عليه (UTC-7) ، بدون التوقيت الصيفي | تطابق معرفات منطقتين:
تم ضبط الجهاز بشكل غير صحيح على America / Denver. |
دنفر، كولورادو صيف | الوقت: 1 يوليو 2021 12:00:00 الدولة: الولايات المتحدة الإزاحة: التوقيت العالمي المتفق عليه (UTC-6) ، التوقيت الصيفي | معرّف منطقة واحدة يطابق:
تم ضبط الجهاز بشكل صحيح على America / Denver. |
فينيكس، أريزونا صيف | الوقت: 1 يوليو 2021 12:00:00 الدولة: الولايات المتحدة الإزاحة: التوقيت العالمي المتفق عليه (UTC-7) ، بدون التوقيت الصيفي | معرّف منطقة واحدة يطابق:
تم ضبط الجهاز بشكل صحيح على America / Phoenix. |
توضح الأمثلة أعلاه أنه خلال فصل الشتاء ، يجب أن تختار أجهزة Android في دنفر أو أريزونا واحدًا من اثنين من معرفات المنطقة الزمنية المتطابقة ، والتي قد تكون غير صحيحة لبعض الأجهزة ولكنها لا تزال تعرض التوقيت المحلي الصحيح على ما يبدو. تعرض ساعة الجهاز والتقويمات والتطبيقات الأخرى التوقيت المحلي المتوقع حتى إذا كان معرف المنطقة الزمنية غير صحيح لأن معرفات المنطقة الزمنية تحسب الوقت المحلي نفسه خلال فصل الشتاء.
ومع ذلك ، في الربيع عندما تلاحظ دنفر التوقيت الصيفي بينما لا تراقب Phoenix التوقيت المحلي ، قد تعرض بعض الأجهزة التوقيت المحلي غير الصحيح مؤقتًا إذا تم ضبطها على معرّف المنطقة الزمنية الخطأ لموقع المستخدم. يتم تصحيح هذا بمجرد أن يتلقى الجهاز إشارة NITZ جديدة (على وجه التحديد ، تلك التي تحتوي على معلومات إزاحة "UTC-7 ، لا توفر التوقيت الصيفي") ، ولكن هذا قد يستغرق بعض الوقت ويعتمد على شركات الاتصالات.
نتيجة لذلك ، قد تعرض التقويمات أو التطبيقات الأخرى التي تخزن أو تحمل معرّف المنطقة الزمنية من الشتاء إلى الربيع التوقيت المحلي الخاطئ حتى تقوم التطبيقات ذات الصلة بتحديث معرّف المنطقة الزمنية.
التصحيح والاختبار
يصف القسم التالي أوامر shell لتصحيح أخطاء ميزة اكتشاف المنطقة الزمنية للمهاتفة واختبارها.
اختبار إعداد البيئة
يستخدم المختبرين عادةً بيئة اختبار مع اختبار أو خلية هاتفية محاكاة للتحقق من سلوك اكتشاف المنطقة الزمنية للمهاتفة. يمكن استخدام خلية الاختبار لمحاكاة الشبكات ذات مراكز التحكم في المحرك المختلفة وإرسال إشارات NITZ إلى الأجهزة ثم مراقبة تأثيراتها.
لكي يكتشف الجهاز المنطقة الزمنية ، يجب أن تكون معلومات إشارة NITZ صحيحة ومتسقة مع MCC ومطابقة نسخة الجهاز من IANA TZDB (قواعد المنطقة الزمنية). تتسبب إشارات NITZ غير المتوافقة مع مركز التحكم في المحرك (MCC) في جعل أصل المهاتفة غير مؤكد.
على سبيل المثال ، إذا كان مركز التحكم في المحرك الذي تستخدمه خلية الاختبار مخصصًا للولايات المتحدة الأمريكية ، فيجب أن تحتوي إشارة NITZ على معلومات "التوقيت العالمي" والإزاحة والتوقيت الصيفي الصحيحة لمكان ما في الولايات المتحدة الأمريكية.
التعامل مع خدمة com.android.phone
للتحقق من أن الجهاز يتلقى اقتراحات المنطقة الزمنية الهاتفية الصحيحة ، استخدم:
adb shell dumpsys activity service \
com.android.phone/com.android.phone.TelephonyDebugService
يؤدي هذا إلى تفريغ معلومات الاتصال الهاتفي ، والتي يمكن العثور عليها أيضًا في تقارير أخطاء Android. على الأجهزة المزودة بشرائح SIM متعددة ، توجد معلومات لكل راديو يعمل على بطاقة SIM.
تعرض سجلات المنطقة الزمنية الاقتراحات التي أرسلتها عملية الاتصال الهاتفي إلى time_zone_detector وأسباب إرسال الاقتراحات.
TimeServiceHelperImpl: SystemClock.elapsedRealtime()=11864061 System.currentTimeMillis()=1620652067178 Time Logs: ... Time zone Logs: 18602 / 2021-05-10T09:50:21.718Z - Suggesting time zone update: TelephonyTimeZoneSuggestion{mSlotIndex=0, mZoneId='null', mMatchType=0, mQuality=0, mDebugInfo=[getTimeZoneSuggestion: nitzSignal=TimestampedValue{mReferenceTimeMillis=14098, mValue=NitzData{mOriginalString=21/05/10,09:50:18+04,01, mZoneOffset=3600000, mDstOffset=3600000, mCurrentTimeMillis=1620640218000, mEmulatorHostTimeZone=null}}, countryIsoCode=null, Detection reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=14098, mValue=NitzData{mOriginalString=21/05/10,09:50:18+04,01, mZoneOffset=3600000, mDstOffset=3600000, mCurrentTimeMillis=1620640218000, mEmulatorHostTimeZone=null}})]} 18831 / 2021-05-10T09:50:21.948Z - Suggesting time zone update: TelephonyTimeZoneSuggestion{mSlotIndex=0, mZoneId='Europe/London', mMatchType=3, mQuality=1, mDebugInfo=[findTimeZoneFromCountryAndNitz: countryIsoCode=gb, nitzSignal=TimestampedValue{mReferenceTimeMillis=14098, mValue=NitzData{mOriginalString=21/05/10,09:50:18+04,01, mZoneOffset=3600000, mDstOffset=3600000, mCurrentTimeMillis=1620640218000, mEmulatorHostTimeZone=null}}, findTimeZoneFromCountryAndNitz: lookupResult=OffsetResult{mTimeZone(ID)=Europe/London, mIsOnlyMatch=true}, Detection reason=handleCountryDetected("gb")]}