IMS 구현

Android 9에는 IMS(IP 멀티미디어 하위 시스템)를 구현하는 데 도움이 되는 ImsService 라는 새로운 SystemApi 인터페이스가 도입되었습니다. ImsService API는 Android 플랫폼과 공급업체 또는 이동통신사 제공 IMS 구현 간의 잘 정의된 인터페이스입니다.

ImsService 개요

그림 1. ImsService 개요

ImsService 인터페이스를 사용하여 IMS 구현자는 IMS 등록 정보, IMS를 통한 SMS 통합 및 음성 및 화상 통화를 제공하기 위한 MmTel 기능 통합과 같은 중요한 신호 정보를 플랫폼에 제공할 수 있습니다. ImsService API는 Android 시스템 API이기도 합니다. 즉, 소스 대신 Android SDK에 대해 직접 빌드할 수 있습니다. 기기에 사전 설치된 IMS 애플리케이션도 Play 스토어에서 업데이트할 수 있도록 구성할 수 있습니다.

예제 및 소스

Android는 테스트 및 개발 목적으로 ImsService API의 일부를 구현하는 AOSP의 애플리케이션을 제공합니다. /testapps/ImsTestService 에서 애플리케이션을 찾을 수 있습니다.

ImsService 및 API의 다른 클래스에서 ImsService API에 대한 설명서를 찾을 수 있습니다.

구현

ImsService API는 사용 가능한 하드웨어에 따라 다양한 방식으로 IMS를 구현할 수 있는 고급 API입니다. 예를 들어, IMS 구현이 완전히 애플리케이션 프로세서에 있는지 또는 모뎀에 부분적으로 또는 완전히 오프로드되었는지에 따라 구현이 변경됩니다. Android는 베이스밴드 프로세서로 오프로딩하기 위한 공개 HAL을 제공하지 않으므로 모든 오프로딩은 모뎀에 대한 HAL 확장을 사용하여 발생해야 합니다.

이전 IMS 구현과의 호환성

Android 9에는 ImsService API가 포함되어 있지만 IMS에 대해 이전 구현을 사용하는 기기는 API를 지원할 수 없습니다. 이러한 장치의 경우 이전 AIDL 인터페이스 및 래퍼 클래스가 android.telephony.ims.compat 네임스페이스로 이동되었습니다. Android 9로 업그레이드할 때 이전 기기에서 이전 API 지원을 계속하려면 다음을 수행해야 합니다.

  • android.telephony.ims.compat 네임스페이스 API에서 확장하도록 ImsService 구현의 네임스페이스를 변경합니다.
  • android.telephony.ims.ImsService 작업 대신 android.telephony.ims.compat.ImsService 의도 필터 작업을 사용하도록 AndroidManifest.xml의 ImsService 서비스 정의를 수정합니다.

그런 다음 프레임워크는 Android 9에서 제공되는 호환성 레이어를 사용하여 ImsService에 바인딩하여 레거시 ImsService 구현과 함께 작동합니다.

프레임워크에 ImsService 등록

ImsService API는 Android 프레임워크가 IMS 구현과 통신하기 위해 바인딩하는 서비스로 구현됩니다. ImsService를 구현하는 애플리케이션을 프레임워크에 등록하려면 세 단계가 필요합니다. 먼저 ImsService 구현은 애플리케이션의 AndroidManifest.xml 을 사용하여 플랫폼에 자체적으로 등록해야 합니다. 둘째, 구현이 지원하는 IMS 기능(MmTel 또는 RCS)을 정의해야 합니다. 셋째, 캐리어 구성 또는 장치 오버레이에서 신뢰할 수 있는 IMS 구현으로 확인되어야 합니다.

서비스 정의

IMS 애플리케이션은 다음 형식을 사용하여 매니페스트에 service 항목을 추가하여 프레임워크에 ImsService를 등록합니다.

<service
    android:name="com.egcorp.ims.EgImsService"
    android:directBootAware="true"
    Android:persistent="true"
    ...
    android:permission="android.permission.BIND_IMS_SERVICE" >
    ...
    <intent-filter>
        <action android:name="android.telephony.ims.ImsService" />
    </intent-filter>
</service>

