O Android 9 apresenta uma 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 de IMS fornecida por um fornecedor ou operadora.

Figura 1. Visão geral do ImsService
Ao usar a interface ImsService, o implementador do IMS pode fornecer informações de sinalização importantes para a plataforma, como informações de registro do IMS, integração de SMS pelo IMS e integração de recursos MmTel para oferecer chamadas de voz e vídeo. A API ImsService também é uma API do sistema Android, o que significa que ela pode ser criada diretamente no SDK do Android, em vez da origem. Um app IMS pré-instalado no dispositivo também pode ser configurado para ser atualizável pela Google Play Store.
Exemplos e origem
O Android oferece um app no AOSP que implementa partes da API ImsService para fins de teste e desenvolvimento. Você pode encontrar o app em /testapps/ImsTestService.
A documentação da API ImsService está disponível 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 do app ou se ela está parcial ou totalmente descarregada para o modem. O Android não fornece um HAL público para descarregar para o processador de banda base. Portanto, qualquer descarregamento precisa ocorrer usando a extensão HAL para o modem.
Compatibilidade com implementações mais antigas do IMS
Embora o Android 9 inclua a API ImsService, os dispositivos que usam uma implementação mais antiga do IMS não podem oferecer suporte à API.
Para esses dispositivos, as interfaces AIDL e as classes wrapper mais antigas foram movidas para o namespace android.telephony.ims.compat. Ao fazer upgrade para o Android 9, os dispositivos mais antigos precisam fazer o seguinte para continuar oferecendo suporte à API mais antiga.
- Mude o namespace da implementação do ImsService para estender da API de namespace
android.telephony.ims.compat. - Modifique a definição de serviço do ImsService no AndroidManifest.xml para usar a ação de filtro de intent
android.telephony.ims.compat.ImsService, em vez da açãoandroid.telephony.ims.ImsService.
O framework vai se vincular ao ImsService usando a camada de compatibilidade fornecida no Android 9 para trabalhar com a implementação legada do ImsService.
Registro do ImsService com o framework
A API ImsService é implementada como um serviço ao qual o framework do Android se vincula para se comunicar com a implementação do IMS. Três etapas são necessárias para registrar um app que implementa um ImsService com o framework. Primeiro, a implementação do ImsService precisa se registrar na plataforma usando o AndroidManifest.xml do app. Em segundo lugar, ela precisa definir quais recursos do IMS a implementação oferece suporte (MmTel ou RCS). Em terceiro lugar, ela precisa ser verificada como a implementação confiável do IMS na configuração da operadora ou na sobreposição do dispositivo.
Definição de Service
O app IMS registra um ImsService com o framework 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 no 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 portelephonyantes que o usuário desbloqueie o dispositivo. O serviço não pode acessar o armazenamento criptografado pelo dispositivo antes que o usuário desbloqueie o dispositivo. Para mais informações, consulte Oferecer suporte ao modo de inicialização direta e à criptografia baseada em arquivos.persistent="true": permite que esse serviço seja executado de forma persistente e não seja encerrado pelo sistema para recuperar memória. Esse atributo SÓ funciona se o app for criado como um app do sistema.permission="android.permission.BIND_IMS_SERVICE": garante que apenas um processo que recebeu a permissãoBIND_IMS_SERVICEpossa se vincular ao app. Isso impede que um app malicioso se vincule ao serviço, já que apenas os apps do sistema podem receber a permissão do framework.
O serviço também precisa especificar o elemento intent-filter com a ação android.telephony.ims.ImsService. Isso permite que o framework encontre o ImsService.
Especificação do recurso IMS
Depois que o ImsService for definido como um serviço do Android no AndroidManifest.xml, ele precisará definir quais recursos do IMS oferece suporte. Atualmente, o Android oferece suporte aos recursos MmTel e RCS, mas apenas o MmTel está integrado ao framework. Embora não haja APIs RCS integradas ao framework, ainda há vantagens em declará-lo como um recurso do ImsService.
Confira abaixo os recursos válidos definidos em android.telephony.ims.ImsFeature que um ImsService pode fornecer, além de uma explicação e um exemplo de por que um app IMS gostaria de 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 de 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 a conexão de emergência com a PDN do IMS para chamadas de emergência. Qualquer implementação de ImsService que queira
oferecer suporte aos recursos MMTEL precisa estender a
android.telephony.ims.MmTelFeature classe de base 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 com a PDN do IMS para serviços de emergência é possível. Se esse recurso não for declarado para o ImsService, a plataforma sempre vai usar o fallback de comutação de circuito para serviços de emergência. O recurso FEATURE_MMTEL precisa ser definido para que esse recurso seja definido.
FEATURE_RCS
A API ImsService não implementa nenhum recurso IMS RCS, mas a classe de base android.telephony.ims.RcsFeature ainda pode ser útil. O framework se vincula automaticamente ao ImsService e chama ImsService#createRcsFeature quando detecta que o pacote precisa fornecer RCS. Se o cartão SIM associado ao serviço RCS for removido, o framework vai chamar automaticamente RcsFeature#onFeatureRemoved e limpar o ImsService associado ao recurso RCS. Essa funcionalidade pode remover parte da lógica de detecção ou vinculação personalizada que um recurso RCS precisaria fornecer.
Registro de recursos com suporte
O framework de telefonia primeiro se vincula ao ImsService para consultar os recursos que ele oferece suporte usando a API ImsService#querySupportedImsFeatures. Depois que o framework calcula quais recursos o ImsService vai oferecer suporte, ele chama ImsService#create[...]Feature para cada recurso de que o ImsService será responsável. Se os recursos que o app IMS oferece suporte mudarem, você poderá usar ImsService#onUpdateSupportedImsFeatures para sinalizar o framework para recalcular os recursos com suporte. Consulte o diagrama a seguir para mais informações sobre a inicialização e a vinculação do ImsService.
Figura 2. Inicialização e vinculação do ImsService
Detecção e verificação do framework de uma implementação do ImsService
Depois que o ImsService for definido corretamente no AndroidManifest.xml, a plataforma precisará ser configurada para se vincular (com segurança) ao ImsService quando apropriado. Há dois tipos de ImsServices aos quais o framework se vincula:
- ImsService de "substituição" da operadora: esses ImsServices são pré-carregados no dispositivo, mas estão anexados a uma ou mais operadoras de telefonia celular e só serão vinculados quando um chip correspondente for inserido. Isso é configurado usando a
config_ims_mmtel_package_override_stringchave `config_ims_mmtel_package_override_string` CarrierConfig para ImsServices que implementam recursos MMTEL.config_ims_rcs_package_override_stringpara ImsServices que implementam recursos RCS.
- ImsService "padrão" do dispositivo: esse é o ImsService padrão carregado no dispositivo por um OEM e precisa ser projetado para fornecer serviços IMS em todas as situações em que um ImsService da operadora não está disponível. Ele é útil em situações em que o dispositivo não tem um cartão SIM inserido ou o cartão SIM inserido não tem um ImsService da operadora instalado. Isso é definido na sobreposição do dispositivo usando as seguintes configurações:
config_ims_mmtel_package: implementa recursos MMTELconfig_ims_rcs_package: implementa recursos RCS
O Android não oferece suporte a apps com implementações de ImsService para download de terceiros. Portanto, todas as implementações de ImsService definidas aqui precisam ser apps do sistema e precisam residir na pasta /system/priv-app/ ou /product/priv-app/ para conceder as permissões apropriadas (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 de CarrierConfig ou de sobreposição do dispositivo definidos acima, apenas apps confiáveis e pré-instalados são vinculados.
Personalização
Os apps que implementam um ImsService só são vinculados em dispositivos em que estão configurados como as configurações de ImsService de "substituição" da operadora ou de ImsService "padrão" do dispositivo para funcionalidade MMTEL ou RCS.
O ImsService também permite que os recursos IMS que ele oferece suporte (MMTEL e RCS) sejam ativados ou desativados dinamicamente usando atualizações com o método ImsService#onUpdateSupportedImsFeatures. Isso aciona o framework para recalcular quais ImsServices estão vinculados e quais recursos eles oferecem suporte. Se o app IMS atualizar o framework sem recursos com suporte, o ImsService será desvinculado até que o smartphone seja reinicializado ou um novo chip seja inserido que corresponda ao app IMS.
Prioridade de vinculação para vários ImsService
O framework não pode oferecer suporte à vinculação a todos os ImsServices possíveis que são pré-carregados no dispositivo e se vinculam a até dois ImsServices por slot de SIM (um ImsService para cada recurso) na seguinte ordem por recurso:
- O nome do pacote ImsService definido pelo valor CarrierConfig
config_ims_[mmtel/rcs]_package_override_stringquando há um chip inserido. - 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. Esse ImsService PRECISA oferecer suporte ao recurso MmTel de emergência.
Você precisa ter o nome do pacote do ImsService definido no CarrierConfig para cada uma das operadoras que usarão esse pacote ou na sobreposição do dispositivo se o ImsService for o padrão, conforme definido acima.
Vamos detalhar isso para cada recurso. Para um dispositivo (SIM único ou múltiplo) com um único cartão SIM carregado, dois recursos IMS são possíveis: MMTel e RCS. O framework vai tentar se 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, o framework vai usar o ImsService padrão. Por exemplo, a tabela abaixo descreve qual recurso IMS o framework vai usar, considerando três apps IMS que implementam ImsServices instalados em um sistema com os seguintes recursos:
- O ImsService da operadora A oferece suporte ao RCS
- O ImsService da operadora B oferece suporte ao RCS e ao MMTel
- O ImsService do OEM oferece suporte ao RCS e ao MMTel
| Cartão SIM inserido | Recurso RCS | Recurso MMTel |
|---|---|---|
| Operadora A | Operadora A | OEM |
| Operadora B | Operadora B | Operadora B |
| Sem chip | OEM | OEM |
Validação
As ferramentas para verificar a implementação do IMS não estão incluídas, já que as especificações do IMS são extremamente grandes e usam equipamentos de verificação especiais. Os testes só podem verificar se o framework de telefonia responde corretamente à API ImsService.
Desenvolver um app IMS
Ao desenvolver um app IMS que faz interface com a pilha de telefonia do Android, recomendamos especificar que o app pode ouvir ou modificar o estado da instância do ImsService anexada a uma assinatura de operadora específica.
Para ouvir ou modificar o estado do ImsService para recursos MMTEL e RCS, use
a
ImsManager
classe para receber uma instância da
ImsMmTelManager,
ImsRcsManager,
ou
ProvisioningManager
classe específica do IMS. O app pode ouvir o serviço específico do IMS e os estados de provisionamento, como:
- Recursos MMTEL ou RCS ativados e disponíveis
- Atualizações quando o estado de registro do IMS muda
- Status de provisionamento dos recursos IMS
- Recursos IMS que o usuário ativou
Usar ImsStateCallback
Embora o ImsService seja um serviço vinculado de forma persistente, o serviço vinculado pode mudar quando um novo chip ou assinatura incorporada é ativado ou quando uma configuração da operadora muda. Como o ImsService não faz parte do processo de telefonia, um app pode apresentar exceções inesperadas ao tentar acessar APIs IMS se o ImsService falhar ou for desvinculado de forma invisível devido a uma assinatura ou mudança de configuração.
Em dispositivos com o Android 13 ou versões mais recentes, para monitorar
se a instância do ImsService de uma assinatura associada está
disponível ou não, um app pode usar a
ImsStateCallback
classe. Ao receber uma instância de ImsMmTelManager ou ImsRcsManager, recomendamos que o app primeiro se registre para um callback de estado do IMS usando ImsMmTelManager#registerImsStateCallback ou ImsRcsManager#registerImsStateCallback.
Para continuar recebendo atualizações de callback para assinaturas específicas quando o ImsService estiver disponível novamente, o app precisa cancelar o registro ou descartar os callbacks registrados por ImsMmTelManager, ImsRcsManager ou ProvisioningManager e registrar novos callbacks.
Se houver uma assinatura que não oferece suporte ao IMS, o framework vai 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 no processo de telefonia, o app 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.