Intenção de participar

"Intenção de participar" é um novo recurso do Android Sender que permite que um app remetente "participe" de uma sessão do Google Cast iniciada por outros apps ou voz. Configure o app remetente para ser iniciado por uma intent criada pelo SDK do Cast.

Por exemplo, ao usar a voz para iniciar uma sessão do Cast, o SDK do Cast cria uma notificação que permite ao usuário controlar a reprodução em todos os smartphones Android na mesma rede. Quando a notificação é tocada, o SDK do Cast cria a intent para iniciar o app e participar da sessão de transmissão.

Consulte o exemplo Castvideos-Android (link em inglês) para uma implementação funcional da Intent to Join.

Como usar um Android Sender

Para ativar esse recurso, siga estas etapas no app:

Verifique se o app já está usando a versão do SDK do remetente do Android posterior à 11.4.0. Em build.gradle:

dependencies {
    api 'com.google.android.gms:play-services-cast-framework:11.4.0'
}

Adicione um novo filtro de intent a uma atividade em que você quer processar a intent. A intent será usada pelas notificações de controle remoto (RCN, na sigla em inglês) para iniciar seu app e entrar em uma sessão de transmissão. Recomendamos usar a atividade em que SessionManagerListener está hospedado, e onSessionStarted() ou onSessionStartFailed() será chamado. O novo filtro de intent precisa ser exclusivo em todo o sistema Android. Recomendamos que você use a tag <data> para fazer isso da seguinte maneira:

<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="your_app_scheme" android:host="your_app_host"
        android:path="your_app_path"/>
</intent-filter>

Exemplos de tag <data>:

<data android:scheme="https" android:host="example.com"
      android:path="/cast/join"/>

Na atividade em que você define o novo filtro de intent, chame SessionManager.startSession(Intent) em onResume():

Kotlin
override fun onResume() {
    ...
    val intent = intent
    // Intent with format: "<your_app_scheme>://<your_app_host><your_app_path>"
    val intentToJoinUri = Uri.parse("https://example.com/cast/join")
    if (intent.data != null && intent.data == intentToJoinUri) {
        mCastContext.sessionManager.startSession(intent)
    }
    ...
}
Java
@Override
protected void onResume() {
    ...
    Intent intent = getIntent();
    // Intent with format: "<your_app_scheme>://<your_app_host><your_app_path>"
    Uri intentToJoinUri = Uri.parse("https://example.com/cast/join");
    if (intent.getData() != null && intent.getData().equals(intentToJoinUri)) {
        mCastContext.getSessionManager().startSession(intent);
    }
    ...
}

Configuração do Play Console do Google Cast

Para usar o recurso de intent para participar, o URI do app e o nome do pacote precisam ser adicionados ao Console para desenvolvedores do Google Cast.

Ele também precisa ser listado e publicado para que a intent de participação funcione corretamente.

Para listar seu app, alterne a opção de listagem para "SIM" e forneça um título, uma descrição e um gráfico de 512 x 512 para o app.

Após a configuração, é possível testar a implementação com as notificações de controle remoto (RCN, na sigla em inglês), conforme mostrado abaixo:

  1. Instale o app Google Home em um smartphone Android e conecte-se ao Wi-Fi no smartphone.
  2. O dispositivo compatível com Cast configura o dispositivo Google Home na mesma rede.
  3. Inicie uma sessão de transmissão com o dispositivo Google Home usando a Ferramenta de comando e controle (CaC), outro dispositivo Android ou iOS, ou por voz e verifique se o app receptor da Web foi iniciado.
  4. Aguarde alguns segundos para acessar a RCN no smartphone e toque na notificação para acionar a intent. A intent precisa ser transmitida para qualquer app que a registre com os dados necessários para participar da sessão.

SessionManagerListener.onSessionStarted(T, String) será acionado e entrará na sessão.

Verificação

Se o app entrar na sessão, SessionManagerListener.onSessionStarted(T, String) será chamado. Caso contrário, SessionManagerListener.onSessionStartFailed(T, int) será chamado. Se o app já processar esses eventos corretamente (por exemplo, iniciando o controle expandido ou o minicontrole), não será necessário fazer mais nada.