Implementando IMS

O Android 9 apresenta uma nova interface SystemApi chamada ImsService para ajudar você a implementar o IP Multimedia Subsystem (IMS). A API ImsService é uma interface bem definida entre a plataforma Android e uma implementação IMS fornecida por um fornecedor ou 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 de 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 pode ser construída diretamente no SDK do Android, em vez de na fonte. Um aplicativo IMS 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 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 do aplicativo ou se está parcial ou totalmente descarregada no 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 do IMS não são compatíveis com a API. Para esses dispositivos, as interfaces AIDL e classes wrapper mais antigas 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 a oferecer suporte à API mais antiga.

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

A estrutura será então vinculada ao ImsService usando a camada de compatibilidade fornecida no Android 9 para funcionar com a implementação herdada ImsService .

Registro ImsService com o framework

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

Definição de serviço

O aplicativo IMS registra um ImsService na estrutura adicionando uma entrada service ao 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 service em AndroidManifest.xml define os seguintes atributos, que são necessários para a operação correta:

  • 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 SÓ funciona se o aplicativo for criado como um aplicativo de sistema.
  • permission="android.permission.BIND_IMS_SERVICE" : garante que apenas um processo que tenha a permissão BIND_IMS_SERVICE concedida possa se vincular ao aplicativo. Isso evita que um aplicativo não autorizado se vincule ao serviço, uma vez que apenas os aplicativos do sistema podem receber 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 de recurso IMS

Depois que o ImsService tiver sido definido como um serviço Android em AndroidManifest.xml, o ImsService deverá definir quais recursos do IMS ele suporta. O Android atualmente suporta os recursos MmTel e RCS, porém apenas o MmTel está integrado à estrutura. Embora não existam APIs RCS integradas à estrutura, ainda há vantagens em declará-la 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. Após a definição de cada recurso, esta página descreve como o ImsService declara o conjunto de recursos que 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 do 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 é possível anexar emergência ao IMS PDN para serviços de emergência. 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 se 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, em seguida, limpará o ImsService associado ao recurso RCS. Essa funcionalidade pode remover parte da lógica personalizada de detecção/ligação que um recurso RCS teria que fornecer.

Registro de recursos suportados

A estrutura de telefonia primeiro se liga ao ImsService para consultar os recursos que ele suporta usando a API ImsService#querySupportedImsFeatures . Depois que a estrutura calcular quais recursos o ImsService suportará, ele chamará ImsService#create[...]Feature para cada recurso pelo qual o ImsService será responsável. Se os recursos suportados pelo aplicativo IMS forem alterados, será possível usar ImsService#onUpdateSupportedImsFeatures para sinalizar a estrutura para recalcular os recursos suportados. Consulte o diagrama abaixo para obter mais informações sobre a inicialização e ligação do ImsService.

Inicialização e ligação do ImsService

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

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

Depois que o ImsService tiver sido definido corretamente no AndroidManifest.xml, a plataforma deverá ser configurada para vincular-se (com segurança) 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 estã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 quando uma operadora ImsService não está disponível e é útil em situações onde o dispositivo não possui cartão SIM inserido ou o cartão SIM inserido não possui uma operadora ImsService instalada. Isso é definido na sobreposição do dispositivo usando as seguintes configurações:

O Android não oferece suporte a aplicativos com implementações de ImsService para download de terceiros, portanto, quaisquer implementações de ImsService definidas aqui devem ser aplicativos do sistema e devem residir na pasta /system/priv-app/ ou /product/priv-app/ para conceder o apropriado permissões (ou seja, permissões de telefone, microfone, localização, câmera e 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 confiáveis ​​e pré-instalados serão vinculados.

Costumização

Os aplicativos que implementam um ImsService são vinculados apenas a dispositivos onde estão configurados como a operadora "substitui" o ImsService ou as configurações "padrão" do ImsService do dispositivo para funcionalidade MMTEL ou RCS. O ImsService também permite que os recursos IMS suportados (MMTEL e RCS) sejam ativados ou desativados 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 recursos suportados, 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 ligação para vários ImsService

A estrutura não pode suportar a vinculação a todos os ImsServices possíveis que estão pré-carregados no dispositivo e será vinculada 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 CarrierConfig 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 (único 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á, dados três aplicativos IMS que implementam ImsServices instalados em um sistema com os seguintes recursos:

  • Operadora A ImsService suporta RCS
  • Operadora 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
Transportadora B Transportadora B Transportadora B
Sem cartão SIM OEM OEM

Validação

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

Desenvolva um aplicativo IMS

Ao desenvolver um aplicativo IMS que faz interface com a pilha de telefonia Android, recomendamos especificar que o aplicativo pode escutar ou modificar o estado da instância ImsService 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 classe ImsMmTelManager , ImsRcsManager ou ProvisioningManager específica do IMS. O aplicativo pode então ouvir serviços específicos do IMS e 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 do IMS
  • Recursos do 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 assinatura incorporada se tornar ativo ou quando a configuração de uma operadora for alterada. Como o ImsService não faz parte do processo de telefonia, um aplicativo pode enfrentar exceções imprevistas ao tentar acessar APIs do IMS se o ImsService travar invisivelmente ou for desvinculado devido a uma assinatura ou alteração de configuração.

Em dispositivos que executam o 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 registre-se 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 deverá 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 oferece suporte ao IMS, a estrutura chamará ImsStateCallback#onUnavailable com o motivo REASON_NO_IMS_SERVICE_CONFIGURED . Isso significa que o ImsService e as APIs relacionadas ao IMS não estão disponíveis para a assinatura.

No caso improvável de falha do processo de telefonia, 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 .