Partilhar via


Observe as capacidades do usuário

Tenho permissão para ativar o vídeo, tenho permissão para ligar o microfone, tenho permissão para partilhar ecrã? Essas permissões são exemplos de recursos de participantes que você pode aprender com a API de recursos. Aprender os recursos pode ajudar a criar uma interface de usuário que mostre apenas os botões relacionados às ações para as quais o usuário local tem permissões.

Pré-requisitos

Instale o SDK

Use o npm install comando para instalar o SDK de Chamada e Comum dos Serviços de Comunicação do Azure para JavaScript:

npm install @azure/communication-common --save
npm install @azure/communication-calling --save

Inicializar objetos necessários

Uma CallClient instância é necessária para a maioria das operações de chamada. Ao criar uma nova CallClient instância, você pode configurá-la com opções personalizadas, como uma Logger instância.

Com a CallClient instância, você pode criar uma CallAgent instância chamando o createCallAgentarquivo . Esse método retorna de forma assíncrona um objeto de CallAgent instância.

O createCallAgent método usa CommunicationTokenCredential como argumento. Ele aceita um token de acesso de usuário.

Você pode usar o getDeviceManager método na CallClient instância para acessar deviceManagero .

const { CallClient } = require('@azure/communication-calling');
const { AzureCommunicationTokenCredential} = require('@azure/communication-common');
const { AzureLogger, setLogLevel } = require("@azure/logger");

// Set the logger's log level
setLogLevel('verbose');

// Redirect log output to console, file, buffer, REST API, or whatever location you want
AzureLogger.log = (...args) => {
    console.log(...args); // Redirect log output to console
};

const userToken = '<USER_TOKEN>';
callClient = new CallClient(options);
const tokenCredential = new AzureCommunicationTokenCredential(userToken);
const callAgent = await callClient.createCallAgent(tokenCredential, {displayName: 'optional Azure Communication Services user name'});
const deviceManager = await callClient.getDeviceManager()

Como gerenciar melhor a conectividade do SDK com a infraestrutura da Microsoft

A Call Agent instância ajuda você a gerenciar chamadas (para ingressar ou iniciar chamadas). Para funcionar, seu SDK de chamada precisa se conectar à infraestrutura da Microsoft para receber notificações de chamadas recebidas e coordenar outros detalhes da chamada. O seu Call Agent tem dois estados possíveis:

Conectado - Um Call Agent valor connectionStatue significa que o SDK do Connected cliente está conectado e é capaz de receber notificações da infraestrutura da Microsoft.

Desconectado - Um Call Agent valor connectionStatue de Disconnected estados há um problema que está impedindo o SDK de se conectar corretamente. Call Agent devem ser recriados.

  • invalidToken: Se um token expirou ou é inválido Call Agent , a instância se desconecta com esse erro.
  • connectionIssue: Se houver um problema com o cliente se conectando à infrascture da Microsoft, depois de muitas tentativas Call Agent expõe o connectionIssue erro.

Você pode verificar se seu local Call Agent está conectado à infraestrutura da Microsoft inspecionando o valor atual da connectionState propriedade. Durante uma chamada ativa, você pode ouvir o connectionStateChanged evento para determinar se Call Agent muda do estado Conectado para Desconectado.

const connectionState = callAgentInstance.connectionState;
console.log(connectionState); // it may return either of 'Connected' | 'Disconnected'

const connectionStateCallback = (args) => {
    console.log(args); // it will return an object with oldState and newState, each of having a value of either of 'Connected' | 'Disconnected'
    // it will also return reason, either of 'invalidToken' | 'connectionIssue'
}
callAgentInstance.on('connectionStateChanged', connectionStateCallback);

O recurso de recursos é um recurso estendido da API principal Call e permite que você obtenha os recursos do participante local na chamada atual.

O recurso permite que você se registre para um ouvinte de eventos, para ouvir as mudanças de capacidade.

Registre-se no recurso de recursos:

const capabilitiesFeature = this.call.feature(Features.Capabilities);

