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.
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çãoandroid.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 portelephony
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ãoBIND_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.
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:
- 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
-
config_ims_mmtel_package_override_string
Chave CarrierConfig para ImsServices que implementam recursos MMTEL. -
config_ims_rcs_package_override_string
para ImsServices implementando recursos RCS.
-
- 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:
-
config_ims_mmtel_package
: Implementa recursos MMTEL -
config_ims_rcs_package
: Implementa recursos RCS
-
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:
- O nome do pacote ImsService definido pelo valor CarrierConfig
config_ims_[mmtel/rcs]_package_override_string
quando há um cartão SIM 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. 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
.