AndroidManifest.xmlservice 정의는 올바른 작동에 필요한 다음 속성을 정의합니다.

  • directBootAware="true" : 사용자가 장치의 잠금을 해제하기 전에 telephony 으로 서비스를 검색하고 실행할 수 있습니다. 사용자가 장치를 잠금 해제하기 전에는 서비스에서 장치 암호화 저장소에 액세스할 수 없습니다. 자세한 내용은 직접 부팅 모드파일 기반 암호화 지원을 참조하십시오.
  • persistent="true" : 이 서비스가 지속적으로 실행되고 시스템에서 메모리를 회수하기 위해 종료되지 않도록 합니다. 이 속성은 응용 프로그램이 시스템 응용 프로그램으로 빌드된 경우에만 작동합니다.
  • permission="android.permission.BIND_IMS_SERVICE" : BIND_IMS_SERVICE 권한이 부여된 프로세스만 애플리케이션에 바인딩할 수 있는지 확인합니다. 이렇게 하면 프레임워크에서 시스템 애플리케이션에만 권한을 부여할 수 있으므로 불량 앱이 서비스에 바인딩되는 것을 방지할 수 있습니다.

서비스는 또한 android.telephony.ims.ImsService 작업으로 intent-filter 요소를 지정해야 합니다. 이를 통해 프레임워크가 ImsService 를 찾을 수 있습니다.

IMS 기능 사양

ImsService가 AndroidManifest.xml에서 Android 서비스로 정의된 후 ImsService는 지원하는 IMS 기능을 정의해야 합니다. Android는 현재 MmTel 및 RCS 기능을 지원하지만 MmTel만 프레임워크에 통합됩니다. 프레임워크에 통합된 RCS API는 없지만 ImsService의 기능으로 선언하면 여전히 이점이 있습니다.

다음은 ImsService가 제공할 수 있는 android.telephony.ims.ImsFeature 에 정의된 유효한 기능과 IMS 애플리케이션이 이러한 기능 중 하나 또는 모두를 구현하려는 이유에 대한 설명과 예입니다. 각 기능이 정의된 후 이 페이지에서는 ImsService 가 각 SIM 슬롯에 대해 정의하는 기능 집합을 선언하는 방법을 간략하게 설명합니다.

FEATURE_MMTEL

ImsService 는 긴급 호출을 위해 IMS PDN에 긴급 연결을 제외한 모든 IMS 미디어(IR.92 및 IR.94 사양)에 대한 지원을 포함하는 IMS MMTEL 기능을 구현합니다. MMTEL 기능을 지원하려는 ImsService 구현은 android.telephony.ims.MmTelFeature 기본 클래스를 확장하고 ImsService#createMmTelFeature 에서 사용자 지정 MmTelFeature 구현을 반환해야 합니다.

FEATURE_EMERGENCY_MMTEL

이 기능을 선언하면 긴급 서비스를 위해 IMS PDN에 긴급 연결이 가능하다는 신호만 플랫폼에 알립니다. ImsService 에 대해 이 기능이 선언되지 않은 경우 플랫폼은 항상 긴급 서비스에 대해 기본적으로 Circuit Switch Fallback으로 설정됩니다. 이 기능을 정의하려면 FEATURE_MMTEL 기능을 정의해야 합니다.

FEATURE_RCS

ImsService API는 IMS RCS 기능을 구현하지 않지만 android.telephony.ims.RcsFeature 기본 클래스는 여전히 유용할 수 있습니다. 프레임워크는 자동으로 ImsService에 바인딩하고 패키지가 RCS를 제공해야 함을 감지하면 ImsService#createRcsFeature 를 호출합니다. RCS 서비스와 연결된 SIM 카드가 제거되면 프레임워크는 자동으로 RcsFeature#onFeatureRemoved 를 호출한 다음 RCS 기능과 연결된 ImsService 를 정리합니다. 이 기능은 RCS 기능이 제공해야 하는 사용자 지정 감지/바인딩 로직 중 일부를 제거할 수 있습니다.

지원되는 기능 등록

전화 통신 프레임워크는 먼저 ImsService에 바인딩하여 ImsService#querySupportedImsFeatures API를 사용하여 지원하는 기능을 쿼리합니다. 프레임워크는 ImsService가 지원할 기능을 계산한 후 ImsService가 담당할 각 기능에 대해 ImsService#create[...]Feature 를 호출합니다. IMS 애플리케이션이 지원하는 기능이 변경되면 ImsService#onUpdateSupportedImsFeatures 를 사용하여 지원되는 기능을 다시 계산하도록 프레임워크에 신호를 보낼 수 있습니다. ImsService의 초기화 및 바인딩에 대한 자세한 내용은 아래 다이어그램을 참조하세요.

ImsService 초기화 및 바인딩

그림 2: ImsService 초기화 및 바인딩

ImsService 구현의 프레임워크 감지 및 검증

ImsService가 AndroidManifest.xml에서 올바르게 정의되면 적절한 경우 ImsService에 (안전하게) 바인딩하도록 플랫폼을 구성해야 합니다. 프레임워크가 바인딩하는 두 가지 유형의 ImsService가 있습니다.

  1. 이동통신사 "재정의" ImsService: 이러한 ImsService는 기기에 미리 로드되지만 하나 이상의 이동통신사에 연결되어 있으며 일치하는 SIM 카드가 삽입된 경우에만 바인딩됩니다. 이것은 다음을 사용하여 구성됩니다.
  2. 장치 "기본" ImsService: OEM이 장치에 로드하는 기본 ImsService이며 이동통신사 ImsService를 사용할 수 없는 모든 상황에서 IMS 서비스를 제공하도록 설계되어야 하며 장치에 SIM 카드가 없는 상황에서 유용합니다. 삽입되었거나 삽입된 SIM 카드에 이동통신사 ImsService가 설치되어 있지 않습니다. 이것은 다음 구성을 사용하여 장치 오버레이에 정의됩니다.

Android는 타사 다운로드 가능한 ImsService 구현이 있는 앱을 지원하지 않으므로 여기에 정의된 모든 ImsService 구현은 시스템 애플리케이션이어야 하며 적절한 권한을 부여하려면 /system/priv-app/ 또는 /product/priv-app/ 폴더에 있어야 합니다. 권한(즉, 전화, 마이크, 위치, 카메라 및 연락처 권한). IMS 구현의 패키지 이름이 위에서 정의한 CarrierConfig 또는 장치 오버레이 값과 일치하는지 확인하여 신뢰할 수 있는 사전 설치된 애플리케이션만 바인딩됩니다.

커스터마이징

ImsService를 구현하는 응용 프로그램은 MMTEL 또는 RCS 기능에 대한 ImsService 또는 장치 "기본" ImsService 구성을 캐리어 "재정의"로 구성한 장치에만 바인딩됩니다. 또한 ImsService를 사용하면 ImsService#onUpdateSupportedImsFeatures 메서드를 사용하여 업데이트를 통해 지원하는 IMS 기능(MMTEL 및 RCS)을 동적으로 활성화하거나 비활성화할 수 있습니다. 이는 바인딩된 ImsService와 지원하는 기능을 다시 계산하도록 프레임워크를 트리거합니다. IMS 애플리케이션이 지원되는 기능이 없는 프레임워크를 업데이트하면 전화기가 재부팅되거나 IMS 애플리케이션과 일치하는 새 SIM 카드가 삽입될 때까지 ImsService가 바인딩 해제됩니다.

여러 ImsService에 대한 바인딩 우선 순위

프레임워크는 기기에 사전 로드된 모든 가능한 ImsService에 대한 바인딩을 지원할 수 없으며 기능별로 다음 순서로 SIM 슬롯당 최대 2개의 ImsService(각 기능에 대해 하나의 ImsService)에 바인딩합니다.

  1. SIM 카드가 삽입된 경우 CarrierConfig 값 config_ims_[mmtel/rcs]_package_override_string 에 의해 정의되는 ImsService 패키지 이름입니다.
  2. SIM 카드가 삽입되지 않은 경우를 포함하여 config_ims_[mmtel/rcs]_package 에 대한 장치 오버레이 값에 정의된 ImsService 패키지 이름입니다. 이 ImsService는 긴급 MmTel 기능을 지원해야 합니다(MUST).

위에 정의된 대로 ImsService가 기본값인 경우 해당 패키지를 사용할 각 이동통신사의 CarrierConfig 또는 장치 오버레이에 정의된 ImsService의 패키지 이름이 있어야 합니다.

