Suporte a apps de terceiros para ligações

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:

Uma ligação recebida desconecta uma ligação em andamento de terceiros

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:

Entrada do registro de chamadas com um app de terceiros para ligações

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/.

  1. Crie o app de teste na raiz do repositório de origem do Android usando:

    mmma packages/services/Telecomm/testapps/

  2. Instale o APK de build usando adb install -g -r <apk path>. Um ícone de amostra autogerenciada é adicionado ao acesso rápido.

  3. 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.

Testar apps de terceiros para ligações

Figura 3. Teste o app com implementações de amostra da API ConnectionService.

  1. Desmarque a opção Retenção.
  2. Toque em SAINDO para iniciar uma nova chamada de saída de amostra.
  3. Toque no botão ATIVA para ativar a chamada.
  4. 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.
  5. 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.