Implementar IMS

O Android 9 introduz uma nova interface SystemApi chamada ImsService (link em inglês) para ajudar a implementar o Subsistema multimídia IP (IMS). A API ImsService é uma interface bem definida entre a plataforma Android e um fornecedor ou implementação de IMS fornecida pela operadora.

Visão geral do ImsService

Figura 1. Visão geral do ImsService

Ao usar a interface ImsService, o implementador IMS pode fornecer importantes informações de sinalização para a plataforma, como informações de registro IMS, SMS via IMS, e a integração de recursos MmTel para fornecer voz e vídeo chamando. A API ImsService também é uma API do sistema Android, o que significa que ela pode ser criado diretamente no SDK do Android, e não na origem. Um IMS pré-instalado no dispositivo também pode ser configurado para ser atualizáveis na Play Store.

Exemplos e origem

O Android oferece um app no AOSP que implementa partes do API ImsService para fins de teste e desenvolvimento. Você encontra App em /testapps/ImsTestService

Consulte a documentação da API ImsService em ImsService (link em inglês) e nas outras classes da API.

Implementação

A API ImsService é de alto nível e permite implementar o IMS de várias maneiras, dependendo do hardware disponível. Por exemplo, a implementação muda dependendo de a implementação do IMS ser totalmente no app ou se ele estiver parcial ou totalmente descarregado para o modem. O Android faz não fornecem uma HAL pública para descarregamento para o processador de banda de base, o descarregamento deve ocorrer usando a extensão HAL para o modem.

Compatibilidade com implementações de IMS mais antigas

Embora o Android 9 inclua a API ImsService, 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 de wrapper mais antigas foram movidas ao namespace android.telephony.ims.compat. Ao fazer upgrade para o Android 9, os dispositivos mais antigos precisam fazer o seguinte para continuar o suporte da API mais antiga.

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

Em seguida, o framework será vinculado ao ImsService usando a camada de compatibilidade fornecidos no Android 9 para funcionar com a versão implementação de ImsService.

Registro do ImsService com o framework

A API ImsService é implementada como um serviço, e o framework do Android é vinculado para se comunicar com a implementação do IMS. Três etapas são necessário para registrar um app que implementa um ImsService com o de análise de dados em nuvem. Primeiro, a implementação do ImsService precisa se registrar no plataforma usando o AndroidManifest.xml do app; segundo, ele precisa define a quais recursos IMS a implementação oferece suporte (MmTel ou RCS); e terceiro, ela precisa ser verificada como a implementação de IMS confiável na operadora ou sobreposição de dispositivos.

Definição do serviço

O app IMS registra um ImsService com a estrutura adicionando um 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 o seguinte: , 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 mais informações, consulte Suporte ao modo de inicialização direta e Criptografia baseada em arquivos.
  • persistent="true": permite que este serviço seja executado persistentemente e não seja eliminados pelo sistema para recuperar a memória. Esse atributo APENAS funciona se o é criado como um app do sistema.
  • permission="android.permission.BIND_IMS_SERVICE": garante que apenas um que teve a permissão BIND_IMS_SERVICE concedida a ele não pode vincular ao app. Isso evita que um app não autorizado seja vinculado à serviço, já que apenas aplicativos do sistema podem receber a permissão pelo de análise de dados em nuvem.

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

Especificação do recurso IMS

Depois que o ImsService tiver sido definido como um serviço Android no AndroidManifest.xml, o ImsService precisa definir com quais recursos IMS ele oferece suporte. Atualmente, o Android é compatível com os recursos MmTel e RCS, mas apenas a MmTel é integradas ao framework. Não há APIs RCS integradas do framework, ainda há vantagens em declará-lo como um recurso do ImsService.

Confira abaixo os atributos válidos definidos no android.telephony.ims.ImsFeature que um ImsService pode fornecer uma explicação e um exemplo do motivo pelo qual um app gostaria de implementar um ou todos esses recursos. Após cada é definido, esta página descreve como a ImsService declara o conjunto de definidos para cada slot de chip.

RECURSO_MMTEL

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

RECURSO_EMERGENCY_MMTEL

A declaração desse recurso indica à plataforma que a emergência é conectada ao O PDN do IMS é possível para serviços de emergência. Se o recurso não for declarado para seu ImsService, a plataforma sempre vai usar o Circuit Switch Fallback por padrão para serviços de emergência. O recurso FEATURE_MMTEL precisa ser definido para essa a ser definido.

RECURSO_RCS

A API ImsService não implementa nenhum recurso RCS do IMS, mas o A classe de base android.telephony.ims.RcsFeature ainda pode ser útil. A estrutura vincula-se automaticamente ao ImsService e chama ImsService#createRcsFeature quando ele detecta que o pacote precisa fornecer RCS. Se o chip associado com o serviço RCS é removido, o framework chama automaticamente RcsFeature#onFeatureRemoved e depois limpa o ImsService associado com o recurso RCS. Essa funcionalidade pode remover algumas das configurações ou lógica de vinculação que um recurso RCS teria que fornecer.

Registro de recursos com suporte

Primeiro, o framework de telefonia se vincula ao ImsService para consultar os recursos ele oferece suporte ao uso da API ImsService#querySupportedImsFeatures. Após o calcula quais recursos o ImsService suportará, chamará ImsService#create[...]Feature para cada recurso que o ImsService vai receber é responsável. Se os recursos compatíveis com o app IMS mudarem, pode usar ImsService#onUpdateSupportedImsFeatures para sinalizar o framework para recalcular os recursos com suporte. Consulte o diagrama a seguir para mais informações na inicialização e vinculação do ImsService.

