Diretrizes para dispositivos móveis — Android

Este tópico aborda as considerações a serem levadas em conta ao desenvolver aplicativos para um dispositivo Android:

Permissões

Para saber quais são as permissões exigidas pelo SDK do OpenTok para Android, consulte a seção “Permissões” da visão geral do SDK do Android.

Criação de um aplicativo de VoIP usando o ConnectionService do Android

Use o Android Serviço de Conexão aula para criar um aplicativo de VoIP que utilize os recursos de áudio e vídeo do SDK do OpenTok para Android.

No mínimo, siga estas orientações para criar um aplicativo básico de VoIP:

  • Registrar o android.telecom.ConnectionService no arquivo AndroidManifest.xml.

    <service android:name="com.example.package.MyConnectionService"
        android:label="@string/some_label_for_my_connection_service"
        android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
        <intent-filter>
            <action android:name="android.telecom.ConnectionService" />
        </intent-filter>
    </service>
    
  • Crie uma classe que estenda a android.telecom.ConnectionService classe. Implementar métodos da ConnectionService classe, incluindo onCreateIncomingConnection(), onCreateOutgoingConnection, onCreateIncomingConnectionFailed(), e onCreateOutgoingConnectionFailed().

  • Crie uma classe que estenda a android.telecom.Connection classe. Implementar métodos da Connection classe, incluindo onAnswer() e onDisconnect. Na implementação do onAnswer() método, é possível se conectar a uma sessão do OpenTok, publicar um fluxo na sessão e permitir que o código se inscreva nos fluxos criados na sessão. Na implementação do onDisconnect() método, você pode se desconectar da sessão do OpenTok (e interromper a publicação e a assinatura de streams).

  • Você pode usar um serviço como o Google Firebase para implementar notificações push no aplicativo. É possível configurar notificações para saber quando o aplicativo estiver em segundo plano ou fechado. Dessa forma, o aplicativo poderá receber uma chamada VoIP mesmo quando estiver fechado.

Ao utilizar o ConnectionService, use o AudioDeviceManager.getAudioFocusManager() método e implemente os métodos da instância do `AudioFocusManager` retornada para delegar o controle do foco de áudio ao seu aplicativo. Eles estão definidos no SDK do OpenTok para Android:

private AudioDeviceManager audioDeviceManager;
private AudioFocusManager audioFocusManager;

public void setupAudioFocusManager(Context context) {
  audioDeviceManager = new AudioDeviceManager(context);
  audioFocusManager = audioDeviceManager.getAudioFocusManager();
  audioFocusManager.setRequestAudioFocus(false);
}

public void notifyAudioFocusIsActive() {
  audioFocusManager.audioFocusActivated();
}

public void notifyAudioFocusIsInactive() {
  audioFocusManager.audioFocusDeactivated();
}

Ao delegar o foco de áudio ao aplicativo, o SDK interrompe seu roteamento automático de áudio. Em vez disso, essa lógica de roteamento é gerenciada pelo ConnectionService, que notifica o aplicativo sobre os dispositivos de áudio disponíveis por meio das APIs CallEndpoint e CallAudioState da Connection. Seu aplicativo deve implementar suporte à enumeração de dispositivos de áudio e à lógica de seleção.

Essa delegação garante o roteamento adequado do áudio e a coordenação com o sistema Android Telecom.

Veja o aplicativo de VOIP de exemplo no repositório opentok-android-sdk-samples. Ele mostra como implementar a classe ConnectionService para criar um aplicativo de VoIP que utilize o SDK do OpenTok para Android.

Configurando serviços em primeiro plano

Os serviços em primeiro plano permitem que você execute, de forma assíncrona, operações perceptíveis ao usuário. Esses serviços exibem uma notificação na barra de status para informar aos usuários que seu aplicativo está realizando uma tarefa em primeiro plano e consumindo recursos do sistema. Observe que o ConnectionService pode ser utilizado como um serviço em primeiro plano. Exemplos de casos de uso que envolvem serviços em primeiro plano incluem:

  • Continue capturando e enviando áudio para outros usuários, mesmo quando o usuário abrir um aplicativo diferente.

  • Permitir que um usuário compartilhe sua tela enquanto alterna entre aplicativos.

  • Permitir que os usuários desliguem a tela enquanto continuam ouvindo uma chamada de vídeo.

Tipos de serviços em primeiro plano

O Android 10 introduziu o atributo android:foregroundServiceType no elemento. A ideia é especificar explicitamente que tipo de tarefa o serviço realiza.

O Android 14 torna obrigatória a especificação do tipo de serviço em primeiro plano. Isso visa garantir o uso correto dos serviços em primeiro plano e a consistência entre os fabricantes de dispositivos.