Obter as capacidades do participante local: O objeto Capabilities tem as capacidades dos participantes locais e é do tipo ParticipantCapabilities. As propriedades dos recursos incluem:

  • isPresent indica se uma capacidade está presente.
  • razão indica o motivo da resolução de capacidade.
const capabilities =  capabilitiesFeature.capabilities;

Inscreva-se no capabilitiesChanged evento:

capabilitiesFeature.on('capabilitiesChanged', (capabilitiesChangeInfo) => {
    for (const [key, value] of Object.entries(capabilitiesChangeInfo.newValue)) {
        if(key === 'turnVideoOn' && value.reason != 'FeatureNotSupported') {
             (value.isPresent) ? this.setState({ canOnVideo: true }) : this.setState({ canOnVideo: false });
             continue;
        }
        if(key === 'unmuteMic' && value.reason != 'FeatureNotSupported') {
            (value.isPresent) ? this.setState({ canUnMuteMic: true }) : this.setState({ canUnMuteMic: false });
            continue;
        }
        if(key === 'shareScreen' && value.reason != 'FeatureNotSupported') {
            (value.isPresent) ? this.setState({ canShareScreen: true }) : this.setState({ canShareScreen: false });
            continue;
        }
        if(key === 'spotlightParticipant' && value.reason != 'FeatureNotSupported') {
            (value.isPresent) ? this.setState({ canSpotlight: true }) : this.setState({ canSpotlight: false });
            continue;
        }
        if(key === 'raiseHand' && value.reason != 'FeatureNotSupported') {
            (value.isPresent) ? this.setState({ canRaiseHands: true }) : this.setState({ canRaiseHands: false });
            continue;
        }
        if(key === 'muteOthers' && value.reason != 'FeatureNotSupported') {
            (value.isPresent) ? this.setState({ canMuteOthers: true }) : this.setState({ canMuteOthers: false });
            continue;
        }
        if(key === 'reaction' && value.reason != 'FeatureNotSupported') {
            (value.isPresent) ? this.setState({ canReact: true }) : this.setState({ canReact: false });
            continue;
        }
    }
});

Capacidades expostas

  • turnVideoOn: Capacidade de ativar o vídeo
  • unmuteMic: Capacidade de ligar o microfone
  • shareScreen: Capacidade de compartilhar tela
  • removeParticipant: Capacidade de remover um participante
  • hangUpForEveryOne: Capacidade de desligar para todos
  • addCommunicationUser: Capacidade de adicionar um usuário de comunicação
  • addTeamsUser: Capacidade de adicionar usuário do Teams
  • addPhoneNumber: Capacidade de adicionar número de telefone
  • manageLobby: Capacidade de gerenciar lobby (somente beta)
  • spotlightParticipant: Capacidade de destacar o Participante (apenas beta)
  • removeParticipantsSpotlight: Capacidade de remover o destaque do participante (somente beta)
  • startLiveCaptions: Capacidade de iniciar legendas ao vivo (somente beta)
  • stopLiveCaptions: Capacidade de parar legendas ao vivo (somente beta)
  • raiseHand: Capacidade de levantar a mão (apenas beta)
  • muteOthers: Capacidade de silenciar suavemente o(s) participante(s) remoto(s) na reunião
  • reação: Capacidade de reagir na reunião (apenas beta)
  • viewAttendeeNames: Capacidade de exibir nomes de participantes na reunião

Instale o SDK

Localize seu arquivo no nível build.gradle do projeto e adicione mavenCentral() à lista de repositórios em buildscript e allprojects:

buildscript {
    repositories {
    ...
        mavenCentral()
    ...
    }
}
allprojects {
    repositories {
    ...
        mavenCentral()
    ...
    }
}

Em seguida, no arquivo de nível build.gradle de módulo, adicione as seguintes linhas à dependencies seção:

dependencies {
    ...
    implementation 'com.azure.android:azure-communication-calling:1.0.0'
    ...
}

Inicializar os objetos necessários

Para criar uma CallAgent instância, você precisa chamar o createCallAgent método em uma CallClient instância. Essa chamada retorna de forma assíncrona um objeto de CallAgent instância.

O createCallAgent método toma CommunicationUserCredential como um argumento, que encapsula um token de acesso.

