이동통신사 구성

Android 6.0 이상에는 이동통신사별 구성을 플랫폼에 제공하기 위한 권한 있는 앱 관련 기능이 포함되어 있습니다. Android 5.1(Lollipop MR1)에서 도입된 UICC 이동통신사 권한에 기반한 이 기능으로 이동통신사 구성을 정적 구성 오버레이에서 바꿀 수 있고 이동통신사 및 OEM이 정의된 인터페이스를 통해 이동통신사 구성을 플랫폼에 동적으로 제공할 수 있습니다.

제대로 서명된 이동통신사 앱은 시스템 이미지에 미리 로드하거나 자동으로 설치하거나 앱 스토어를 통해 수동으로 설치할 수 있습니다. 앱은 플랫폼에서 쿼리되어 다음을 포함한 설정 구성을 제공합니다.

  • 로밍/비 로밍 네트워크
  • 보이는 음성사서함
  • SMS/MMS 네트워크 설정
  • VoLTE/IMS 구성

어떤 값을 반환할지는 전적으로 이동통신사 앱에서 결정하며 플랫폼을 통해 앱으로 전달되는 세부정보에 따라 바뀔 수 있습니다.

이러한 접근 방식의 핵심 이점은 다음과 같습니다.

  • 동적 구성 - MCCMNC 이외에서 파생된 구성과 같은 개념을 지원합니다(예: 알뜰폰 사업자(MVNO) 또는 고객의 추가 서비스 선택).
  • 어떤 채널을 통해 판매된 기기든 지원 - 예를 들어 오픈 마켓 전화는 앱 스토어에서 앱을 다운로드하여 적절한 설정으로 자동 구성할 수 있습니다.
  • 보안 - 이러한 구성을 제공할 수 있는 권한은 이동통신사가 서명한 애플리케이션에만 주어집니다.
  • 정의된 API - 이전에는 이 구성이 대부분의 경우 프레임워크 내의 내부 XML 오버레이에 저장되었으며 공개 API를 거치지 않았습니다. Android 6.0의 이동통신사 구성 API는 공개 API이며 잘 정의되어 있습니다.

작동 방식

구성 로드

이 기능으로 제공된 이동통신사 구성은 플랫폼의 다양한 전화통신 관련 동작을 변경하는 키-값 쌍 집합입니다.

특정 기기의 값 집합은 다음과 같은 구성요소를 순서대로 쿼리하는 방식으로 결정됩니다.

  1. 이동통신사 앱(이는 선택사항이지만 Android 오픈소스 프로젝트(AOSP)에 있는 것 외의 추가 구성에 권장되는 위치임)
  2. 시스템 이미지로 번들화된 플랫폼 구성 앱
  3. 프레임워크에 하드코딩된 기본값(Android 6.0 이전의 동작과 같음)

플랫폼 구성 앱

일반 플랫폼 구성 앱은 시스템 이미지로 번들화됩니다. 이 앱은 일반 이동통신사 앱이 제공하지 않는 모든 변수의 값을 제공할 수 있습니다. 플랫폼 구성 앱은 Android 6.0의 packages/apps/CarrierConfig에서 찾을 수 있습니다.

이 앱의 목적은 이동통신사 앱이 설치되지 않은 경우 네트워크별 구성을 제공하는 데 있으며, 이동통신사/OEM은 자체 이미지에 대한 변경사항은 최소로 적용해야 합니다. 대신 이동통신사는 이동통신사 맞춤설정을 위한 별도의 이동통신사 앱을 제공하여 앱 스토어와 같은 경로를 통해 업데이트가 배포되도록 해야 합니다.

권한이 이동통신사 앱에 부여되는 방식

문제의 이동통신사 앱은 UICC 이동통신사 권한에 기록된 것처럼 SIM 카드의 인증서로 서명되어야 합니다.

이동통신사 앱으로 전달되는 정보

이동통신사 앱은 반환되는 값에 관한 동적인 결정을 내릴 수 있도록 다음 값과 함께 제공됩니다.

  • MCC
  • MNC
  • SPN
  • IMSI
  • GID1
  • GID2
  • 이동통신사 ID

이동통신사 ID 통합에 대한 자세한 내용은 이동통신사 ID를 CarrierConfig에 통합을 참조하세요.

이동통신사 구성 로드 발생 시

키-값 쌍 목록 빌드 발생:

  • SIM이 로드되는 경우(부팅 또는 SIM 핫 스왑)
  • 이동통신사 앱이 수동으로 새로고침을 트리거하는 경우
  • 이동통신사 앱이 업데이트되는 경우

자세한 내용은 android.service.carrier.CarrierService#onLoadConfig() 참조를 읽어보세요.

구성 사용

구성이 빌드되면 구성 내에 포함된 값은 다음을 비롯한 다양한 시스템 구성 값을 설정하는 데 사용됩니다.

  • 내부 프레임워크 전화통신 설정
  • SDK에서 반환한 구성 값(예: SmsManager)
  • 다이얼러의 앱 설정(예: VVM 연결 값)

구성 키

구성 키 목록은 android.telephony.CarrierConfigManager 내 공개 SDK의 일부로 정의되며, 같은 API 수준 내에서 변경할 수 없습니다. 키 요약은 아래 표를 참조하세요.

앱 빌드

앱 만들기

앱이 Android 6.0 API 수준 23을 타겟팅해야 합니다.

android.service.carrier.CarrierService를 재정의하는 클래스 선언

  1. onLoadConfig를 재정의하여 전달된 service.carrier.CarrierIdentifier 객체에 따라 제공하려는 값을 반환합니다.
  2. 시간 경과에 따라 이동통신사 구성이 변경될 수 있는 시나리오(예: 사용자가 계정에 서비스를 추가하는 경우)에서 notifyConfigChangedForSubId를 호출하기 위한 로직을 추가합니다.

아래에 예가 있습니다.

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;
    }
}

자세한 내용은 android.service.carrier.CarrierService 참조를 읽어보세요.

매니페스트에서 클래스 이름 지정

아래에 예가 있습니다.

<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>

SIM과 동일한 인증서로 앱 서명

요구사항은 UICC 이동통신사 권한을 참고하세요.

이동통신사 앱을 통해 APN 추가

이동통신사 앱에 프로그래매틱 방식으로 APN을 추가하려면(예: SIM 활성화 시) ContentResolver API를 사용하여 URI android.provider.Telephony.Carriers.CONTENT_URI로 식별된 콘텐츠 제공자에게 APN 항목을 추가합니다. 콘텐츠 URI의 테이블 구조에 관한 자세한 내용은 Telephony.Carriers를 참조하세요.

자세한 내용은 APN 및 CarrierConfig를 참조하세요.

앱 테스트

구성 앱을 빌드한 후에는 다음을 사용하여 코드를 테스트할 수 있습니다.

  • 유효한 인증서 서명이 포함된 SIM
  • Android 6.0 이상을 실행하는 기기(예: Android 기기)