Os tipos atualmente suportados são:

  • camera (obrigatório no Android 11) — Ao acessar a câmera em segundo plano, como em aplicativos de videochamada

  • connectedDevice — Ao interagir com um dispositivo externo, como um dispositivo de fitness com Bluetooth

  • dataSync — Ao fazer upload ou download de dados, essa função será descontinuada e, em seu lugar, devem ser utilizadas alternativas como o DownloadManager, o BackupManager ou o WorkManager

  • health (novidade no Android 14) — Para aplicativos de fitness, como rastreadores de exercícios

  • location (obrigatório no Android 10) — Quando a localização é necessária, como na navegação

  • mediaPlayback — Ao retomar a reprodução de áudio ou vídeo em segundo plano, como no Spotify ou na Netflix

  • mediaProjection — Ao projetar conteúdo em dispositivos ou telas externas

  • microphone (obrigatório no Android 11) — Ao acessar o microfone em segundo plano, como em aplicativos de chamadas

  • phoneCall — Ao dar continuidade a uma chamada em andamento

  • remoteMessaging (novidade no Android 14) — ao transferir mensagens de texto de um dispositivo para outro

  • shortService — Quando for necessário um serviço para concluir rapidamente um trabalho crítico que não pode ser interrompido (com duração limitada a cerca de 3 minutos)

  • specialUse — Quando outros tipos não atendem ao seu caso de uso

  • systemExempted — Reservado para aplicativos do sistema

Declarar o tipo de serviço em primeiro plano

O primeiro passo para oferecer suporte ao Android 14 é atualizar sua declaração de serviço no arquivo AndroidManifest e especificar o tipo correto de serviço em primeiro plano.

Se o seu serviço exigir vários tipos, você pode combiná-los usando o operador | desta forma:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>
    <service
        android:name=".MyForegroundService"
        android:foregroundServiceType="microphone|camera"
        android:exported="false">
    </service>
</manifest>

Se você tentar iniciar um serviço em primeiro plano sem declarar seu tipo no manifesto, o sistema lançará uma MissingForegroundServiceTypeException ao ligar startForeground().

Solicitar permissões específicas para serviços em primeiro plano

A partir do Android 9 (API 28), os aplicativos passaram a ter que solicitar o FOREGROUND_SERVICE permissão no manifesto do aplicativo, que foi concedida automaticamente pelo sistema.

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

A partir do Android 14 (API 34), os aplicativos precisam solicitar permissões específicas adicionais, dependendo do tipo de serviço em primeiro plano. Portanto, se o seu serviço continuar acessando o microfone em segundo plano, você precisará especificar FOREGROUND_SERVICE_MICROPHONE. A permissão é concedida automaticamente pelo sistema.

<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE"/>

Se o seu serviço exigir vários tipos, você deverá declarar essa permissão para cada tipo.

Se você esquecer de declarar qualquer uma das duas permissões, receberá um SecurityException com o motivo exato.

Iniciar um serviço em primeiro plano

Dependendo do nível da API utilizado, inicie o serviço conforme descrito a seguir:

Intent serviceIntent = new Intent(this, MyForegroundService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // Android 8.0 (API 26) and above
    startForegroundService(serviceIntent);
} else { // Android 7.0 (API 24, 25)
    startService(serviceIntent);
}

O trecho de código inicia um serviço. No entanto, o serviço ainda não está sendo executado em primeiro plano. Dentro do próprio serviço, é preciso chamar startForeground() para promover o serviço para um serviço em primeiro plano. Se você estiver usando o AndroidX, é necessário chamar ServiceCompat.startForeground().

Forneça detalhes sobre o seu caso de uso no Google Play Console

Depois de enviar a nova versão do aplicativo, destinada ao Android 14 e que utiliza um serviço em primeiro plano, para o Google Play Console, você verá uma solicitação no console para fornecer detalhes adicionais sobre o uso do aplicativo.

Como o Google quer garantir que os aplicativos estejam utilizando os serviços em primeiro plano de maneira adequada, você precisará enviar uma nova declaração na página “Conteúdo do aplicativo” (Política -> Conteúdo do aplicativo).

Para cada tipo de serviço em primeiro plano que você declarar, será necessário fazer o seguinte:

  • Descreva a funcionalidade do aplicativo que utiliza o tipo de serviço em primeiro plano.

  • Descreva o impacto para o usuário caso a tarefa seja adiada ou interrompida pelo sistema.

  • Inclua um link para um vídeo que demonstre cada recurso do serviço em primeiro plano. O vídeo deve mostrar as etapas que o usuário precisa seguir no seu aplicativo para ativar o recurso.

  • Escolha seu caso de uso específico para cada tipo de serviço em primeiro plano. Você pode escolher entre uma lista pré-definida de casos de uso apresentada aqui ou inseri-lo manualmente.

Aplicativo de exemplo e mais informações

Veja o Básico-Bate-Papo-por-Vídeo-com-Serviços-em-Primeiro-Plano-Java amostra no exemplos-do-opentok-android-sdk repo.

Leia mais no Android Visão geral dos serviços de primeiro plano documentação.

Mais informações

Para obter mais informações, consulte: