O Android 9 oferece APIs para oferecer melhor suporte a apps
de chamadas de terceiros. Os apps de chamadas de terceiros geralmente dependem de APIs de telefonia, como
a transmissão PHONE_STATE
, para coexistir com as chamadas 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 dar espaço a 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 chamada de operadora. O framework assume a responsabilidade de garantir que a chamada da operadora seja mantida quando o usuário se envolver na chamada de terceiros.
No Android 9, os apps de chamada de terceiros são incentivados a
implementar a API ConnectionService
autogerenciada. Para mais informações sobre como
criar um app de chamada usando essa API, consulte
Criar um app de chamada.
A API ConnectionService
autogerenciada também oferece aos desenvolvedores a oportunidade
de permitir que as chamadas no app sejam registradas no registro de chamadas do sistema (consulte
EXTRA_LOG_SELF_MANAGED_CALLS
).
De acordo com os requisitos no
Documento de definição de compatibilidade do Android
(seção 7.4.1.2), verifique se o app discador ou telefone mostra essas
entradas de registro de chamadas e mostra o nome do app de chamadas de terceiros em que o
app de chamadas de um exemplo atende às entradas de registro de chamadas de um app de terceiros.
Os apps são responsáveis por definir
CAPABILITY_SUPPORT_HOLD
e
CAPABILITY_HOLD
nas conexões dos apps. No entanto, é possível que um app não consiga manter uma
ligação em algumas circunstâncias. O framework inclui disposições para resolver
esses tipos de casos.
Cenários
Modifique seu app de discagem para lidar com os seguintes cenários.
Processar ligações recebidas que desconectam uma ligação 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 oferece suporte à retenção e o usuário recebe uma chamada de celular (por exemplo, usando a operadora FooCom), seu app de discagem ou telefone precisa indicar ao usuário que atender a chamada da rede de celular encerrará a chamada de terceiros em andamento.
Essa experiência do usuário é importante porque um app de chamada de terceiros pode ter uma chamada em andamento que não pode ser mantida pelo framework. Atender uma nova chamada de celular faz com que a ligação de terceiros em andamento seja desconectada.
Confira a interface do usuário na figura como exemplo:
Figura 1. Uma chamada recebida desconecta uma chamada de terceiros em andamento.
Seu app discador pode conferir se uma ligação recebida faz com que outra seja
desconectada conferindo os
extras de chamadas.
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.
Registro de chamadas de apps de terceiros
Os desenvolvedores de apps de chamadas de terceiros podem ativar o registro de chamadas
no app 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 para
ligações de rede de dispositivos móveis.
Quando o app discador do AOSP exibe entradas de registro de chamadas relacionadas a um app de chamadas de terceiros, o nome do app em que a chamada ocorreu é exibido no registro de chamadas, conforme ilustrado na figura:
Figura 2. Entrada de registro de chamadas com o nome de um app de terceiros para ligações no app de discagem.
Para determinar o nome de um app associado a uma entrada de 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 de registro de chamadas. Consulte
TelecomManager
para conferir os detalhes da PhoneAccount.
Para determinar se uma entrada do registro de chamadas é de um app de chamada de terceiros, verifique
os
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 de registro de chamadas do app de chamada de terceiros.
Validação
Para testar se o dispositivo é compatível com apps de chamadas de terceiros, use o app de teste
de telecomunicações, 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 build apk usando
adb install -g -r <apk path>
. Um ícone de exemplo de autogerenciamento é adicionado ao acesso rápido.Toque no ícone para abrir o app de teste.
Processar ligações recebidas que desconectam uma ligação em andamento
Siga estas etapas para verificar se uma chamada recebida desconecta uma chamada de terceiros em andamento.
Figura 3. Teste o app com exemplos de implementações da API ConnectionService.
- Limpe a opção Holdable.
- Toque em SAÍDA para iniciar uma nova chamada de saída de exemplo.
- Toque no botão ACTIVE para ativar a chamada.
- Ligue para o número do dispositivo em teste com outro smartphone. Isso invoca o cenário em que o discador é fornecido com o nome de um app, que terá a chamada desconectada.
- Quando terminar, toque no botão DISCONNECT no app de teste.
Registro de chamadas de apps de terceiros
Depois de concluir as etapas acima, o app de teste precisa ter registrado uma chamada no registro de chamadas do sistema. Para confirmar que o dispositivo registra chamadas de apps de terceiros, abra o app de discagem e confirme se a chamada aparece no registro de chamadas do sistema.