Para acessar DeviceManagero , você deve criar uma callAgent instância primeiro. Então você pode usar o CallClient.getDeviceManager método para obter DeviceManager.

String userToken = '<user token>';
CallClient callClient = new CallClient();
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userToken);
android.content.Context appContext = this.getApplicationContext(); // From within an activity, for instance
CallAgent callAgent = callClient.createCallAgent(appContext, tokenCredential).get();
DeviceManager deviceManager = callClient.getDeviceManager(appContext).get();

Para definir um nome de exibição para o chamador, use este método alternativo:

String userToken = '<user token>';
CallClient callClient = new CallClient();
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userToken);
android.content.Context appContext = this.getApplicationContext(); // From within an activity, for instance
CallAgentOptions callAgentOptions = new CallAgentOptions();
callAgentOptions.setDisplayName("Alice Bob");
DeviceManager deviceManager = callClient.getDeviceManager(appContext).get();
CallAgent callAgent = callClient.createCallAgent(appContext, tokenCredential, callAgentOptions).get();

O recurso de recursos é um recurso estendido da API principal Call e permite que você obtenha os recursos do participante local na chamada atual.

O recurso permite que você se registre para um ouvinte de eventos, para ouvir as mudanças de capacidade.

Para usar o recurso de chamada Capabilities para Windows, a primeira etapa é obter o objeto da API do recurso Capabilities:

Recurso de obtenção de recursos

private CapabilitiesCallFeature capabilitiesCallFeature;
capabilitiesCallFeature = call.feature(Features.CAPABILITIES);

Obtenha as capacidades do participante local

O objeto Capabilities tem as capacidades dos participantes locais e é do tipo ParticipantCapability. As propriedades dos recursos incluem:

  • isAllowed indica se um recurso pode ser usado.
  • razão indica o motivo da resolução de capacidade.
List<ParticipantCapability> capabilities = capabilitiesCallFeature.getCapabilities();

Inscreva-se no capabilitiesChanged evento


capabilitiesCallFeature.addOnCapabilitiesChangedListener(this::OnCapabilitiesChanged);

private void OnCapabilitiesChanged(CapabilitiesChangedEvent args)
{
    String event = String.format("Capabilities Event: %s", args.getReason().toString());
    Log.i("CapabilitiesInfo", event);
    for (ParticipantCapability capability : args.getChangedCapabilities())
    {
        Log.i("CapabilitiesInfo", capability.getType().toString() + " is " capability.getReason().toString());
    }
}

Capacidades expostas

  • TurnVideoOn: Capacidade de ativar o vídeo
  • UnmuteMicrophone: Capacidade de ativar o mudo do microfone
  • ShareScreen: Capacidade de compartilhar tela
  • RemoveParticipant: Capacidade de remover um participante
  • HangUpForEveryone: Capacidade de desligar para todos
  • AddCommunicationUser: Capacidade de adicionar um usuário de comunicação
  • AddTeamsUser: Capacidade de adicionar usuário do Teams
  • AddPhoneNumber: Capacidade de adicionar número de telefone
  • ManageLobby: Capacidade de gerir o lobby
  • SpotlightParticipant: Capacidade de destacar o participante
  • RemoveParticipantSpotlight: Capacidade de remover o destaque do participante
  • BlurBackground: Capacidade de desfocar o fundo
  • CustomBackground: Capacidade de aplicar um plano de fundo personalizado
  • StartLiveCaptions: Capacidade de iniciar legendas ao vivo
  • RaiseHand: Capacidade de levantar a mão
  • MuteOthers: Capacidade de silenciar suavemente o(s) participante(s) remoto(s) na reunião

Configure o seu sistema

Siga estes passos para configurar o seu sistema.

Criar o projeto do Visual Studio

Para um aplicativo da Plataforma Universal do Windows, no Visual Studio 2022, crie um novo projeto Aplicativo em Branco (Universal Windows). Depois de inserir o nome do projeto, sinta-se à vontade para escolher qualquer SDK do Windows posterior a 10.0.17763.0.