이를 각 기능에 대해 분석해 보겠습니다. 단일 SIM 카드가 로드된 장치(단일 또는 다중 SIM)의 경우 MMTel 및 RCS의 두 가지 IMS 기능이 가능합니다. 프레임워크는 각 기능에 대해 위에 정의된 순서대로 바인딩을 시도하고 캐리어 구성 재정의에 정의된 ImsService에 기능을 사용할 수 없는 경우 프레임워크는 기본 ImsService로 대체됩니다. 예를 들어, 아래 표는 프레임워크가 다음 기능이 있는 시스템에 설치된 ImsServices를 구현하는 세 가지 IMS 응용 프로그램에서 사용할 IMS 기능을 설명합니다.

  • 이동통신사 A ImsService는 RCS를 지원합니다.
  • Carrier B ImsService는 RCS 및 MMTel을 지원합니다.
  • OEM ImsService는 RCS 및 MMTel을 지원합니다.
SIM 카드 삽입 RCS 기능 MMTel 기능
캐리어 A 캐리어 A OEM
캐리어 B 캐리어 B 캐리어 B
SIM 없음 OEM OEM

확인

IMS 사양이 매우 크고 특수 검증 장비를 사용하기 때문에 IMS 구현 자체를 검증하기 위한 도구는 포함되어 있지 않습니다. 테스트는 전화 통신 프레임워크가 ImsService API에 제대로 응답하는지 확인할 수만 있습니다.

IMS 앱 개발

Android 전화 스택과 인터페이스하는 IMS 앱을 개발할 때 앱이 특정 이동통신사 구독에 연결된 ImsService 인스턴스의 상태를 수신하거나 수정할 수 있도록 지정하는 것이 좋습니다.

MMTEL 및 RCS 기능에 대한 ImsService의 상태를 수신하거나 수정하려면 ImsManager 클래스를 사용하여 ImsMmTelManager , ImsRcsManager 또는 IMS 특정 ProvisioningManager 클래스의 인스턴스를 가져옵니다. 그런 다음 앱은 다음과 같은 IMS 관련 서비스 및 프로비저닝 상태를 수신할 수 있습니다.

  • 활성화되고 사용 가능한 MMTEL 또는 RCS 기능
  • IMS 등록 상태가 변경되면 업데이트
  • IMS 기능의 프로비저닝 상태
  • 사용자가 활성화한 IMS 기능

ImsStateCallback 사용

ImsService는 지속적으로 바인딩된 서비스이지만 새 SIM 카드 또는 내장된 구독이 활성화되거나 이동통신사 구성이 변경되면 바인딩된 서비스가 변경될 수 있습니다. ImsService는 전화 통신 프로세스의 일부가 아니므로 ImsService가 구독 또는 구성 변경으로 인해 보이지 않게 충돌하거나 바인딩 해제된 경우 IMS API에 액세스하려고 할 때 앱에서 예상치 못한 예외가 발생할 수 있습니다.

Android 13 이상을 실행하는 기기에서 연결된 구독에 대한 ImsService 인스턴스를 사용할 수 있는지 여부를 모니터링하기 위해 앱은 ImsStateCallback 클래스를 사용할 수 있습니다. ImsMmTelManager 또는 ImsRcsManager 인스턴스를 가져올 때 앱에서 먼저 ImsMmTelManager#registerImsStateCallback 또는 ImsRcsManager#registerImsStateCallback registerImsStateCallback 을 사용하여 IMS 상태 콜백을 등록하는 것이 좋습니다. ImsService를 다시 사용할 수 있게 되었을 때 특정 구독에 대한 콜백 업데이트를 계속 수신하려면 앱이 ImsMmTelManager , ImsRcsManager 또는 ProvisioningManager 를 통해 등록된 기존 콜백을 등록 취소하거나 삭제해야 합니다. 새 콜백을 등록합니다.

IMS를 지원하지 않는 구독이 있는 경우 프레임워크는 이유 REASON_NO_IMS_SERVICE_CONFIGURED 와 함께 ImsStateCallback#onUnavailable 을 호출합니다. 이는 ImsService 및 IMS 관련 API를 구독에 사용할 수 없음을 의미합니다.

드물게 전화 통신 프로세스가 충돌하는 경우 앱은 ImsStateCallback#onError 를 수신하고 등록된 ImsStateCallback 인스턴스에 대한 업데이트를 더 이상 수신하지 않습니다. 이 상태에서 복구하려면 ImsMmTelManager#registerImsStateCallback 또는 ImsRcsManager#registerImsStateCallback registerImsStateCallback 을 호출하여 연결된 구독에 대한 ImsStateCallback 인스턴스를 다시 등록하십시오.