O Android 9 oferece APIs para melhorar a compatibilidade com apps de
chamadas de terceiros. Os apps de terceiros para ligações geralmente dependem de APIs de telefonia, como
a transmissão PHONE_STATE
, para coexistir com as ligações telefônicas da operadora. Como consequência, os apps de chamadas de terceiros precisam dar prioridade às chamadas da operadora e muitas vezes rejeitam silenciosamente as chamadas recebidas no app ou encerram uma chamada em andamento para abrir espaço para uma chamada da operadora.
As APIs no Android 9 oferecem suporte a cenários de chamadas simultâneas entre apps de terceiros e chamadas de operadoras. Isso permite, por exemplo, receber uma chamada de terceiros enquanto você está em uma ligação da operadora. A biblioteca assume a responsabilidade de garantir que a chamada da operadora seja mantida quando o usuário participa da chamada de terceiros.
No Android 9, os apps de chamadas de terceiros são incentivados a
implementar a API ConnectionService
autogerenciada. Para mais informações sobre como
criar um app de chamadas usando essa API, consulte
Criar um app de chamadas.
A API ConnectionService
autogerenciada também oferece aos desenvolvedores a oportunidade
de ativar o registro de chamadas no app no registro de chamadas do sistema (consulte
EXTRA_LOG_SELF_MANAGED_CALLS
).
De acordo com os requisitos do
Documento de Definição de Compatibilidade do Android (CDD)
(seção 7.4.1.2), verifique se o app de discagem ou telefone mostra essas
entradas do registro de chamadas e o nome do app de chamadas de terceiros de onde a
chamada foi originada. Para um exemplo de como o app de discagem AOSP atende a esse
requisito, consulte
Entradas do registro de chamadas de apps de chamadas de terceiros.
Os apps são responsáveis por definir
CAPABILITY_SUPPORT_HOLD
e
CAPABILITY_HOLD
nas conexões deles. No entanto, é possível que um app não consiga manter uma
chamada em algumas circunstâncias. O framework inclui disposições para resolver esses tipos de casos.
Cenários
Modifique o app discador para lidar com os seguintes cenários.
Lidar com chamadas recebidas que desconectam uma chamada em andamento
Em um cenário em que há uma chamada de terceiros em andamento (por exemplo, em uma chamada do SuperCaller) que não aceita espera e o usuário recebe uma chamada móvel (por exemplo, usando a operadora FooCom), o app Telefone ou Discador precisa indicar ao usuário que atender a chamada da rede móvel vai encerrar a chamada de terceiros em andamento.
Essa experiência do usuário é importante porque um app de chamadas de terceiros pode ter uma chamada em andamento que não pode ser mantida pelo framework. Atender uma nova ligação móvel faz com que a ligação de terceiros em andamento seja desconectada.
Confira um exemplo na figura da interface do usuário:
Figura 1. Uma ligação recebida desconectando uma ligação de terceiros em andamento.
O app discador pode verificar se uma chamada recebida causa a desconexão de outra
conferindo os
extras de chamada.
Verifique se
EXTRA_ANSWERING_DROPS_FG_CALL
está definido como TRUE
e
EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME
está definido como o nome do app cuja chamada é desconectada ao atender a
chamada móvel recebida.
Entradas do registro de chamadas de apps de terceiros para ligações
Os desenvolvedores de apps de chamadas de terceiros podem ativar o registro das chamadas no registro de chamadas do sistema (consulte EXTRA_LOG_SELF_MANAGED_CALLS
). Isso significa que é possível ter entradas no registro de chamadas que não são de chamadas de rede móvel.
Quando o app discador do AOSP mostra entradas do histórico de chamadas relacionadas a um app de chamadas de terceiros, o nome do app em que a chamada foi feita aparece no histórico de chamadas, como ilustrado na figura:
Figura 2. Entrada do registro de chamadas com o nome do app de terceiros para ligações no app discador.
Para determinar o nome de um app associado a uma entrada do registro de chamadas, use as colunas
PHONE_ACCOUNT_COMPONENT_NAME
e
PHONE_ACCOUNT_ID
no provedor de registro de chamadas para criar uma instância de
PhoneAccountHandle
,
que identifica a origem de uma entrada do registro de chamadas. Consulte
TelecomManager
para receber os detalhes da PhoneAccount.
Para determinar se uma entrada do registro de chamadas é de um app de chamadas de terceiros, verifique
recursos PhoneAccount
para saber se
CAPABILITY_SELF_MANAGED
está definido.
O método
getLabel
do PhoneAccount
retornado retorna o nome do app associado
a uma entrada do registro de chamadas do app de chamadas de terceiros.
Validação
Para testar se o dispositivo é compatível com apps de chamadas de terceiros, use o app de teste
Telecomm, que implementa a API ConnectionService autogerenciada. O app está localizado em /packages/services/Telecomm/testapps/
.
Crie o app de teste na raiz do repositório de origem do Android usando:
mmma packages/services/Telecomm/testapps/
Instale o APK de build usando
adb install -g -r <apk path>
. Um ícone de amostra autogerenciada é adicionado ao acesso rápido.Toque no ícone para abrir o app de teste.
Lidar com chamadas recebidas que desconectam uma chamada em andamento
Siga estas etapas para verificar se uma ligação recebida desconecta uma ligação de terceiros em andamento.
Figura 3. Teste o app com implementações de amostra da API ConnectionService.
- Desmarque a opção Retenção.
- Toque em SAINDO para iniciar uma nova chamada de saída de amostra.
- Toque no botão ATIVA para ativar a chamada.
- Ligue para o número do dispositivo em teste com outro smartphone. Isso invoca o cenário em que seu discador recebe o nome de um app, que terá a chamada desconectada.
- Quando terminar, toque no botão DISCONNECT no app de teste.
Entradas do registro de chamadas de apps de terceiros para ligações
Depois de concluir as etapas acima, o app de teste vai registrar uma chamada no registro de chamadas do sistema. Para confirmar se o dispositivo registra chamadas de apps de terceiros, abra o app discador e verifique se a chamada aparece no registro de chamadas do sistema.