Suporte a apps de terceiros para ligações

O Android 9 oferece APIs para melhorar o suporte a apps de chamadas de terceiros. 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 chamadas de terceiros precisam dar prioridade às chamadas pela operadora e, muitas vezes, recorrem ao método de 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 de 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 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 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), é necessário garantir que o app de discagem ou telefone mostre 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 este 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 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 de 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 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:

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

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 chamadas de terceiros

Os desenvolvedores de apps de chamadas de terceiros podem ativar o registro de 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 para chamadas de rede móvel.

Quando o app de discagem AOSP mostra entradas do registro de chamadas relacionadas a um app de chamadas de terceiros, o nome do app em que a chamada ocorreu é mostrado no registro de chamadas, conforme ilustrado na figura:

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

Figura 2. Entrada de registro de chamadas com o nome do app de chamadas de terceiros 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 PhoneAccount.
Para determinar se uma entrada de registro de chamadas é de um app de chamadas de terceiros, verifique PhoneAccount recursos para saber se CAPABILITY_SELF_MANAGED está definido.

O getLabel método da PhoneAccount retornada retorna o nome do app associado a uma entrada de registro de chamadas do app de chamadas de terceiros.

Validação

Para testar se o dispositivo oferece suporte a 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.

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.

Testar apps de terceiros para ligações

Figura 3. App de teste com implementações de amostra da API ConnectionService.

  1. Limpe a opção Holdable.
  2. Toque em OUTGOING para iniciar uma nova ligação efetuada de amostra.
  3. Toque no botão ACTIVE para ativar a chamada.
  4. 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.
  5. Quando terminar, toque no botão DISCONNECT no app de teste.

Entradas do registro de chamadas de apps de chamadas 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 se o dispositivo registra chamadas de apps de chamadas de terceiros, abra o app de discagem e confirme se a chamada aparece no registro de chamadas do sistema.