Phát hiện múi giờ theo vị trí

Tính năng phát hiện múi giờ theo vị trí (có trên Android 12 trở lên) là một tính năng phát hiện múi giờ tự động không bắt buộc, cho phép thiết bị sử dụng thông tin vị trí và dữ liệu bản đồ múi giờ để xác định múi giờ.

Tính năng phát hiện múi giờ theo vị trí là một cơ chế thay thế cho tính năng phát hiện múi giờ qua điện thoại. Vì tính năng này không yêu cầu chức năng gọi điện, nên có thể được hỗ trợ trên các thiết bị có nhiều hệ số hình dạng, ngoài các thiết bị có chức năng gọi điện di động.

Tính năng phát hiện múi giờ theo vị trí bao gồm các thành phần sau trong nền tảng AOSP:

  • Logic phát hiện múi giờ trong máy chủ hệ thống
  • Một lựa chọn mà người dùng có thể truy cập trong phần Cài đặt (ra mắt trong Android 12) để cho phép người dùng chọn giữa cơ chế phát hiện múi giờ của điện thoại và vị trí

  • Một hệ thống bổ trợ cho các thành phần thực hiện việc phát hiện vị trí và lập bản đồ múi giờ. Trình bổ trợ này được gọi là Trình cung cấp thông tin múi giờ theo vị trí (LTZP) và có thể có tối đa 2 trình bổ trợ như vậy trên một thiết bị. Nền tảng này cung cấp các API hệ thống mà bạn phải dùng để triển khai LTZP.

  • Một bản triển khai LTZP tham chiếu.

  • Lưu trữ công cụ để tạo một tập dữ liệu tham chiếu từ dữ liệu Open Street Map (OSM) có thể dùng với quá trình triển khai tham chiếu.

Quyền riêng tư của người dùng

Tính năng phát hiện múi giờ theo vị trí bao gồm các tính năng sau về quyền riêng tư của người dùng:

  • Khi có nút bật/tắt để chọn thuật toán vị trí, người dùng có thể tắt thuật toán vị trí bất cứ lúc nào.

  • Đề xuất múi giờ dựa trên vị trí không được chia sẻ giữa những người dùng trên một thiết bị.

  • Người dùng có thể kiểm soát tính năng phát hiện vị trí để phát hiện múi giờ một cách rõ ràng thông qua màn hình Ngày và giờ trong phần Cài đặt. Người dùng không cần phải cấp quyền một cách rõ ràng thông qua hộp thoại cấp quyền.

  • Thông tin vị trí của thiết bị không được chuyển đến các dịch vụ nền tảng Android. Thay vào đó, những hoạt động sau sẽ xảy ra:

    • Các dịch vụ trình phát hiện múi giờ được LTZP gửi mã nhận dạng múi giờ, chứ không phải vị trí của thiết bị. Đây là API tối thiểu cần thiết để hỗ trợ tính năng phát hiện múi giờ theo vị trí.
    • Các đơn vị tích hợp hệ thống kiểm soát hoạt động của từng LTZP. Các hoạt động triển khai LTZP có thể sử dụng dữ liệu bản đồ múi giờ được lưu trữ hoàn toàn trên thiết bị Android, sử dụng máy chủ hoặc sử dụng phương pháp kết hợp.

Hành vi của tính năng

Dịch vụ time_zone_detector xác định thời điểm thay đổi múi giờ hiện tại của thiết bị dựa trên các đề xuất mà dịch vụ nhận được từ thuật toán phát hiện.

Dịch vụ location_time_zone_manager chịu trách nhiệm tạo các đề xuất cho thuật toán vị trí của time_zone_detector. Dịch vụ location_time_zone_manager chạy trong quy trình máy chủ hệ thống.

Dịch vụ location_time_zone_manager không chứa bất kỳ logic phát hiện múi giờ nào. Dịch vụ này chịu trách nhiệm quản lý vòng đời của một hoặc hai trình bổ trợ LTZP.

Khi không cần phát hiện múi giờ theo vị trí, LTZP sẽ không bắt đầu. Điều này có nghĩa là hệ thống phát hiện múi giờ theo vị trí không yêu cầu LTZP theo dõi vị trí của thiết bị, trừ phi hệ thống yêu cầu một cách rõ ràng. Một số lý do dẫn đến hành vi này bao gồm:

  • Không giống như các tín hiệu điện thoại được nhận một cách thụ động trong quá trình hoạt động điện thoại thông thường, vị trí có thể được yêu cầu chủ động từ các trình cung cấp vị trí của Android và có thể tiêu thụ thêm năng lượng.
  • Chế độ cài đặt vị trí có phạm vi là người dùng và Android phải tuân thủ chế độ cài đặt hiện tại của người dùng.
  • Việc lấy thông tin vị trí của thiết bị là vấn đề nhạy cảm về quyền riêng tư.