Para um aplicativo WinUI 3, crie um novo projeto com o modelo Aplicativo em branco, empacotado (WinUI 3 na área de trabalho) para configurar um aplicativo WinUI 3 de página única. É necessário o SDK de Aplicativos Windows versão 1.3 ou posterior.

Instalar o pacote e as dependências usando o Gerenciador de Pacotes NuGet

As APIs e bibliotecas do SDK de chamada estão disponíveis publicamente por meio de um pacote NuGet.

Para localizar, baixar e instalar o pacote NuGet do SDK de chamada:

  1. Abra o Gerenciador de Pacotes NuGet selecionando Ferramentas>Gerenciador>de Pacotes NuGet Gerenciar Pacotes NuGet para Solução.
  2. Selecione Procurar e digite Azure.Communication.Calling.WindowsClient na caixa de pesquisa.
  3. Verifique se a caixa de seleção Incluir pré-lançamento está marcada.
  4. Selecione o pacote Azure.Communication.Calling.WindowsClient e, em seguida, selecione Azure.Communication.Calling.WindowsClient 1.4.0-beta.1 ou uma versão mais recente.
  5. Marque a caixa de seleção que corresponde ao projeto dos Serviços de Comunicação do Azure no painel direito.
  6. Selecione Instalar.

O recurso de recursos é um recurso estendido da API principal Call e permite que você obtenha os recursos do participante local na chamada atual.

O recurso permite que você se registre para um ouvinte de eventos, para ouvir as mudanças de capacidade.

Para usar o recurso de chamada Capabilities para Windows, a primeira etapa é obter o objeto da API do recurso Capabilities:

Recurso de obtenção de recursos

private CapabilitiesCallFeature capabilitiesCallFeature;
capabilitiesCallFeature = call.Features.Capabilities;

Obtenha as capacidades do participante local

O objeto Capabilities tem as capacidades dos participantes locais e é do tipo ParticipantCapability. As propriedades dos recursos incluem:

  • isAllowed indica se um recurso pode ser usado.
  • razão indica o motivo da resolução de capacidade.
var capabilities = capabilitiesCallFeature.Capabilities;

Inscreva-se no capabilitiesChanged evento

capabilitiesCallFeature.CapabilitiesChanged += Call__OnCapabilitiesChangedAsync;

private async void Call__OnCapabilitiesChangedAsync(object sender, CapabilitiesChangedEventArgs args)
{
    Trace.WriteLine(args.Reason.ToString());
    foreach (var capability in args.ChangedCapabilities)
    {
        //Prints out capability kind and resolution reason in console
        Trace.WriteLine(capability.Kind.ToString() + " is " + capability.Reason.ToString());
    }
}

Capacidades expostas

  • TurnVideoOn: Capacidade de ativar o vídeo
  • UnmuteMicrophone: Capacidade de ativar o mudo do microfone
  • ShareScreen: Capacidade de compartilhar tela
  • RemoveParticipant: Capacidade de remover um participante
  • HangUpForEveryone: Capacidade de desligar para todos
  • AddCommunicationUser: Capacidade de adicionar um usuário de comunicação
  • AddTeamsUser: Capacidade de adicionar usuário do Teams
  • AddPhoneNumber: Capacidade de adicionar número de telefone
  • ManageLobby: Capacidade de gerir o lobby
  • SpotlightParticipant: Capacidade de destacar o participante
  • RemoveParticipantSpotlight: Capacidade de remover o destaque do participante
  • BlurBackground: Capacidade de desfocar o fundo
  • CustomBackground: Capacidade de aplicar um plano de fundo personalizado
  • StartLiveCaptions: Capacidade de iniciar legendas ao vivo
  • RaiseHand: Capacidade de levantar a mão
  • MuteOthers: Capacidade de silenciar suavemente o(s) participante(s) remoto(s) na reunião

Configure o seu sistema

Siga estes passos para configurar o seu sistema.

Criar o projeto Xcode

No Xcode, crie um novo projeto iOS e selecione o modelo Single View App . Este artigo usa a estrutura SwiftUI, portanto, você deve definir Language como Swift e Interface como SwiftUI.

Você não vai criar testes neste artigo. Sinta-se à vontade para desmarcar a caixa de seleção Incluir testes .

