Suporte a apps de terceiros para chamadas

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:

Chamada recebida que desconecta uma chamada de terceiros em andamento

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:

Entrada do registro de chamadas com um app de chamadas de terceiros

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

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

    mmma packages/services/Telecomm/testapps/

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

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

Testar apps para chamadas de terceiros

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

  1. Limpe a opção Holdable.
  2. Toque em SAÍDA para iniciar uma nova chamada de saída de exemplo.
  3. Toque no botão ACTIVE para ativar a chamada.
  4. 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.
  5. 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.