برای دستگاههایی که اندروید ۱۱ یا پایینتر را اجرا میکنند، تشخیص خودکار منطقه زمانی در پروژه متنباز اندروید (AOSP) به سیگنالهای زیرسیستم تلفن متکی است. به دلیل وابستگی به زیرسیستم تلفن، تشخیص خودکار منطقه زمانی در اندروید ۱۱ یا پایینتر محدود به دستگاههای تلفن است.
وقتی تشخیص منطقه زمانی تلفن در دسترس باشد، با استفاده از سیگنالهای کد کشور تلفن همراه (MCC) و هویت شبکه و منطقه زمانی (NITZ) کار میکند.
برای مثال، یک دستگاه در بلژیک میتواند منطقه زمانی را صرفاً بر اساس MCC گزارش شده توسط دکلهای سلولی مجاور شناسایی کند. این امر به این دلیل امکانپذیر است که بلژیک به استفاده از یک منطقه زمانی واحد معروف است.
وقتی کشوری از چندین منطقه زمانی استفاده میکند، MCC به تنهایی برای شناسایی منطقه زمانی کافی نیست. برای این کشورها، دستگاه از سیگنالهای NITZ نیز برای شناسایی منطقه زمانی صحیح استفاده میکند. این روش در بسیاری از نقاط جهان به خوبی کار میکند، اما مستلزم آن است که سیگنالهای NITZ هم در دسترس باشند و هم صحیح و بنابراین به اپراتورها بستگی دارد.
تشخیص منطقه زمانی تلفنی یک آشکارساز غیرفعال است. این آشکارساز همیشه در حال اجرا است و بنابراین اغلب حتی زمانی که الگوریتم آشکارساز time_zone_detector فعال، تلفنی نباشد، پیشنهادهای تلفنی ارائه میشود.
محدودیت تشخیص منطقه زمانی تلفن
حتی با وجود سیگنالهای صحیح NITZ، تشخیص منطقه زمانی تلفن همیشه در هر کشوری به خوبی کار نمیکند. دلیل این امر این است که NITZ فقط شامل اطلاعات انحراف و ساعت تابستانی است که همیشه برای شناسایی منحصر به فرد یک منطقه زمانی کافی نیستند.
مکانهای زیادی در جهان وجود دارند که این مشکل منطقه زمانی ممکن است در آنها رخ دهد. به عنوان مثال، دنور کلرادو و فینیکس آریزونا در ایالات متحده را نمیتوان با استفاده از سیگنالهای NITZ در زمستان از هم تشخیص داد، اما در فصول دیگر میتوان این کار را انجام داد. هر مکانی که مناطق زمانی همپوشانی مشابهی داشته باشد، ممکن است این نوع مشکل را تجربه کند.
جدول زیر به عنوان مثال، رفتار دستگاه را بسته به فصل برای دنور و فینیکس تجزیه و تحلیل میکند:
| مکان و فصل | اطلاعات از MCC یا NITZ | منطقه زمانی و رفتار شناسایی شده |
|---|---|---|
| دنور، کلرادو زمستان | زمان: ۱ ژانویه ۲۰۲۱، ساعت ۱۲:۰۰:۰۰ کشور: ایالات متحده تغییر ساعت: UTC-7، بدون تغییر ساعت تابستانی | دو شناسه منطقه مطابقت دارند:
دستگاه به درستی روی آمریکا/دنور تنظیم شده است. |
| فینیکس، آریزونا زمستان | زمان: ۱ ژانویه ۲۰۲۱، ساعت ۱۲:۰۰:۰۰ کشور: ایالات متحده تغییر ساعت: UTC-7، بدون تغییر ساعت تابستانی | دو شناسه منطقه مطابقت دارند:
دستگاه به اشتباه روی آمریکا/دنور تنظیم شده است. |
| دنور، کلرادو تابستان | زمان: ۱ جولای ۲۰۲۱، ساعت ۱۲:۰۰:۰۰ کشور: ایالات متحده تغییر ساعت: UTC-6، صرفهجویی در نور روز | تطابق شناسه یک منطقه:
دستگاه به درستی روی آمریکا/دنور تنظیم شده است. |
| فینیکس، آریزونا تابستان | زمان: ۱ جولای ۲۰۲۱، ساعت ۱۲:۰۰:۰۰ کشور: ایالات متحده تغییر ساعت: UTC-7، بدون تغییر ساعت تابستانی | تطابق شناسه یک منطقه:
دستگاه به درستی روی آمریکا/فینیکس تنظیم شده است. |
مثالهای جدول نشان میدهد که در طول زمستان، دستگاههای اندروید در دنور یا آریزونا باید یکی از دو شناسه منطقه زمانی منطبق را انتخاب کنند که ممکن است برای برخی دستگاهها نادرست باشد، اما همچنان زمان محلی ظاهراً صحیحی را نمایش میدهد. ساعت دستگاه، تقویمها و سایر برنامهها، زمان محلی مورد انتظار را حتی اگر شناسه منطقه زمانی نادرست باشد، نمایش میدهند زیرا هر دو شناسه منطقه زمانی در طول زمستان زمان محلی یکسانی را محاسبه میکنند.
با این حال، در بهار که دنور ساعت تابستانی را رعایت میکند و فینیکس این کار را نمیکند، برخی از دستگاهها ممکن است در صورت تنظیم شناسه منطقه زمانی اشتباه برای مکان کاربر، موقتاً زمان محلی نادرستی را نشان دهند. این مشکل به محض دریافت سیگنال NITZ جدید توسط دستگاه (به طور خاص، سیگنالی که حاوی اطلاعات انحراف "UTC-7، بدون ساعت تابستانی" باشد) اصلاح میشود، اما این کار میتواند مدتی طول بکشد و به اپراتورها بستگی دارد.
در نتیجه، تقویمها یا سایر برنامههایی که شناسه منطقه زمانی را از زمستان تا بهار ذخیره یا منتقل میکنند، ممکن است زمان محلی اشتباهی را نمایش داده و استفاده کنند تا زمانی که برنامههای مربوطه شناسه منطقه زمانی را بهروزرسانی کنند.
اشکالزدایی و آزمایش
بخش زیر دستورات پوسته را برای اشکالزدایی و آزمایش ویژگی تشخیص منطقه زمانی تلفن شرح میدهد.
تنظیمات محیط آزمایش
آزمایشکنندگان معمولاً از یک محیط آزمایشی با یک سلول تلفنی آزمایشی یا شبیهسازیشده برای بررسی رفتار تشخیص منطقه زمانی تلفن استفاده میکنند. سلول آزمایشی میتواند برای شبیهسازی شبکهها با MCC های مختلف و ارسال سیگنالهای NITZ به دستگاهها و سپس نظارت بر اثرات آنها استفاده شود.
برای اینکه دستگاه بتواند منطقه زمانی را تشخیص دهد، اطلاعات سیگنال NITZ باید صحیح، مطابق با MCC و با کپی دستگاه از IANA TZDB (قوانین منطقه زمانی) مطابقت داشته باشد. سیگنالهای NITZ که با MCC مغایرت دارند، باعث میشوند الگوریتم تلفن نامشخص شود.
برای مثال، اگر MCC مورد استفاده توسط سلول آزمایشی برای ایالات متحده آمریکا باشد، سیگنال NITZ باید حاوی اطلاعات UTC، آفست و ساعت تابستانی باشد که برای جایی در ایالات متحده آمریکا صحیح باشد.
تعامل با سرویس com.android.phone
برای تأیید اینکه دستگاه پیشنهادهای صحیح منطقه زمانی تلفن را دریافت میکند، از دستور زیر استفاده کنید:
adb shell dumpsys activity service \
com.android.phone/com.android.phone.TelephonyDebugServiceاین اطلاعات تلفن را نمایش میدهد، که میتوان آن را در گزارشهای باگ اندروید نیز یافت. در دستگاههایی که چند سیمکارت دارند، اطلاعات مربوط به هر رادیو سیمکارت وجود دارد.
گزارشهای منطقه زمانی، پیشنهادهایی را که فرآیند تلفن به 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")]}