Inicialização e vinculação do ImsService

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

Detecção e verificação do framework de uma implementação ImsService

Depois que o ImsService tiver sido definido corretamente no AndroidManifest.xml, o plataforma deve ser configurada para se vincular (com segurança) ao ImsService quando apropriados. Há dois tipos de ImsServices aos quais o framework se vincula:

  1. "Substituição da operadora" ImsService: esses ImsServices são pré-carregados no do dispositivo, mas estão vinculadas a uma ou mais operadoras de celular quando um chip correspondente é inserido. Isso é configurado usando o
  2. Dispositivo "padrão" ImsService: é o ImsService padrão carregado. no dispositivo por um OEM e deve ser projetado para fornecer serviços de IMS 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 tem um chip inserido inserido não tem uma operadora ImsService instalada. Isso é definido na sobreposição do dispositivo usando as seguintes configurações:

O Android não oferece suporte a apps com ImsService de terceiros disponível para download de serviço. Portanto, todas as implementações do ImsService definidas aqui são precisam ser aplicativos do sistema e residir no diretório /system/priv-app/ ou /product/priv-app/ para conceder as permissões apropriadas (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 ao nome da CarrierConfig ou do dispositivo os valores sobrepostos definidos acima, apenas apps pré-instalados e confiáveis são presos.

Personalização

Os apps que implementam um ImsService são vinculados apenas aos dispositivos em que são configuradas como a "substituição" da operadora ImsService ou dispositivo "padrão" Configurações do ImsService para a funcionalidade MMTEL ou RCS. O ImsService também permite que os recursos IMS compatíveis (MMTEL e RCS) ser ativados ou desativados dinamicamente usando atualizações ImsService#onUpdateSupportedImsFeatures. Isso aciona o framework recalcular quais ImsServices estão vinculados e quais recursos são compatíveis. Se o O app IMS atualiza o framework sem recursos compatíveis: o ImsService será desvinculado até que o smartphone seja reinicializado ou que um novo chip seja inserido corresponde ao aplicativo IMS.

Prioridade de vinculação para vários ImsService

O framework não é compatível com a vinculação de todos os ImsServices possíveis que estão pré-carregados no dispositivo e vinculados a até dois ImsServices por slot para chip (uma ImsService para cada recurso) na seguinte ordem para cada recurso:

  1. O nome do pacote ImsService definido pelo valor CarrierConfig config_ims_[mmtel/rcs]_package_override_string quando há um chip inserida.
  2. O nome do pacote ImsService definido no valor de sobreposição do dispositivo para config_ims_[mmtel/rcs]_packageinclusive quando não há chip cartão inserido. Este ImsService PRECISA ser compatível com o recurso de comunicação de emergência.

Você precisa ter o nome do pacote do ImsService definido no CarrierConfig de cada transportadora que usará o pacote ou no sobreposição de dispositivo caso seu ImsService seja o padrão, conforme definido acima.

Vamos detalhar isso para cada atributo. Para um dispositivo (um ou vários chips) Com apenas um chip carregado, dois recursos de IMS são possíveis: MMTel e RCS. O framework tentará se vincular na ordem definida acima para cada recurso e se o recurso não estiver disponível para o ImsService definido no Se a configuração for substituída, o framework vai usar o ImsService padrão. Por exemplo, a tabela abaixo descreve qual recurso IMS a estrutura vai usam com três aplicativos IMS que implementam ImsServices instalados em um sistema com os seguintes recursos:

  • O ImsService da operadora A oferece suporte a RCS
  • O ImsService da operadora B oferece suporte a RCS e MMTel
  • ImsService de OEM com suporte a RCS e MMTel
Chip inserido Recurso RCS Recurso MMTel
Operadora A Operadora A Driver OEM
Operadora B Operadora B Operadora B
Sem chip Driver OEM Driver OEM

Validação

As ferramentas para verificar a implementação do IMS não estão incluídas, já que o IMS são extremamente grandes e usam equipamentos de verificação especiais. A testes só podem verificar se a estrutura de telefonia responde adequadamente ao API ImsService.

Desenvolver um app IMS

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

Para detectar ou modificar o estado do ImsService para recursos MMTEL e RCS, use as ImsManager para receber uma instância do ImsMmTelManager, ImsRcsManager, ou específicas do IMS ProvisioningManager . O app pode então detectar os estados de provisionamento e serviço específicos do IMS como:

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

Usar ImsStateCallback

Embora o ImsService seja um serviço vinculado de forma persistente, o vinculado pode mudar quando um novo chip ou assinatura incorporada ficar ativa ou quando a configuração de uma operadora muda. Como o ImsService não faz parte de telefonia, um aplicativo pode encontrar exceções imprevistas ao tentar para acessar APIs IMS se o ImsService falhar de forma invisível ou estiver desvinculado devido a uma assinatura ou mudança de configuração.

Em dispositivos com o Android 13 ou mais recente, para monitorar se a instância ImsService de uma assinatura associada está disponível ou indisponível, um app poderá usar o ImsStateCallback . Ao receber uma instância de ImsMmTelManager ou ImsRcsManager, recomendamos que o app se registre primeiro para um callback de estado IMS usando ImsMmTelManager#registerImsStateCallback ou ImsRcsManager#registerImsStateCallback Para continuar recebendo atualizações de comunicação de retorno de assinaturas específicas quando O ImsService fica disponível novamente, e o app precisa cancelar a inscrição ou descartar o existente callbacks registrados por ImsMmTelManager, ImsRcsManager ou ProvisioningManager e registrar novas chamadas de retorno.

Se houver uma assinatura não compatível com o IMS, o framework 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 o assinatura.

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