Implementando o IMS

O Android 9 apresenta uma nova interface SystemApi chamada ImsService para ajudá-lo a implementar o IP Multimedia Subsystem (IMS). A API ImsService é uma interface bem definida entre a plataforma Android e uma implementação de IMS fornecida pelo fornecedor ou pela operadora.

Visão geral do ImsService

Figura 1. Visão geral do ImsService

Ao usar a interface ImsService, o implementador IMS pode fornecer informações de sinalização importantes para a plataforma, como informações de registro IMS, integração SMS sobre IMS e integração de recursos MmTel para fornecer chamadas de voz e vídeo. A API ImsService também é uma API do sistema Android, o que significa que ela pode ser construída diretamente no SDK do Android, em vez de na fonte. Um aplicativo IMS que foi pré-instalado no dispositivo também pode ser configurado para ser atualizável na Play Store.

Exemplos e fonte

O Android fornece um aplicativo no AOSP que implementa partes da API ImsService para fins de teste e desenvolvimento. Você pode encontrar o aplicativo em /testapps/ImsTestService .

Você pode encontrar a documentação da API ImsService em ImsService e nas outras classes da API.

Implementação

A API ImsService é uma API de alto nível que permite implementar o IMS de várias maneiras, dependendo do hardware disponível. Por exemplo, a implementação muda dependendo se a implementação do IMS está totalmente no processador de aplicativos ou se é parcial ou totalmente transferida para o modem. O Android não fornece um HAL público para descarregamento para o processador de banda base, portanto, qualquer descarregamento deve ocorrer usando sua extensão HAL para o modem.

Compatibilidade com implementações IMS mais antigas

Embora o Android 9 inclua a API ImsService, os dispositivos que usam uma implementação mais antiga para IMS não são compatíveis com a API. Para esses dispositivos, as interfaces AIDL mais antigas e as classes wrapper foram movidas para o namespace android.telephony.ims.compat . Ao atualizar para o Android 9, os dispositivos mais antigos devem fazer o seguinte para continuar o suporte da API mais antiga.

  • Altere o namespace da implementação ImsService para estender a partir da API de namespace android.telephony.ims.compat .
  • Modifique a definição de serviço ImsService em AndroidManifest.xml para usar a ação de filtro de intenção android.telephony.ims.compat.ImsService , em vez da ação android.telephony.ims.ImsService .

A estrutura se vinculará ao ImsService usando a camada de compatibilidade fornecida no Android 9 para trabalhar com a implementação ImsService herdada.

Registro ImsService com o framework

A API ImsService é implementada como um serviço, ao qual a estrutura do Android se vincula para se comunicar com a implementação do IMS. Três etapas são necessárias para registrar um aplicativo que implementa um ImsService com o framework. Primeiramente, a implementação do ImsService deve se registrar na plataforma usando o AndroidManifest.xml do aplicativo; segundo, deve definir quais recursos do IMS a implementação suporta (MmTel ou RCS); e terceiro, deve ser verificado como a implementação confiável do IMS na configuração da operadora ou na sobreposição do dispositivo.

Definição de serviço

O aplicativo IMS registra um ImsService com a estrutura adicionando uma entrada de service no manifesto usando o seguinte formato:

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

A definição de service em AndroidManifest.xml define os seguintes atributos, que são necessários para o funcionamento correto:

  • directBootAware="true" : permite que o serviço seja descoberto e executado por telephony antes que o usuário desbloqueie o dispositivo. O serviço não pode acessar o armazenamento criptografado do dispositivo antes que o usuário desbloqueie o dispositivo. Para obter mais informações, consulte Suporte ao modo de inicialização direta e criptografia baseada em arquivo .
  • persistent="true" : Permite que este serviço seja executado de forma persistente e não seja eliminado pelo sistema para recuperar memória. Este atributo SOMENTE funciona se o aplicativo for criado como um aplicativo do sistema.
  • permission="android.permission.BIND_IMS_SERVICE" : Garante que apenas um processo que tenha a permissão BIND_IMS_SERVICE concedida a ele possa se vincular ao aplicativo. Isso impede que um aplicativo não autorizado seja vinculado ao serviço, pois somente os aplicativos do sistema podem receber a permissão da estrutura.

O serviço também deve especificar o elemento intent-filter com a ação android.telephony.ims.ImsService . Isso permite que a estrutura encontre o ImsService .

Especificação do recurso IMS

Após o ImsService ter sido definido como um serviço Android no AndroidManifest.xml, o ImsService deve definir quais recursos do IMS ele suporta. O Android atualmente suporta os recursos MmTel e RCS, no entanto, apenas o MmTel está integrado à estrutura. Embora não existam APIs RCS integradas ao framework, ainda há vantagens em declará-lo como um recurso do ImsService.