Captura de tela que mostra a janela para criar um projeto no Xcode.

Instale o pacote e as dependências usando o CocoaPods

  1. Crie um Podfile para seu aplicativo, como este exemplo:

    platform :ios, '13.0'
    use_frameworks!
    target 'AzureCommunicationCallingSample' do
        pod 'AzureCommunicationCalling', '~> 1.0.0'
    end
    
  2. Execute o pod install.

  3. Abra .xcworkspace usando o Xcode.

Solicitar acesso ao microfone

Para acessar o microfone do dispositivo, você precisa atualizar a lista de propriedades de informações do seu aplicativo usando NSMicrophoneUsageDescription. Defina o valor associado para uma cadeia de caracteres incluída na caixa de diálogo que o sistema usa para solicitar acesso do usuário.

Clique com o botão direito do mouse na entrada Info.plist da árvore do projeto e selecione Abrir como>código-fonte. Adicione as seguintes linhas na secção de nível <dict> superior e, em seguida, guarde o ficheiro.

<key>NSMicrophoneUsageDescription</key>
<string>Need microphone access for VOIP calling.</string>

Configurar a estrutura do aplicativo

Abra o arquivo do ContentView.swift seu projeto. Adicione uma import declaração à parte superior do arquivo para importar a AzureCommunicationCalling biblioteca. Além disso, importe AVFoundation. Você precisa dele para solicitações de permissão de áudio no código.

import AzureCommunicationCalling
import AVFoundation

Inicializar o CallAgent

Para criar uma CallAgent instância a partir do CallClient, você precisa usar um callClient.createCallAgent método que retorna de forma assíncrona um CallAgent objeto depois que ele é inicializado.

Para criar um cliente de chamada, passe um CommunicationTokenCredential objeto:

import AzureCommunication

let tokenString = "token_string"
var userCredential: CommunicationTokenCredential?
do {
    let options = CommunicationTokenRefreshOptions(initialToken: token, refreshProactively: true, tokenRefresher: self.fetchTokenSync)
    userCredential = try CommunicationTokenCredential(withOptions: options)
} catch {
    updates("Couldn't created Credential object", false)
    initializationDispatchGroup!.leave()
    return
}

// tokenProvider needs to be implemented by Contoso, which fetches a new token
public func fetchTokenSync(then onCompletion: TokenRefreshOnCompletion) {
    let newToken = self.tokenProvider!.fetchNewToken()
    onCompletion(newToken, nil)
}

Passe o CommunicationTokenCredential objeto que você criou para CallCliente defina o nome para exibição:

self.callClient = CallClient()
let callAgentOptions = CallAgentOptions()
options.displayName = " iOS Azure Communication Services User"

self.callClient!.createCallAgent(userCredential: userCredential!,
    options: callAgentOptions) { (callAgent, error) in
        if error == nil {
            print("Create agent succeeded")
            self.callAgent = callAgent
        } else {
            print("Create agent failed")
        }
})

O recurso de recursos é um recurso estendido da API principal Call e permite que você obtenha os recursos do participante local na chamada atual.

O recurso permite que você se registre para um ouvinte de eventos, para ouvir as mudanças de capacidade.

Para usar o recurso de chamada Capabilities para Windows, a primeira etapa é obter o objeto da API do recurso Capabilities:

Recurso de obtenção de recursos

let capabilitiesCallFeature =call.feature(Features.capabilities)

Obtenha as capacidades do participante local

O objeto Capabilities tem as capacidades dos participantes locais e é do tipo ParticipantCapability. As propriedades dos recursos incluem:

  • isAllowed indica se um recurso pode ser usado.
  • razão indica o motivo da resolução de capacidade.
var capabilities = capabilitiesCallFeature.capabilities

Inscreva-se no capabilitiesChanged evento


capabilitiesCallFeature.delegate = CapabilitiesCallDelegate()

public class CapabilitiesCallDelegate : CapabilitiesCallFeatureDelegate
{
    public func capabilitiesCallFeature(_ capabilitiesCallFeature: CapabilitiesCallFeature, didChangeCapabilities args: CapabilitiesChangedEventArgs) {
        let changedReason = args.reason
        let changedCapabilities = args.changedCapabilities
    }
}