Ngoài ra, dịch vụ location_time_zone_manager sẽ đưa ra một đề xuất không chắc chắn (nếu cần) khi người dùng hiện tại thay đổi chế độ cài đặt để tránh chia sẻ thông tin vị trí giữa các người dùng.

Do những lựa chọn này, nên phải mất vài giây sau khi chuyển thuật toán hiện tại sang vị trí hoặc sau khi chuyển người dùng hiện tại, thì múi giờ mới có thể được phát hiện. Điều này cũng phụ thuộc vào việc triển khai các LTZP đang được sử dụng.

Cách triển khai tính năng phát hiện múi giờ theo vị trí của AOSP cho phép tối đa 2 LTZP, một LTZP chính và một LTZP phụ như được xác định ở đây:

LTZP chính
Luôn chạy khi người dùng cho phép tính năng phát hiện múi giờ theo vị trí chạy.
LTZP phụ
Chạy nếu LTZP chính báo cáo rằng múi giờ là không xác định, báo cáo lỗi vĩnh viễn hoặc hết thời gian chờ trong quá trình khởi tạo. Dừng nếu LTZP chính gửi một đề xuất nhất định.

Như minh hoạ trong Hình 1, dịch vụ time_zone_detector nhận được các đề xuất về múi giờ từ thuật toán điện thoại hoặc vị trí. Thuật toán vị trí nhận các đề xuất từ LTZP chính hoặc phụ.

Luồng thông tin phát hiện múi giờ theo vị trí

Hình 1. Luồng thông tin phát hiện múi giờ theo vị trí.

Yêu cầu về cấu hình thiết bị

Để hỗ trợ tính năng múi giờ theo vị trí, bạn phải định cấu hình các thiết bị bằng LTZP mà thiết bị có thể sử dụng. Thiết bị cần có ít nhất một LTZP được bật và định cấu hình để tính năng phát hiện múi giờ theo vị trí hoạt động và người dùng có thể thấy trong phần Cài đặt.

Cấu hình thiết bị

Phần này mô tả cách các nhà sản xuất thiết bị có thể định cấu hình thiết bị để hỗ trợ tính năng phát hiện múi giờ theo vị trí.

Cấu hình AOSP cơ bản nằm ở frameworks/base/core/res/res/values/config.xml:

Khoá cấu hình Giá trị AOSP Mô tả
config_enableGeolocationTimeZoneDetection true Đây là chế độ kiểm soát chính cho tính năng phát hiện múi giờ theo vị trí.

Tính năng này được hỗ trợ theo mặc định trong AOSP. Bạn phải bật hoặc định cấu hình ít nhất một LTZP thì người dùng mới có thể sử dụng tính năng này.

Nếu bạn đặt giá trị thành false, tính năng này sẽ tắt hoàn toàn để tiết kiệm một chút bộ nhớ.
config_enablePrimaryLocationTimeZoneProvider false Thao tác này sẽ bật LTZP chính.
config_primaryLocationTimeZoneProviderPackageName Đặt giá trị này thành tên gói của ứng dụng nơi có thể tìm thấy dịch vụ nhà cung cấp chính.
config_enableSecondaryLocationTimeZoneProvider false Thao tác này sẽ bật LTZP phụ.
config_secondaryLocationTimeZoneProviderPackageName Đặt giá trị này thành tên gói của ứng dụng nơi có thể tìm thấy dịch vụ nhà cung cấp phụ.

Theo mặc định, cấu hình AOSP có khoá config_enableGeolocationTimeZoneDetection được đặt thành true, cho phép hỗ trợ tính năng phát hiện múi giờ theo vị trí. Ban đầu, người dùng không thấy tính năng này vì AOSP không bao gồm cấu hình LTZP theo mặc định. Tuy nhiên, khi sử dụng cấu hình mặc định này, nhà sản xuất thiết bị có thể bật và mô phỏng LTZP từ dòng lệnh để kiểm thử. (Để biết thêm thông tin, hãy xem phần Gỡ lỗi và kiểm thử)

API trạng thái LTZP

Trong Android 14, các API LTZP hỗ trợ thông tin về trạng thái báo cáo LTZP. Điều này cho phép LTZP báo cáo những vấn đề mà nền tảng có thể không tự phát hiện được, vì các thành phần phát hiện múi giờ của nền tảng không tham gia trực tiếp vào việc phát hiện vị trí hoặc múi giờ trong thuật toán vị trí.