Abaixo estão os recursos válidos definidos em android.telephony.ims.ImsFeature que um ImsService pode fornecer e uma explicação e exemplo de por que um aplicativo IMS deseja implementar um ou todos esses recursos. Depois que cada recurso é definido, esta página descreve como o ImsService declara o conjunto de recursos que ele define para cada slot SIM.

FEATURE_MMTEL

O ImsService implementa o recurso IMS MMTEL, que contém suporte para todas as mídias IMS (especificações IR.92 e IR.94), exceto conexão de emergência ao PDN IMS para chamadas de emergência. Qualquer implementação de ImsService que deseje oferecer suporte aos recursos MMTEL deve estender a classe base android.telephony.ims.MmTelFeature e retornar uma implementação MmTelFeature personalizada em ImsService#createMmTelFeature .

FEATURE_EMERGENCY_MMTEL

Declarar esse recurso apenas sinaliza para a plataforma que a conexão de emergência ao IMS PDN para serviços de emergência é possível. Se esse recurso não for declarado para seu ImsService , a plataforma sempre usará como padrão o Circuit Switch Fallback para serviços de emergência. O recurso FEATURE_MMTEL deve ser definido para que esse recurso seja definido.

FEATURE_RCS

A API ImsService não implementa nenhum recurso IMS RCS, mas a classe base android.telephony.ims.RcsFeature ainda pode ser útil. A estrutura liga automaticamente ao ImsService e chama ImsService#createRcsFeature quando detecta que o pacote deve fornecer RCS. Se o cartão SIM associado ao serviço RCS for removido, a estrutura chamará automaticamente RcsFeature#onFeatureRemoved e limpará o ImsService associado ao recurso RCS. Essa funcionalidade pode remover parte da lógica de detecção/vinculação personalizada que um recurso RCS teria que fornecer de outra forma.

Registro de recursos suportados

A estrutura de telefonia primeiro se associa ao ImsService para consultar os recursos aos quais ele dá suporte usando a API ImsService#querySupportedImsFeatures . Após o framework calcular quais recursos o ImsService suportará, ele chamará ImsService#create[...]Feature para cada recurso pelo qual o ImsService será responsável. Se os recursos aos quais o aplicativo IMS oferece suporte forem alterados, você poderá usar ImsService#onUpdateSupportedImsFeatures para sinalizar à estrutura para recalcular os recursos com suporte. Consulte o diagrama abaixo para obter mais informações sobre a inicialização e a associação do ImsService.

Inicialização e vinculação de ImsService

Figura 2: inicialização e vinculação do ImsService

Detecção e verificação de estrutura de uma implementação ImsService

Uma vez que o ImsService tenha sido definido corretamente em AndroidManifest.xml, a plataforma deve ser configurada para (com segurança) vincular-se ao ImsService quando apropriado. Existem dois tipos de ImsServices aos quais a estrutura se vincula:

  1. ImsService de "substituição" da operadora: Esses ImsServices são pré-carregados no dispositivo, mas são conectados a uma ou mais operadoras de celular e só serão vinculados quando um cartão SIM correspondente for inserido. Isso é configurado usando o
  2. ImsService "padrão" do dispositivo: Este é o ImsService padrão que é carregado no dispositivo por um OEM e deve ser projetado para fornecer serviços IMS em todas as situações em que uma operadora ImsService não está disponível e é útil em situações em que o dispositivo não possui cartão SIM inserido ou o cartão SIM inserido não possui uma operadora ImsService instalada com ele. Isso é definido na sobreposição do dispositivo usando as seguintes configurações:

O Android não oferece suporte a aplicativos com implementações ImsService para download de terceiros, portanto, quaisquer implementações ImsService definidas aqui precisam ser aplicativos do sistema e devem residir na pasta /system/priv-app/ ou /product/priv-app/ para conceder o permissões (ou seja, telefone, microfone, localização, câmera e permissões de contatos). Ao verificar se o nome do pacote da implementação do IMS corresponde aos valores CarrierConfig ou de sobreposição de dispositivo definidos acima, apenas aplicativos pré-instalados confiáveis ​​são vinculados.

Costumização

Os aplicativos que implementam um ImsService são vinculados apenas em dispositivos onde eles são configurados como as configurações de ImsService de "substituição" da operadora ou de ImsService de dispositivo "padrão" para a funcionalidade MMTEL ou RCS. O ImsService também permite que os recursos IMS que ele suporta (MMTEL e RCS) sejam habilitados ou desabilitados dinamicamente por meio de atualizações usando o método ImsService#onUpdateSupportedImsFeatures . Isso aciona a estrutura para recalcular quais ImsServices estão vinculados e quais recursos eles suportam. Se o aplicativo IMS atualizar a estrutura sem suporte para recursos, o ImsService será desvinculado até que o telefone seja reinicializado ou um novo cartão SIM seja inserido que corresponda ao aplicativo IMS.

