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

Android 6.0 trở lên bao gồm 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à cung cấp dịch vụ cho nền tảng. Chức năng này, dựa trên Đặc quyền nhà cung cấp UICC được giới thiệu trong Android 5.1 (Lollipop MR1), cho phép di chuyển cấu hình nhà cung cấp dịch vụ khỏi lớp phủ cấu hình tĩnh và cung cấp cho các nhà cung cấp dịch vụ và OEM khả năng tự động cung cấp cấu hình nhà cung cấp dịch vụ cho nền tảng thông qua giao diện được xác định.

Ứng dụng của nhà cung cấp dịch vụ được ký hợp lệ có thể được tải sẵn trong hình ảnh hệ thống, được cài đặt tự động hoặc cài đặt thủ công thông qua cửa hàng ứng dụng. Ứng dụng được nền tảng truy vấn để cung cấp cấu hình cho các cài đặt bao gồm:

  • Mạng chuyển vùng/không chuyển vùng
  • Thư thoại trực quan
  • Cài đặt mạng SMS/MMS
  • Cấu hình VoLTE/IMS

Việc xác định giá trị nào sẽ trả về hoàn toàn tùy thuộc vào ứng dụng của nhà cung cấp dịch vụ và có thể linh hoạt dựa trên thông tin chi tiết được chuyển đến ứng dụng thông qua nền tảng.

Những 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 không bắt nguồn từ MCCMNC, ví dụ: nhà khai thác mạng ảo di động (MVNO) hoặc khách hàng chọn tham gia các dịch vụ bổ sung.
  • Hỗ trợ cho các thiết bị được bán qua bất kỳ kênh nào - Ví dụ: điện thoại ở thị trường mở có thể được cấu hình tự động với cài đặt phù hợp bằng cách tải xuống ứng dụng từ cửa hàng ứng dụng.
  • Bảo mật - Đặc quyền cung cấp cấu hình này chỉ được cấp cho các ứng dụng được nhà cung cấp dịch vụ ký.
  • API được 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 phải 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.

Làm thế nào nó hoạt động

Đang tải cấu hình

Cấu hình nhà cung cấp dịch vụ được cung cấp bởi tính năng này là một tập hợp các cặp khóa-giá trị thay đổi các hành vi khác nhau liên quan đến điện thoại trong 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ự:

  1. Ứng dụng của nhà cung cấp dịch vụ (đây là tùy chọn, nhưng đây là vị trí được đề xuất cho cấu hình bổ sung ngoài những gì tồn tại trong Dự án mã 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 mã hóa 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 giá trị cho bất kỳ biến nào mà ứng dụng của nhà cung cấp dịch vụ thông thường không có. 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 cho mỗi mạng khi ứng dụng của nhà cung cấp dịch vụ chưa được cài đặt và nhà cung cấp dịch vụ/OEM chỉ nên thực hiện những thay đổi tối thiểu đối với ứng dụng đó trong hình ảnh của chính họ. Thay vào đó, các nhà cung cấp dịch vụ nên cung cấp ứng dụng nhà cung cấp dịch vụ riêng biệt để tùy chỉnh nhà cung cấp dịch vụ, cho phép phân phối các bản cập nhật thông qua các con đường 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à cung cấp dịch vụ được đề cập phải được ký bằng cùng một chứng chỉ có trên thẻ SIM, như được ghi trong Đặc quyền của nhà cung cấp dịch vụ UICC .

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

Ứng dụng của nhà cung cấp dịch vụ được cung cấp các giá trị sau, cho phép ứng dụng đưa ra quyết định linh hoạt về giá trị nào sẽ trả về:

  • MCC
  • đa quốc gia
  • SPN
  • IMSI
  • GID1
  • GID2
  • ID nhà cung cấp dịch vụ

Để biết thêm thông tin về việc tích hợp ID nhà cung cấp dịch vụ, hãy xem Tích hợp ID nhà cung cấp dịch vụ với CarrierConfig .

Khi tải cấu hình sóng mang xảy ra

Việc xây dựng danh sách các cặp giá trị khóa xảy ra:

  • Khi SIM được nạp (khởi động hoặc trao đổi nóng SIM)
  • Khi ứng dụng của nhà mạng kích hoạt tải lại theo cách thủ công
  • Khi ứng dụng của nhà mạng được cập nhật

Xem tài liệu tham khảo android.service.carrier.CarrierService#onLoadConfig() để biết thêm chi tiết.

Sử dụng cấu hình

Khi cấu hình được xây dựng, các giá trị chứa trong đó được sử dụng để đặt các giá trị khác nhau của cấu hình hệ thống, bao gồm:

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

Phím cấu hình

Danh sách khóa đượ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. Xem bảng dưới đây để biết tóm tắt về các phím.

Xây dựng ứng dụng

Tạo ứng dụng

Ứng dụng của bạn phải nhắm mục tiêu cấp độ API Android 6.0 (23).

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 được truyền.
  2. Thêm logic để gọi notifyConfigChangedForSubId trong các trường hợp mà cấu hình nhà cung cấp dịch vụ 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ọ).

Một ví dụ dưới đây:

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 chi tiết, hãy xem tài liệu tham khảo android.service.carrier.CarrierService .

Đặt tên lớp trong bảng kê khai

Một ví dụ dưới đây:

<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 có cùng chứng chỉ trên SIM

Xem Đặc quyền của nhà cung cấp dịch vụ UICC để biết các yêu cầu.

Thêm APN bằng ứng dụng của nhà cung cấp dịch vụ

Để thêm APN theo chương trình từ ứng dụng của nhà cung cấp dịch vụ (ví dụ: trong khi kích hoạt SIM), hãy sử dụng API ContentResolver để thêm các mục APN vào nhà cung cấp nội dung được URI android.provider.Telephony.Carriers.CONTENT_URI xác định. Để 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à CarrierConfig .

Thử nghiệm ứng dụng

Khi bạn đã xây dựng ứng dụng cấu hình của mình, bạn có thể kiểm tra mã của mình bằng:

  • SIM chứa chữ ký chứng chỉ hợp lệ
  • Một thiết bị chạy Android 6.0 trở lên, ví dụ như thiết bị Android