Khả năng báo cáo rằng hành vi của LTZP đã bị suy giảm do môi trường của thiết bị rất hữu ích khi chế độ dự phòng điện thoại được hỗ trợ. Ví dụ: nếu một LTZP bên thứ ba dựa vào các chế độ cài đặt hoặc quyền tuỳ chỉnh để hoạt động phát hiện vị trí hoạt động ở chế độ giảm hiệu suất hoặc bị vô hiệu hoá theo chế độ cài đặt hiện tại của thiết bị, thì LTZP có thể báo cáo thông tin trạng thái này cho các thành phần nền tảng nội bộ như ứng dụng Cài đặt thông qua phương thức reportSuggestion. Sau đó, ứng dụng Cài đặt có thể thông báo cho người dùng thông qua các chuỗi hoặc chế độ tuỳ chỉnh mà họ có thể tuỳ chỉnh rằng có những chế độ cài đặt mà họ phải thay đổi để thuật toán vị trí hoạt động tốt hoặc hoạt động được.

Để biết thêm thông tin về các trạng thái mà LTZP có thể báo cáo, hãy xem TimeZoneProviderStatus.

Cấu hình và triển khai LTZP

Khi định cấu hình LTZP, hãy đọc hướng dẫn trong mã nguồn cho frameworks/base/core/java/android/service/timezone/TimeZoneProviderService.java. Các chú thích Javadoc cung cấp thông tin chi tiết về dịch vụ, các quyền cần thiết và cấu hình khác.

Để định cấu hình LTZP, nhà sản xuất thiết bị phải chọn một quy trình ứng dụng để lưu trữ dịch vụ của LTZP. Việc có một quy trình riêng cho LTZP là một chi phí lớn; lý tưởng nhất là quy trình ứng dụng được chọn là quy trình luôn chạy, chẳng hạn như máy chủ hệ thống.

Trên các thiết bị có thành phần hệ thống theo mô-đun (mô-đun), hãy xem xét sự tương tác giữa dữ liệu địa lý mà LTZP sử dụng và các quy tắc về múi giờ (tzdb) có trong mô-đun Dữ liệu múi giờ (com.android.tzdata). Việc cập nhật một thành phần mà không cập nhật thành phần còn lại có thể gây ra các vấn đề về độ lệch phiên bản. Để biết thêm thông tin, hãy xem phần Những điều cần cân nhắc khi áp dụng tính năng.

LTZP tham chiếu AOSP

AOSP chứa một cách triển khai LTZP tham chiếu trong packages/modules/GeoTZ. Quy trình triển khai tham chiếu này sử dụng các API AOSP để xác định vị trí của thiết bị và sử dụng một tệp dữ liệu trên thiết bị để liên kết vị trí với một nhóm mã nhận dạng múi giờ.

Một tập hợp dữ liệu tham chiếu bắt nguồn từ các dự án nguồn mở khác được đưa vào mã nguồn. Để biết thêm thông tin chi tiết, hãy xem README.md và các tệp LICENSE.

Gỡ lỗi và kiểm thử

Phần sau đây mô tả các lệnh shell để gỡ lỗi và kiểm thử tính năng phát hiện múi giờ theo vị trí.

Tương tác với dịch vụ location_time_zone_manager

Khi thuật toán vị trí được hỗ trợ trên một thiết bị chạy Android 12 trở lên, Android sẽ khởi tạo dịch vụ location_time_zone_manager tại thời điểm khởi động.

Để kết xuất trạng thái hiện tại của location_time_zone_manager, hãy sử dụng:

adb shell cmd location_time_zone_manager dump

Để xem một bộ tuỳ chọn dòng lệnh mở rộng nhằm hỗ trợ kiểm thử, hãy sử dụng:

adb shell cmd location_time_zone_manager help

Đầu ra trợ giúp cũng mô tả các thuộc tính dịch vụ device_config có thể dùng để ảnh hưởng đến hành vi của time_zone_detector cho mục đích kiểm thử hoặc trong quá trình sản xuất. Để biết thêm thông tin, hãy xem phần Định cấu hình thiết bị bằng dịch vụ device_config.

Các hoạt động triển khai LTZP có thể cung cấp hoạt động gỡ lỗi hoặc hỗ trợ kiểm thử riêng. Ví dụ: bạn có thể dùng lệnh sau để gỡ lỗi LTZP tham chiếu AOSP khi LTZP này được đăng ký trong quy trình máy chủ hệ thống:

adb shell dumpsys activity service android/com.android.timezone.location.provider.OfflineLocationTimeZoneProviderService