Android 6.0 trở lên có một chức năng cho phép các ứng dụng có đặc quyền cung cấp cấu hình dành riêng cho nhà mạng cho nền tảng. Chức năng này, dựa trên Đặc quyền của nhà mạng trên UICC được giới thiệu trong Android 5.1 (Lollipop MR1), cho phép di chuyển cấu hình nhà mạng khỏi các lớp phủ cấu hình tĩnh và cho phép nhà mạng cũng như OEM có khả năng cung cấp cấu hình nhà mạng một cách linh hoạt cho nền tảng thông qua một giao diện xác định.
Ứng dụng của nhà mạng được ký đúng cách có thể được tải sẵn trong hình ảnh hệ thống, tự động cài đặt hoặc cài đặt theo cách thủ công thông qua cửa hàng ứng dụng. Nền tảng sẽ truy vấn ứng dụng để cung cấp cấu hình cho các chế độ cài đặt, bao gồm:
- Mạng chuyển vùng/không chuyển vùng
- Thư thoại kèm theo hình ảnh
- Chế độ cài đặt mạng SMS/MMS
- Cấu hình VoLTE/IMS
Việc xác định giá trị cần trả về hoàn toàn tuỳ thuộc vào ứng dụng của nhà mạng và có thể thay đổi linh hoạt dựa trên thông tin chi tiết được truyền đến ứng dụng thông qua nền tảng.
Sau đây là những lợi ích chính của phương pháp này:
- Cấu hình động – Hỗ trợ các khái niệm như cấu hình không bắt nguồn từ MCCMNC, ví dụ: nhà khai thác mạng di động ảo (MVNO) hoặc khách hàng chọn sử dụng các dịch vụ bổ sung.
- Hỗ trợ các thiết bị được bán qua mọi kênh – Ví dụ: điện thoại được bán trên thị trường mở có thể tự động được định cấu hình bằng các chế độ cài đặt phù hợp bằng cách tải một ứng dụng xuống từ cửa hàng ứng dụng.
- Bảo mật – Chỉ những ứng dụng do nhà mạng ký mới có đặc quyền cung cấp cấu hình này.
- API đã xác định – Trước đây, cấu hình này chủ yếu được lưu trữ trong các lớp phủ XML nội bộ trong khung chứ không thông qua API công khai. API cấu hình nhà mạng trong Android 6.0 là công khai và được xác định rõ ràng.
Cách hoạt động
Tải cấu hình
Cấu hình nhà mạng do tính năng này cung cấp là một tập hợp các cặp khoá-giá trị giúp thay đổi nhiều hành vi liên quan đến điện thoại trên nền tảng.
Tập hợp các giá trị cho một thiết bị cụ thể được xác định bằng cách truy vấn các thành phần sau theo thứ tự:
- Ứng dụng của nhà mạng (không bắt buộc, nhưng đây là vị trí được đề xuất cho cấu hình bổ sung ngoài những gì có trong Dự án nguồn mở Android (AOSP))
- Ứng dụng cấu hình nền tảng đi kèm với hình ảnh hệ thống
- Giá trị mặc định, được mã hoá cứng vào khung (tương đương với hành vi trước Android 6.0)
Ứng dụng cấu hình nền tảng
Một ứng dụng cấu hình nền tảng chung được đi kèm với hình ảnh hệ thống. Ứng dụng này có thể cung cấp các giá trị cho mọi biến mà ứng dụng hãng vận chuyển thông thường không có. Bạn có thể tìm thấy ứng dụng cấu hình nền tảng (trong Android 6.0) tại: packages/apps/CarrierConfig
Mục đích của ứng dụng này là cung cấp một số cấu hình cho mỗi mạng khi ứng dụng của nhà mạng chưa được cài đặt, đồng thời các nhà mạng/OEM chỉ nên thực hiện những thay đổi tối thiểu đối với ứng dụng này trong hình ảnh của riêng họ. Thay vào đó, các nhà mạng nên cung cấp ứng dụng riêng của nhà mạng để tuỳ chỉnh nhà mạng, cho phép phân phối các bản cập nhật thông qua những kênh như cửa hàng ứng dụng.
Cách cấp đặc quyền cho ứng dụng của nhà cung cấp dịch vụ
Ứng dụng của nhà mạng có liên quan phải được ký bằng chính chứng chỉ có trên thẻ SIM, như được ghi trong Đặc quyền của nhà mạng trên UICC.
Những thông tin nào được chuyển đến ứng dụng của nhà mạng
Ứng dụng của hãng vận chuyển được cung cấp các giá trị sau, cho phép ứng dụng đưa ra quyết định linh hoạt về những giá trị cần trả về:
- MCC
- MNC
- SPN
- IMSI (số nhận dạng thuê bao di động quốc tế)
- GID1
- GID2
- Mã nhà mạng
Để biết thêm thông tin về cách tích hợp mã nhận dạng hãng vận chuyển, hãy xem phần Tích hợp mã nhận dạng hãng vận chuyển với CarrierConfig.
Khi quá trình tải cấu hình nhà mạng diễn ra
Việc tạo danh sách các cặp khoá-giá trị diễn ra:
- Khi SIM được tải (khởi động hoặc thay thế SIM khi thiết bị đang bật)
- Khi ứng dụng của hãng vận chuyển kích hoạt quá trình tải lại theo cách thủ công
- Khi ứng dụng của hãng vận chuyển được cập nhật
Hãy xem tài liệu tham khảo
android.service.carrier.CarrierService#onLoadConfig()
để biết thêm thông tin chi tiết.
Sử dụng cấu hình
Khi cấu hình được tạo, các giá trị có trong cấu hình đó sẽ được dùng để đặt nhiều giá trị của cấu hình hệ thống, bao gồm:
- Chế độ cài đặt điện thoại nội bộ của khung
- Các giá trị cấu hình do SDK trả về, chẳng hạn như trong SmsManager
- Các chế độ cài đặt ứng dụng, chẳng hạn như giá trị kết nối VVM trong ứng dụng Quay số
Khoá cấu hình
Danh sách khoá được xác định trong SDK công khai trong android.telephony.CarrierConfigManager
và không thể thay đổi trong cùng một cấp độ API. Hãy xem bảng bên dưới để biết thông tin tóm tắt về các khoá.
Tạo ứng dụng
Tạo ứng dụng
Ứng dụng của bạn phải nhắm đến API cấp 23 của Android 6.0.
Khai báo một lớp ghi đè android.service.carrier.CarrierService
- Ghi đè
onLoadConfig
để trả về các giá trị mà bạn muốn cung cấp dựa trên đối tượngservice.carrier.CarrierIdentifier
đã truyền. - Thêm logic để gọi
notifyConfigChangedForSubId
trong các trường hợp mà cấu hình nhà mạng có thể thay đổi theo thời gian (ví dụ: khi người dùng thêm các dịch vụ bổ sung vào tài khoản của họ).
Sau đây là một ví dụ:
public class SampleCarrierConfigService extends CarrierService { private static final String TAG = "SampleCarrierConfigService"; public SampleCarrierConfigService() { Log.d(TAG, "Service created"); } @Override public PersistableBundle onLoadConfig(CarrierIdentifier id) { Log.d(TAG, "Config being fetched"); PersistableBundle config = new PersistableBundle(); config.putBoolean( CarrierConfigManager.KEY_CARRIER_VOLTE_AVAILABLE_BOOL, true); config.putBoolean( CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, false); config.putInt(CarrierConfigManager.KEY_VOLTE_REPLACEMENT_RAT_INT, 6); // Check CarrierIdentifier and add more config if needed… return config; } }
Để biết thêm thông tin chi tiết, hãy xem tài liệu tham khảo android.service.carrier.CarrierService
.
Đặt tên cho lớp trong tệp kê khai
Sau đây là một ví dụ:
<service android:name=".SampleCarrierConfigService" android:label="@string/service_name" android:permission="android.permission.BIND_CARRIER_SERVICES"> <intent-filter> <action android:name="android.service.carrier.CarrierService"/></intent-filter> </service>
Ký ứng dụng bằng cùng một chứng chỉ trên SIM
Hãy xem Đặc quyền của nhà mạng trên UICC để biết các yêu cầu.
Thêm APN bằng ứng dụng của nhà mạng
Để thêm APN theo phương thức lập trình từ một ứng dụng của nhà mạng (ví dụ: trong quá trình kích hoạt SIM), hãy dùng
ContentResolver
API để thêm các mục APN vào một trình cung cấp nội dung được xác định bằng URI
android.provider.Telephony.Carriers.CONTENT_URI
.
Để biết thêm thông tin về cấu trúc bảng cho URI nội dung, hãy xem
Telephony.Carriers
.
Để biết thêm thông tin, hãy xem phần APN và CarrierConfig.
Kiểm tra ứng dụng
Sau khi tạo ứng dụng cấu hình, bạn có thể kiểm thử mã bằng cách:
- SIM có chữ ký chứng chỉ hợp lệ
- Thiết bị chạy Android 6.0 trở lên, ví dụ: thiết bị Android
Thiết lập các chức năng của dịch vụ nhà cung cấp dịch vụ
Trong Android, các chức năng của dịch vụ do nhà mạng cung cấp mô tả việc thiết bị có hỗ trợ dịch vụ thoại, nhắn tin và dữ liệu hay không. Các nhà mạng có thể chỉ định các chức năng dịch vụ của nhà mạng cho một thiết bị ở cấp thiết bị và ở cấp thuê bao (Android 15 trở lên).
Các chức năng dịch vụ ở cấp thiết bị
Các chức năng dịch vụ ở cấp thiết bị được định cấu hình khi thiết bị được sản xuất (không thể thay đổi sau khi sản xuất). Các nhà mạng có thể chỉ định các chức năng ở cấp thiết bị thông qua các chế độ ghi đè tài nguyên hệ thống sau:
Các ứng dụng có thể truy vấn các chức năng dịch vụ ở cấp thiết bị thông qua các API sau:
Các chức năng của dịch vụ ở cấp gói thuê bao
Đối với các thiết bị chạy Android 15 trở lên, nhà mạng có thể chỉ định các chức năng dịch vụ của thiết bị ở cấp thuê bao. Để chỉ định các chức năng dịch vụ ở cấp thuê bao, hãy dùng API
CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY
. Ví dụ: để chỉ định rằng gói thuê bao chỉ có dữ liệu, hãy đặt giá trị thành
SubscriptionManager#SERVICE_CAPABILITY_DATA
.
Các ứng dụng (ứng dụng hệ thống được tải sẵn và ứng dụng bên thứ ba) có thể truy vấn các chức năng của dịch vụ nhà mạng cho một gói thuê bao cụ thể thông qua phương thức
SubscriptionInfo.getServiceCapabilities()
. Điều này cho phép nhà phát triển ứng dụng tuỳ chỉnh trải nghiệm người dùng của ứng dụng dựa trên các chức năng có sẵn cho gói thuê bao. Ví dụ: nhà phát triển ứng dụng có thể đảm bảo rằng ứng dụng quay số không cho phép thực hiện cuộc gọi nếu người dùng chỉ đăng ký gói dữ liệu.
API chức năng dịch vụ không dùng nữa
Kể từ Android 15, Android cung cấp cả các chức năng dịch vụ ở cấp thiết bị và cấp thuê bao. Do thay đổi này, các API hiện có về chức năng ở cấp thiết bị đã được đổi tên để dễ đọc hơn. Bảng sau đây liệt kê các API không dùng nữa và các API được đổi tên trong Android 15:
Không được dùng nữa (Android 14 trở xuống) | Tương đương (Android 15 trở lên) |
---|---|
TelephonyManager.isVoiceCapable() |
TelephonyManager.isDeviceVoiceCapable() |
TelephonyManager.isSmsCapable() |
TelephonyManager.isDeviceSmsCapable() |