Capacidades expostas

  • TurnVideoOn: Capacidade de ativar o vídeo
  • UnmuteMicrophone: Capacidade de ativar o mudo do microfone
  • ShareScreen: Capacidade de compartilhar tela
  • RemoveParticipant: Capacidade de remover um participante
  • HangUpForEveryone: Capacidade de desligar para todos
  • AddCommunicationUser: Capacidade de adicionar um usuário de comunicação
  • AddTeamsUser: Capacidade de adicionar usuário do Teams
  • AddPhoneNumber: Capacidade de adicionar número de telefone
  • ManageLobby: Capacidade de gerir o lobby
  • SpotlightParticipant: Capacidade de destacar o participante
  • RemoveParticipantSpotlight: Capacidade de remover o destaque do participante
  • BlurBackground: Capacidade de desfocar o fundo
  • CustomBackground: Capacidade de aplicar um plano de fundo personalizado
  • StartLiveCaptions: Capacidade de iniciar legendas ao vivo
  • RaiseHand: Capacidade de levantar a mão
  • MuteOthers: Capacidade de silenciar suavemente o(s) participante(s) remoto(s) na reunião

Tipos de chamada suportados

Atualmente, o recurso é suportado apenas para o tipo de chamada das Salas dos Serviços de Comunicação do Azure e o tipo de chamada de reunião de equipes

Motivos

A tabela a seguir fornece informações adicionais sobre por que a ação não está disponível e fornece dicas sobre como disponibilizá-la.

Motivo Description Resolução
Capaz A ação é permitida.
CapabilityNotApplicableForTheCallType O tipo de chamada bloqueia a ação. Considere outro tipo de chamada se precisar dessa ação. Os tipos de chamada são: chamada 1:1, chamada em grupo, chamada de interoperabilidade 1:1 Teams, chamada de grupo de interoperabilidade 1:1 Teams, Sala e Reunião.
ClienteRestrito O ambiente de tempo de execução está bloqueando essa ação Desbloqueie a ação no seu dispositivo alterando o sistema operativo, navegadores, plataforma ou hardware. Você pode encontrar o ambiente suportado em nossa documentação.
UserPolicyRestricted A política do usuário do Microsoft 365 bloqueia a ação. Habilite essa ação alterando a política atribuída ao organizador da reunião, ao iniciador da chamada ou ao usuário do Microsoft 365 usando o SDK do ACS. O usuário alvo depende do tipo de ação. Saiba mais sobre a política do Teams no Teams. O administrador do Teams pode alterar as políticas.
FunçãoRestrita A função atribuída bloqueia a ação. Promova o usuário para diferentes funções para disponibilizar a ação.
FeatureNotSupported O recurso de recursos não é suportado neste tipo de chamada. Informe-nos no canal de Comentários do Azure que gostaria de ter esta funcionalidade disponível para este tipo de chamada.
ReuniãoRestrita A opção Reunião de equipes bloqueia a ação. O organizador ou coorganizador de reuniões do Teams precisa alterar a opção de reunião para habilitar essa ação.
NotInitialized O recurso de recursos ainda não foi inicializado. Inscreva-se no evento capabilitiesChanged para this.call.feature(Features.Capabilities) saber quando o recurso é inicializado.
NotCapable O tipo de usuário bloqueia a ação. A ação só é permitida para um tipo específico de identidade. Habilite essa ação usando a identidade do Microsoft 365.
TeamsPremiumLicenseRestricted O usuário do Microsoft 365 precisa ter a licença do Teams Premium atribuída. Habilite essa ação atribuindo a licença do Teams Premium ao organizador da reunião do Teams ou ao usuário do Microsoft 365 usando o SDK. O usuário alvo depende do tipo de ação. O administrador do Microsoft 365 pode atribuir a licença necessária.
Consentimento explícitoObrigatório É necessário consentimento para permitir a ação. Fornecer o consentimento para gravação ou transcrição chamando o método grantTeamsConsent() sob this.call.feature(Features.Recording) ou this.call.feature(Features.Transcription) .

Próximos passos