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.
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çãoandroid.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 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 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ãoBIND_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.
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:
- "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
config_ims_mmtel_package_override_string
Chave CarrierConfig para ImsServices que implementa recursos de MMTEL.config_ims_rcs_package_override_string
para ImsServices que implementa recursos RCS.
- 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:
config_ims_mmtel_package
: Implementa recursos de MMTELconfig_ims_rcs_package
: Implementa recursos RCS
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:
- O nome do pacote ImsService definido pelo valor CarrierConfig
config_ims_[mmtel/rcs]_package_override_string
quando há um chip inserida. - O nome do pacote ImsService definido no valor de sobreposição do dispositivo para
config_ims_[mmtel/rcs]_package
inclusive 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