Cấu hình của nhà cung cấp dịch vụ

Android 6.0 trở lên có khả năng cho các ứng dụng đặ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 Quyền đặc biệt của nhà mạng 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 ra khỏi lớp phủ cấu hình tĩnh và cho phép nhà mạng cũng như nhà sản xuất thiết bị gốc (OEM) linh động cung cấp cấu hình nhà mạng cho nền tảng thông qua một giao diện đã xác định.

Một ứng dụng của nhà mạng đã được ký đúng cách có thể được tải trước trong hình ảnh hệ thống, được cài đặt tự động 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 truy vấn ứng dụng này để 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
  • 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 phụ thuộc vào ứng dụng của nhà mạng và có thể linh động dựa trên thông tin chi tiết được chuyển đến ứng dụng thông qua nền tảng.

Các lợi ích chính của phương pháp này là:

  • Cấu hình động – Hỗ trợ các khái niệm như cấu hình phát sinh không phải MCCMNC, ví dụ: nhà khai thác mạng ảo di động (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 bất kỳ kênh nào – Ví dụ: điện thoại trên thị trường mở có thể tự động được định cấu hình bằng chế độ cài đặt phù hợp bằng cách tải ứng dụng xuống từ cửa hàng ứng dụng.
  • Bảo mật – Quyền cung cấp cấu hình này chỉ được cấp cho các ứng dụng do nhà mạng ký.
  • API xác định – Trước đây, cấu hình này được lưu trữ chủ yếu trong 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õ.

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ị thay đổi nhiều hành vi liên quan đến điện thoại trong nền tảng.

Tập hợp giá trị của 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ự:

  1. Ứng dụng của nhà mạng (không bắt buộc, nhưng đây là vị trí được đề xuất để định cấu hình bổ sung ngoài những gì có trong Dự án nguồn mở Android (AOSP))
  2. Ứng dụng cấu hình nền tảng đi kèm với hình ảnh hệ thống
  3. Giá trị mặc định, được cố định giá trị trong mã 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 đóng gói cùng với hình ảnh hệ thống. Ứng dụng này có thể cung cấp giá trị cho bất kỳ biến nào mà ứng dụng của nhà mạng 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) trong: packages/apps/CarrierConfig

Mục đích của ứng dụng này là cung cấp một số cấu hình theo từng mạng khi ứng dụng của nhà mạng không được cài đặt và nhà mạng/OEM chỉ nên thực hiện thay đổi tối thiểu đối với cấu hình đó trong hình ảnh của chính họ. Thay vào đó, 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 bản cập nhật thông qua các kênh như cửa hàng ứng dụng.

Cách cấp đặc quyền cho một ứng dụng của nhà mạng

Ứng dụng của nhà mạng hữu quan phải được ký bằng cùng một chứng chỉ có trên thẻ SIM, như đã nêu trong phần Quyền đặc biệt của nhà mạng UICC.

Thông tin nào được chuyển đến ứng dụng của nhà mạng

Ứng dụng của nhà mạng được cung cấp các giá trị sau đây, cho phép ứng dụng này đưa ra quyết định linh động về giá trị cần trả về:

  • MCC
  • MNC
  • SPN
  • IMSI (số nhận dạng thuê bao di động quốc tế)
  • Hàm GID1
  • GID2 (Mã nhận dạng thiết bị di động) 2
  • Mã nhà mạng

Để biết thêm thông tin về việc tích hợp mã nhà mạng, hãy xem phần Tích hợp mã nhà mạng với ProviderConfig.

Khi tải cấu hình nhà mạng

Quá trình 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 hoán đổi nóng SIM)
  • Khi ứng dụng của nhà mạng kích hoạt quá trình tải lại theo cách thủ công
  • Khi ứng dụng của nhà mạng đượ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ấu hình hệ thống, bao gồm:

  • Cài đặt điện thoại trong khung nội bộ
  • Giá trị cấu hình được SDK trả về (ví dụ: trong SmsManager)
  • Chế độ cài đặt ứng dụng như giá trị kết nối VVM trong Trình quay số

Khoá cấu hình

Danh sách khoá được xác định là một phần của 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

  1. Ghi đè onLoadConfig để trả về các giá trị bạn muốn cung cấp dựa trên đối tượng service.carrier.CarrierIdentifier đã truyền.
  2. Thêm logic để gọi notifyConfigChangedForSubId trong các trường hợp mà cấu hình của 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ọ).

Dưới đây là 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 về android.service.carrier.CarrierService.

Đặt tên cho lớp trong tệp kê khai

Sau đây là 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 chính chứng chỉ đó trên SIM

Hãy xem phần UICC Provider Đặc quyền của nhà mạng để 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ừ ứng dụng của nhà mạng (ví dụ: trong quá trình kích hoạt SIM), hãy sử dụng API ContentResolver để 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 APN và ProviderConfig.

Kiểm tra ứng dụng

Khi đã tạo ứng dụng cấu hình, bạn có thể kiểm thử mã bằng:

  • SIM có chứa một 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

Đặt khả năng của dịch vụ của nhà mạng

Trong Android, các tính năng dịch vụ của nhà mạng mô tả liệu dịch vụ thoại, nhắn tin và dữ liệu có được hỗ trợ trên thiết bị hay không. Nhà mạng có thể chỉ định các tính năng dịch vụ của nhà mạng cho một thiết bị ở cấp thiết bị và ở cấp gói thuê bao (Android 15 trở lên).

Khả năng của 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). 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 đây:

Ứng dụng có thể truy vấn chức năng của dịch vụ ở cấp thiết bị thông qua các API sau:

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 tính năng dịch vụ của thiết bị ở cấp gói thuê bao. Để chỉ định các tính năng dịch vụ cấp gói thuê bao, hãy sử dụng API CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY. Ví dụ: để chỉ định rằng một 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 tải trước và ứng dụng bên thứ ba) có thể truy vấn các chức năng dịch vụ của nhà mạng cho một gói thuê bao đã chỉ định 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 tính 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 gọi điện không cho phép gọi điện nếu người dùng đang sử dụng gói thuê bao chỉ dựa trên dữ liệu.

API không dùng nữa về chức năng dịch vụ

Kể từ Android 15, Android sẽ cung cấp các chức năng dịch vụ ở cả cấp thiết bị và cấp gói thuê bao. Do thay đổi này, các API chức năng cấp thiết bị hiện có đã đượ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 được giới thiệu trong Android 15:

Không 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()