Prioridade de associação para vários ImsService

A estrutura não pode suportar a vinculação a todos os ImsServices possíveis que são pré-carregados no dispositivo e se vinculará a até dois ImsServices por slot SIM (um ImsService para cada recurso) na seguinte ordem por recurso:

  1. O nome do pacote ImsService definido pelo valor config_ims_[mmtel/rcs]_package_override_string quando há um cartão SIM inserido.
  2. O nome do pacote ImsService definido no valor de sobreposição do dispositivo para config_ims_[mmtel/rcs]_package incluindo o caso em que não há cartão SIM inserido. Este ImsService DEVE suportar o recurso Emergency MmTel.

Você deve ter o nome do pacote do seu ImsService definido no CarrierConfig para cada uma das operadoras que usarão esse pacote ou na sobreposição do dispositivo se o seu ImsService for o padrão, conforme definido acima.

Vamos detalhar isso para cada recurso. Para um dispositivo (single ou multi-SIM) com um único cartão SIM carregado, dois recursos IMS são possíveis: MMTel e RCS. A estrutura tentará vincular na ordem definida acima para cada recurso e, se o recurso não estiver disponível para o ImsService definido na substituição da configuração da operadora, a estrutura retornará ao seu ImsService padrão. Assim, por exemplo, a tabela abaixo descreve qual recurso IMS a estrutura usará, considerando três aplicativos IMS que implementam ImsServices instalados em um sistema com os seguintes recursos:

  • Carrier A ImsService suporta RCS
  • Carrier B ImsService suporta RCS e MMTel
  • OEM ImsService suporta RCS e MMTel
Cartão SIM inserido Recurso RCS Recurso MMTel
Transportadora A Transportadora A OEM
Operadora B Operadora B Operadora B
Sem chip OEM OEM

Validação

As ferramentas para verificar a implementação do IMS em si não estão incluídas, pois as especificações do IMS são extremamente grandes e usam equipamentos de verificação especiais. Os testes só podem verificar se a estrutura de telefonia responde adequadamente à API ImsService.

Desenvolver um aplicativo IMS

Ao desenvolver um aplicativo IMS que faz interface com a pilha de telefonia Android, recomendamos especificar que o aplicativo pode ouvir ou modificar o estado da instância ImsService que está anexada a uma assinatura de operadora específica.

Para ouvir ou modificar o estado de ImsService para recursos MMTEL e RCS, use a classe ImsManager para obter uma instância da ImsMmTelManager , ImsRcsManager ou IMS-specific ProvisioningManager classe. O aplicativo pode então ouvir o serviço específico do IMS e os estados de provisionamento, como:

  • Recursos MMTEL ou RCS habilitados e disponíveis
  • Atualizações quando o estado de registro do IMS muda
  • Status de provisionamento de recursos IMS
  • Recursos IMS que o usuário ativou

Usar ImsStateCallback

Embora ImsService seja um serviço vinculado persistentemente, o serviço vinculado pode mudar quando um novo cartão SIM ou uma assinatura incorporada se torna ativo ou quando a configuração de uma operadora é alterada. Como o ImsService não faz parte do processo de telefonia, um aplicativo pode enfrentar exceções inesperadas ao tentar acessar as APIs do IMS se o ImsService falhar de forma invisível ou for desvinculado devido a uma assinatura ou alteração de configuração.

Em dispositivos com Android 13 ou superior, para monitorar se a instância ImsService de uma assinatura associada está disponível ou indisponível, um aplicativo pode usar a classe ImsStateCallback . Ao obter uma instância de ImsMmTelManager ou ImsRcsManager , recomendamos que o aplicativo primeiro se registre para um retorno de chamada de estado IMS usando ImsMmTelManager#registerImsStateCallback ou ImsRcsManager#registerImsStateCallback . Para continuar recebendo atualizações de retorno de chamada para assinaturas específicas quando ImsService estiver disponível novamente, o aplicativo deve cancelar o registro ou descartar retornos de chamada existentes registrados por meio de ImsMmTelManager , ImsRcsManager ou ProvisioningManager ; e registrar novos retornos de chamada.

Se houver uma assinatura que não dê suporte ao IMS, a estrutura chamará ImsStateCallback#onUnavailable com o motivo REASON_NO_IMS_SERVICE_CONFIGURED . Isso significa que ImsService e as APIs relacionadas ao IMS não estão disponíveis para a assinatura.

No caso improvável de o processo de telefonia falhar, o aplicativo recebe ImsStateCallback#onError e não recebe mais atualizações na instância ImsStateCallback registrada. Para se recuperar dessa condição, registre novamente a instância ImsStateCallback para a assinatura associada chamando ImsMmTelManager#registerImsStateCallback ou ImsRcsManager#registerImsStateCallback .