O Android 9 oferece APIs para melhorar a compatibilidade com apps de terceiros para ligações. Esses apps geralmente dependem de APIs de telefonia, como a transmissão PHONE_STATE, para coexistir com chamadas telefônicas de operadoras. Como consequência, os apps de terceiros para ligações precisam dar prioridade às chamadas pela operadora e, muitas vezes, recorrem a rejeitar silenciosamente as chamadas recebidas no app ou encerrar uma chamada em andamento para abrir espaço para uma chamada pela operadora.
As APIs no Android 9 oferecem suporte a cenários de chamadas simultâneas entre apps de terceiros e chamadas de operadoras. Isso possibilita, por exemplo, receber uma chamada de terceiros enquanto está em uma chamada pela operadora. O framework assume a responsabilidade de garantir que a chamada pela operadora seja mantida quando o usuário atender a chamada de terceiros.
No Android 9, os apps de terceiros para ligações são incentivados a implementar a classe ConnectionService autogerenciada. Para mais informações sobre como criar um
app de ligações usando essa classe, consulte Criar um app de ligações usando a biblioteca Core-Telecom
library.
A classe autogerenciada ConnectionService 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 no Documento de definição de compatibilidade (CDD) do Android (seção 7.4.1.2), você precisa garantir
que o app de discagem ou telefone mostre essas entradas do registro de chamadas e o nome do
app de terceiros para ligações de onde a chamada foi originada. Para um exemplo de como o
app de discagem da AOSP atende a esse requisito, consulte Entradas do registro de chamadas de apps de terceiros
para ligações.
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 de discagem para processar os seguintes cenários.
Processar 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 oferece suporte à espera e o usuário recebe uma chamada móvel (por exemplo, usando a operadora FooCom), o app Telefone 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 terceiros para ligações pode ter uma chamada em andamento que não pode ser mantida pelo framework. Atender uma nova chamada móvel faz com que a chamada de terceiros em andamento seja desconectada.
Consulte a interface do usuário na figura para um exemplo:
Figura 1. Chamada recebida desconectando uma chamada de terceiros em andamento.
O app de discagem pode verificar se uma chamada recebida faz com que outra chamada seja
desconectada verificando os extras da 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 terceiros para ligações 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
chamadas de rede móvel.
Quando o app de discagem da AOSP mostra entradas do registro de chamadas relacionadas a um app de terceiros para ligações, o nome do app em que a chamada ocorreu é mostrado no registro de chamadas, conforme ilustrado na figura:
Figura 2. Entrada de registro de chamadas com o nome do app de terceiros para ligações no app Telefone.
Para determinar o nome de um app associado a uma entrada de registro de chamadas, use as
PHONE_ACCOUNT_COMPONENT_NAME e PHONE_ACCOUNT_ID colunas no
provedor do registro de chamadas para criar uma instância de PhoneAccountHandle, que
identifica a origem de uma entrada de registro de chamadas. Consulte TelecomManager para receber
os detalhes da classe PhoneAccount. Para determinar se uma entrada de registro de chamadas é
de um app de terceiros para ligações, verifique os recursos de PhoneAccount para ver
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 terceiros para ligações.
Controles de integração do registro de chamadas VoIP
A partir do Android 17 (nível 37 da API), os apps de terceiros para ligações VoIP que se integram ao Core-Telecom e ao CallsManager podem gravar o histórico de chamadas diretamente no registro de chamadas nativo do sistema Android (CallLog.Calls).
Para garantir a privacidade consistente do usuário e a higiene de dados em todo o ecossistema Android,
todos os dispositivos Android 17 (nível da API 37) e mais recentes que declaram o
flag de recurso de telecomunicações (android.software.telecom) e têm o papelandroid.app.role.DIALER
precisam oferecer suporte a controles de integração do registro de chamadas VoIP por app, de acordo com oDocumento de definição de compatibilidade (CDD) do Android.
Requisitos de implementação do dispositivo
Os dispositivos precisam fornecer uma tela de Configurações acessível ao usuário (normalmente localizada em Configurações > Contas de chamadas > Registros de chamadas integrados) que permite aos usuários visualizar e ativar/desativar a integração do registro de chamadas para apps VoIP de terceiros individuais.
Para atender a esse requisito, você precisa integrar o padrão da plataforma de estoque:
- Integração de configurações da plataforma: verifique se o dispositivo inclui
com.android.phone.settings.PhoneAccountSettingsActivityfornecido pela plataforma Android pronta para uso (com.android.phone). - Requisito de resolução de intents:o dispositivo precisa resolver a intent
TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION(android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) para a tela de gerenciamento da plataforma de estoque.
Quando um app, um aviso do sistema ou um link direto invoca o seguinte, a intent precisa iniciar PhoneAccountSettingsActivity e não pode gerar uma ActivityNotFoundException:
Intent intent = new Intent(TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION);
context.startActivity(intent);
Validação
Para testar se o dispositivo oferece suporte a apps de terceiros para ligações, use o app de teste de telecomunicações, que implementa a classe 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.
Processar chamadas recebidas que desconectam uma chamada em andamento
Siga estas etapas para verificar se uma chamada recebida desconecta uma chamada de terceiros em andamento.
Figura 3. App de teste com implementações de amostra da classe ConnectionService.
- Limpe a opção Holdable.
- Toque em OUTGOING para iniciar uma nova ligação efetuada de amostra.
- Toque no botão ACTIVE para ativar a chamada.
- Ligue para o número de telefone do dispositivo em teste com outro smartphone. Isso invoca o cenário em que o 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 precisará ter registrado uma chamada no registro de chamadas do sistema. Para confirmar se o dispositivo registra chamadas de apps de terceiros para ligações, abra o app de discagem e confirme se a chamada aparece no registro de chamadas do sistema.
Controles de integração do registro de chamadas VoIP
Para verificar a conformidade com o requisito de intent de integração do registro de chamadas VoIP no Android 17 e mais recentes, execute o teste do conjunto de testes de compatibilidade (CTS) CtsTelecomTestCases. Esse teste verifica em limites de pacotes que o envio de TelecomManager#ACTION_CONFIGURE_CALL_LOG_INTEGRATION (android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) é resolvido no dispositivo para um handler de atividade exportado válido (verificação resolveActivity).