Rychlý start: Přidání hlasových hovorů do aplikace

Začněte s Azure Communication Services pomocí sady SDK pro volání komunikačních služeb a přidejte do aplikace hlasové hovory a videohovory.

Důležité

Azure Communication Services podporuje pouze tísňové volání na linku 911 v USA a Portoriku.

Azure Communication Services hlasové hovory (PSTN) lze použít k vytáčení čísla 911 od uživatelů v USA a Portoriku. Není podporováno vytáčení linky 911 mimo USA & Portoriku nebo vytáčení služeb tísňového volání v jiných zemích než USA & Portoriku.

V tomto rychlém startu se dozvíte, jak zahájit volání pomocí sady SDK pro volání Azure Communication Services pro Windows.

Ukázkový kód UPW

Ukázkovou aplikaci si můžete stáhnout z GitHubu.

Požadavky

K dokončení tohoto kurzu budete potřebovat následující požadavky:

Nastavení

Vytvoření projektu

V sadě Visual Studio vytvořte nový projekt pomocí šablony Prázdná aplikace (Univerzální systém Windows), který nastaví jednostránkovou aplikaci Univerzální platforma Windows (UPW).

Snímek obrazovky s oknem Nový projekt UPW v sadě Visual Studio

Instalace balíčku

Klikněte pravým tlačítkem na projekt a přejděte na a Manage Nuget Packages nainstalujte Azure.Communication.Callingverzi 1.0.0-beta.33 nebo vyšší. Ujistěte se, že je zaškrtnuté políčko Zahrnout předvolené.

Vyžádání přístup

Přejděte na Package.appxmanifest a klikněte na Capabilities. Zkontrolujte Internet (Client & Server) , jestli chcete získat příchozí a odchozí přístup k internetu. Zkontrolujte Microphone přístup ke zvukovému kanálu mikrofonu.

Snímek obrazovky s žádostí o přístup k internetu a mikrofonu v sadě Visual Studio

Nastavení architektury aplikace

Musíme nakonfigurovat základní rozložení pro připojení naší logiky. Abychom mohli uskutečnit odchozí hovor, potřebujeme TextBox zadat ID uživatele volaného. Potřebujeme Start Call také tlačítko a Hang Up tlačítko. MainPage.xaml Otevřete projekt a přidejte Grid uzel do :Page

<Page
    x:Class="CallingQuickstart.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:CallingQuickstart"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Width="800" Height="600">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="60*"/>
            <RowDefinition Height="200*"/>
            <RowDefinition Height="60*"/>
        </Grid.RowDefinitions>
        <TextBox x:Name="CalleeTextBox" Text="Who would you like to call?" TextWrapping="Wrap" VerticalAlignment="Center" Grid.Row="0" Height="40" Margin="10,10,10,10" />
        <Grid Grid.Row="1">
        </Grid>
        <StackPanel Grid.Row="2" Orientation="Horizontal">
            <Button x:Name="CallButton" Content="Start Call" Click="CallButton_Click" VerticalAlignment="Center" Margin="10,0,0,0" Height="40" Width="200"/>
            <Button x:Name="HangupButton" Content="Hang Up" Click="HangupButton_Click" VerticalAlignment="Center" Margin="10,0,0,0" Height="40" Width="200"/>
            <TextBlock x:Name="State" Text="Status" TextWrapping="Wrap" VerticalAlignment="Center" Margin="40,0,0,0" Height="40" Width="200"/>
        </StackPanel>
    </Grid>
</Page>

App.xaml.cs Otevřete soubor (klikněte pravým tlačítkem a zvolte Zobrazit kód) a přidejte tento řádek na začátek:

using CallingQuickstart;

MainPage.xaml.cs Otevřete a nahraďte obsah následující implementací:

using Azure.Communication.Calling;
using Azure.WinRT.Communication;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Windows.Foundation;
using Windows.UI.ViewManagement;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace CallingQuickstart
{
    public sealed partial class MainPage : Page
    {
        CallAgent callAgent;
        Call call;
        DeviceManager deviceManager;

        public MainPage()
        {
            this.InitializeComponent();
            Task.Run(() => this.InitCallAgentAndDeviceManagerAsync()).Wait();
        }

        private async Task InitCallAgentAndDeviceManagerAsync()
        {
            // Create and cache CallAgent and optionally fetch DeviceManager
        }

        private async void CallButton_Click(object sender, RoutedEventArgs e)
        {
            // Start call
        }

        private async void HangupButton_Click(object sender, RoutedEventArgs e)
        {
            // End the current call
        }

        private async void Call_OnStateChangedAsync(object sender, PropertyChangedEventArgs args)
        {
            // Update call state
        }
    }
}

Objektový model

Následující třídy a rozhraní zpracovávají některé hlavní funkce sady SDK pro volání Azure Communication Services:

Název Description
CallClient CallClient je hlavním vstupním bodem volající sady SDK.
CallAgent Agent CallAgent se používá ke spouštění a správě volání.
CommunicationTokenCredential CommunicationTokenCredential se používá jako přihlašovací údaje tokenu k vytvoření instance agenta CallAgent.
CommunicationUserIdentifier CommunicationUserIdentifier se používá k reprezentaci identity uživatele, která může být jedním z následujících: CommunicationUserIdentifier/PhoneNumberIdentifier/CallingApplication.

Ověření klienta

Inicializuje CallAgent instanci pomocí přístupového tokenu uživatele, který nám umožní provádět a přijímat volání a volitelně získat instanci DeviceManager pro dotazování na konfiguraci klientského zařízení.

V následujícím kódu nahraďte <AUTHENTICATION_TOKEN> uživatelským přístupovým tokenem. Pokud ještě token nemáte k dispozici, projděte si dokumentaci k přístupovým tokenům uživatele .

Přidejte do InitCallAgentAndDeviceManagerAsync funkce následující kód.

var callClient = new CallClient();
this.deviceManager = await callClient.GetDeviceManager();

var tokenCredential = new CommunicationTokenCredential("<AUTHENTICATION_TOKEN>");
var callAgentOptions = new CallAgentOptions()
{
    DisplayName = "<DISPLAY_NAME>"
};

this.callAgent = await callClient.CreateCallAgent(tokenCredential, callAgentOptions);

Zahájení hovoru

Přidáním implementace do objektu CallButton_Click zahájíte volání s vytvořeným objektem callAgent a připojíte obslužnou rutinu události stavu volání.

var startCallOptions = new StartCallOptions();

var callees = new ICommunicationIdentifier[1] { new CommunicationUserIdentifier(CalleeTextBox.Text.Trim()) };

this.call = await this.callAgent.StartCallAsync(callees, startCallOptions);
this.call.OnStateChanged += Call_OnStateChangedAsync;

Ukončení hovoru

Po kliknutí na tlačítko ukončete aktuální hovor Hang Up . Přidejte implementaci do HangupButton_Click pro ukončení volání pomocí agenta callAgent, který jsme vytvořili, a odstranění obslužné rutiny události stavu volání.

this.call.OnStateChanged -= Call_OnStateChangedAsync;
await this.call.HangUpAsync(new HangUpOptions());

Sledování stavu volání

Buďte informováni o stavu aktuálního hovoru.

var state = (sender as Call)?.State;
await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => {
    State.Text = state.ToString();
});

Spuštění kódu

Kód můžete sestavit a spustit v sadě Visual Studio. Upozorňujeme, že pro platformy řešení podporujeme ARM64, x64 a x86.

Odchozí volání můžete provést tak, že do textového pole zadáte ID uživatele a kliknete na Start Call tlačítko. Volání 8:echo123 vás spojí s robotem echo, což je skvělé pro začátek a ověření, že vaše zvuková zařízení fungují.

Snímek obrazovky znázorňující spuštění aplikace pro rychlý start pro UPW

Ukázkový kód WinUI 3

Ukázkovou aplikaci si můžete stáhnout z GitHubu.

Požadavky

K dokončení tohoto kurzu budete potřebovat následující požadavky:

Nastavení

Vytvoření projektu

V sadě Visual Studio vytvořte nový projekt pomocí šablony Prázdná aplikace, zabalená (WinUI 3 v desktopu), která nastaví jednostránkovou aplikaci WinUI 3.

Snímek obrazovky s oknem Nový projekt WinUI v sadě Visual Studio

Instalace balíčku

Klikněte pravým tlačítkem na projekt a přejděte na a Manage Nuget Packages nainstalujte Azure.Communication.Callingverzi 1.0.0-beta.33 nebo vyšší. Ujistěte se, že je zaškrtnuté políčko Zahrnout předvolené.

Vyžádání přístup

Snímek obrazovky s žádostí o přístup k internetu a mikrofonu v sadě Visual Studio

Nastavení architektury aplikace

Musíme nakonfigurovat základní rozložení pro připojení naší logiky. Abychom mohli uskutečnit odchozí hovor, potřebujeme TextBox zadat ID uživatele volaného. Potřebujeme Start Call také tlačítko a Hang Up tlačítko. MainWindow.xaml Otevřete projekt a přidejte Grid uzel do :Window

<Window
    x:Class="CallingQuickstart.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:CallingQuickstart"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="60*"/>
            <RowDefinition Height="200*"/>
            <RowDefinition Height="60*"/>
        </Grid.RowDefinitions>
        <TextBox x:Name="CalleeTextBox" Text="Who would you like to call?" TextWrapping="Wrap" VerticalAlignment="Center" Height="40" Margin="10,10,10,10" />
        <Grid Grid.Row="1">
        </Grid>
        <StackPanel Grid.Row="2" Orientation="Horizontal">
            <Button x:Name="CallButton" Content="Start Call" Click="CallButton_Click" VerticalAlignment="Center" Margin="10,0,0,0" Height="40" Width="200"/>
            <Button x:Name="HangupButton" Content="Hang Up" Click="HangupButton_Click" VerticalAlignment="Center" Margin="10,0,0,0" Height="40" Width="200"/>
            <TextBlock x:Name="State" Text="Status" TextWrapping="Wrap" VerticalAlignment="Center" Margin="40,0,0,0" Height="40" Width="200"/>
        </StackPanel>
    </Grid>
</Window>

MainWindow.xaml.cs Otevřete a nahraďte obsah následující implementací:

using Azure.Communication.Calling;
using Azure.WinRT.Communication;
using Microsoft.UI.Xaml;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Windows.Media.Core;

namespace CallingQuickstart
{
    public sealed partial class MainWindow : Window
    {
        CallAgent callAgent;
        Call call;
        DeviceManager deviceManager;

        public MainWindow()
        {
            this.InitializeComponent();
            Task.Run(() => this.InitCallAgentAndDeviceManagerAsync()).Wait();
        }

        private async Task InitCallAgentAndDeviceManagerAsync()
        {
            // Create and cache CallAgent and optionally fetch DeviceManager
        }

        private async void CallButton_Click(object sender, RoutedEventArgs e)
        {
            // Start call
        }

        private async void HangupButton_Click(object sender, RoutedEventArgs e)
        {
            // End call
        }

        private async void Call_OnStateChangedAsync(object sender, PropertyChangedEventArgs args)
        {
            // Update call state
        }
    }
}

Objektový model

Následující třídy a rozhraní zpracovávají některé hlavní funkce sady SDK pro volání Azure Communication Services:

Název Description
CallClient CallClient je hlavním vstupním bodem volající sady SDK.
CallAgent Agent CallAgent se používá ke spouštění a správě volání.
CommunicationTokenCredential CommunicationTokenCredential se používá jako přihlašovací údaje tokenu k vytvoření instance agenta CallAgent.
CommunicationUserIdentifier CommunicationUserIdentifier se používá k reprezentaci identity uživatele, která může být jedním z následujících: CommunicationUserIdentifier/PhoneNumberIdentifier/CallingApplication.

Ověření klienta

Inicializuje CallAgent instanci pomocí přístupového tokenu uživatele, který nám umožní provádět a přijímat volání a volitelně získat instanci DeviceManager pro dotazování na konfiguraci klientského zařízení.

V následujícím kódu nahraďte <AUTHENTICATION_TOKEN> uživatelským přístupovým tokenem. Pokud ještě token nemáte k dispozici, projděte si dokumentaci k přístupovým tokenům uživatele .

Přidejte do InitCallAgentAndDeviceManagerAsync funkce následující kód.

var callClient = new CallClient();
this.deviceManager = await callClient.GetDeviceManager();

var tokenCredential = new CommunicationTokenCredential("<AUTHENTICATION_TOKEN>");
var callAgentOptions = new CallAgentOptions()
{
    DisplayName = "<DISPLAY_NAME>"
};

this.callAgent = await callClient.CreateCallAgent(tokenCredential, callAgentOptions);
this.callAgent.OnCallsUpdated += Agent_OnCallsUpdatedAsync;
this.callAgent.OnIncomingCall += Agent_OnIncomingCallAsync;

Zahájení hovoru

Přidáním implementace do objektu CallButton_Click zahájíte volání s vytvořeným objektem callAgent a připojíte obslužnou rutinu události stavu volání.

var startCallOptions = new StartCallOptions();

var callees = new ICommunicationIdentifier[1]
{
    new CommunicationUserIdentifier(CalleeTextBox.Text.Trim())
};

this.call = await this.callAgent.StartCallAsync(callees, startCallOptions);
this.call.OnStateChanged += Call_OnStateChangedAsync;

Ukončení hovoru

Po kliknutí na tlačítko ukončete aktuální hovor Hang Up . Přidejte implementaci do HangupButton_Click pro ukončení volání pomocí agenta callAgent, který jsme vytvořili, a odstranění obslužné rutiny události stavu volání.

this.call.OnStateChanged -= Call_OnStateChangedAsync;
await this.call.HangUpAsync(new HangUpOptions());

Sledování stavu volání

Buďte informováni o stavu aktuálního hovoru.

var state = (sender as Call)?.State;
this.DispatcherQueue.TryEnqueue(() => {
    State.Text = state.ToString();
});

Spuštění kódu

Kód můžete sestavit a spustit v sadě Visual Studio. Upozorňujeme, že pro platformy řešení podporujeme ARM64, x64 a x86.

Odchozí volání můžete provést tak, že do textového pole zadáte ID uživatele a kliknete na Start Call tlačítko. Volání 8:echo123 vás spojí s robotem echo, což je skvělé pro začátek a ověření, že vaše zvuková zařízení fungují.

Snímek obrazovky znázorňující spuštění aplikace WinUI Pro rychlý start

V tomto rychlém startu se dozvíte, jak zahájit volání pomocí sady SDK pro volání Azure Communication Services pro JavaScript.

Ukázka kódu

Ukázkovou aplikaci si můžete stáhnout z GitHubu.

Poznámka

Odchozí volání uživateli Azure Communication Services je přístupné pomocí knihovny uživatelského rozhraní Azure Communication Services. Knihovna uživatelského rozhraní umožňuje vývojářům přidat klienta volání, který má povolený VoIP, do jejich aplikace pouze s několika řádky kódu.

Požadavky

Nastavení

Vytvoření nové aplikace Node.js

Otevřete terminál nebo příkazové okno a vytvořte nový adresář pro aplikaci a přejděte do něj.

mkdir calling-quickstart && cd calling-quickstart

Spuštěním příkazu npm init -y vytvořte soubor package.json s výchozím nastavením.

npm init -y

Instalace balíčku

Pomocí příkazu npm install nainstalujte sadu SDK pro volání Azure Communication Services pro JavaScript.

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

Možnost --save zobrazí seznam knihovny jako závislosti v souboru package.json .

Nastavení architektury aplikace

V tomto rychlém startu se k vytvoření balíčku prostředků aplikace používá balíček. Spuštěním následujícího příkazu ho nainstalujte a vypište ho jako závislost vývoje v souboru package.json:

npm install parcel --save-dev

V kořenovém adresáři projektu vytvořte souborindex.html . Tento soubor použijeme ke konfiguraci základního rozložení, které uživateli umožní uskutečnit volání.

Tady je kód HTML, který musíme přidat do index.html souboru, který jsme vytvořili:

<!DOCTYPE html>
<html>
  <head>
    <title>Communication Client - Calling Sample</title>
  </head>
  <body>
    <h4>Azure Communication Services</h4>
    <h1>Calling Quickstart</h1>
    <input 
      id="token-input"
      type="text"
      placeholder="User access token"
      style="margin-bottom:1em; width: 200px;"
    />
    </div>
    <button id="token-submit" type="button">
        Submit
    </button>
    <input 
      id="callee-id-input"
      type="text"
      placeholder="Who would you like to call?"
      style="margin-bottom:1em; width: 200px; display: block;"
    />
    <div>
      <button id="call-button" type="button" disabled="true">
        Start Call
      </button>
      &nbsp;
      <button id="hang-up-button" type="button" disabled="true">
        Hang Up
      </button>
    </div>
    <script src="./app.js" type="module"></script>
  </body>
</html>

V kořenovém adresáři projektu vytvořte soubor s názvemapp.js , který bude obsahovat logiku aplikace pro účely tohoto rychlého startu. Přidejte následující kód pro import volajícího klienta a získání odkazů na prvky dom, abychom mohli připojit obchodní logiku.

import { CallClient, CallAgent } from "@azure/communication-calling";
import { AzureCommunicationTokenCredential } from '@azure/communication-common';

let call;
let callAgent;
let tokenCredential = "";
const userToken = document.getElementById("token-input");
const calleeInput = document.getElementById("callee-id-input");
const submitToken = document.getElementById("token-submit");
const callButton = document.getElementById("call-button");
const hangUpButton = document.getElementById("hang-up-button");

Objektový model

Následující třídy a rozhraní zpracovávají některé hlavní funkce sady SDK pro volání Azure Communication Services:

Název Description
CallClient CallClient je hlavním vstupním bodem volající sady SDK.
CallAgent Agent CallAgent se používá ke spouštění a správě volání.
AzureCommunicationTokenCredential Třída AzureCommunicationTokenCredential implementuje rozhraní CommunicationTokenCredential, které se používá k vytvoření instance CallAgent.

Ověření klienta

Do textového pole musíte zadat platný přístupový token uživatele pro váš prostředek a kliknout na Odeslat. Pokud ještě token nemáte k dispozici, projděte si dokumentaci k přístupovým tokenům uživatele . Pomocí příkazu CallClientinicializujete CallAgent instanci s objektem CommunicationTokenCredential , který nám umožní provádět a přijímat volání.

Do souboru app.js přidejte následující kód:

submitToken.addEventListener("click", async () => {
  const callClient = new CallClient(); 
  const userTokenCredential = userToken.value;
    try {
      tokenCredential = new AzureCommunicationTokenCredential(userTokenCredential);
      callAgent = await callClient.createCallAgent(tokenCredential);
      callButton.disabled = false;
      submitToken.disabled = true;
    } catch(error) {
      window.alert("Please submit a valid token!");
    }
})

Zahájení hovoru

Přidejte obslužnou rutinu události, která zahájí volání po kliknutí na callButton :

callButton.addEventListener("click", () => {
    // start a call
    const userToCall = calleeInput.value;

    // To call an Azure Communication Services communication user, use {communicationUserId: 'ACS_USER_ID'}.
    // To call echo bot, use {id: '8:echo123'}.
    call = callAgent.startCall(
        [{ id: userToCall }],
        {}
    );
    // toggle button states
    hangUpButton.disabled = false;
    callButton.disabled = true;
});

Ukončení hovoru

Přidejte naslouchací proces událostí, který ukončí aktuální volání po kliknutí na hangUpButton :

hangUpButton.addEventListener("click", () => {
  // end the current call
  call.hangUp({ forEveryone: true });

  // toggle button states
  hangUpButton.disabled = true;
  callButton.disabled = false;
  submitToken.disabled = false;
});

Vlastnost forEveryone ukončí hovor pro všechny účastníky hovoru.

Spuštění kódu

Ke spuštění aplikace použijte příkaz npx parcel index.html .

Otevřete prohlížeč a přejděte na http://localhost:1234/. Měli byste vidět následující:

Snímek obrazovky s dokončenou aplikací JavaScriptu

Odchozí volání VOIP můžete provést tak, že do odpovídajících textových polí zadáte platný přístupový token uživatele a ID uživatele a kliknete na tlačítko Zahájit volání .

Volání 8:echo123 vás spojí s robotem echo, což je skvělé pro začátek a ověření, že vaše zvuková zařízení fungují. Předejte {id: '8:echo123'} do rozhraní API CallAgent.startCall() pro volání echobota. Pokud chcete zavolat uživatele Azure Communication Services komunikace, předejte {communicationUserId: 'ACS_USER_ID'} ho do CallAgent.startCall() rozhraní API.

V tomto rychlém startu se dozvíte, jak zahájit hovor pomocí sady SDK pro volání Azure Communication Services pro Android.

Příklad kódu

Ukázkovou aplikaci si můžete stáhnout z GitHubu.

Požadavky

Nastavení

Vytvoření aplikace pro Android s prázdnou aktivitou

V Android Studiu vyberte Start a new Android Studio project (Spustit nový projekt Android Studia).

Snímek obrazovky znázorňující tlačítko Spustit nový projekt pro Android Studio vybrané v Android Studiu

V části Telefon a tablet vyberte šablonu projektu Prázdná aktivita.

Snímek obrazovky znázorňující možnost Prázdná aktivita vybraná na obrazovce šablony projektu

Vyberte Minimální sada SDK pro ROZHRANÍ API 26: Android 8.0 (Oreo) nebo vyšší.

Snímek obrazovky znázorňující možnost Prázdná aktivita vybraná na obrazovce 2 šablony projektu

Instalace balíčku

Vyhledejte soubor build.gradle na úrovni projektu a nezapomeňte přidat mavenCentral() do seznamu úložišť v části buildscript a allprojects

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

Pak na úrovni modulu build.gradle přidejte do oddílů závislostí a androidu následující řádky.

android {
    ...
    packagingOptions {
        pickFirst  'META-INF/*'
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

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

Přidání oprávnění k manifestu aplikace

Pokud chcete požádat o oprávnění požadovaná k provedení volání, musí být nejprve deklarována v manifestu aplikace (app/src/main/AndroidManifest.xml). Obsah souboru nahraďte následujícím kódem:

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.contoso.acsquickstart">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <!--Our Calling SDK depends on the Apache HTTP SDK.
When targeting Android SDK 28+, this library needs to be explicitly referenced.
See https://developer.android.com/about/versions/pie/android-9.0-changes-28#apache-p-->
        <uses-library android:name="org.apache.http.legacy" android:required="false"/>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
    

Nastavení rozložení aplikace

Jsou potřeba dva vstupy: textový vstup pro ID volané a tlačítko pro odeslání hovoru. Můžete je přidat prostřednictvím návrháře nebo úpravou xml rozložení. Vytvořte tlačítko s ID call_button a textovým vstupem callee_id. Přejděte na (app/src/main/res/layout/activity_main.xml) a nahraďte obsah souboru následujícím kódem:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/call_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"
        android:text="Call"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <EditText
        android:id="@+id/callee_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Callee Id"
        android:inputType="textPersonName"
        app:layout_constraintBottom_toTopOf="@+id/call_button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

Vytvoření generování uživatelského rozhraní a vazeb hlavní aktivity

S vytvořeným rozložením je možné přidat vazby a také základní generování uživatelského rozhraní aktivity. Aktivita bude zpracovávat vyžádání oprávnění za běhu, vytvoření agenta volání a umístění volání při stisknutí tlačítka. Každý z nich se bude probít ve své vlastní části. Metoda onCreate bude přepsána pro vyvolání getAllPermissions a createAgent a přidání vazeb pro tlačítko volání. K tomu dojde pouze jednou při vytvoření aktivity. Další informace najdete v průvodci onCreateVysvětlením životního cyklu aktivity.

Přejděte na MainActivity.java a nahraďte obsah následujícím kódem:

package com.contoso.acsquickstart;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.media.AudioManager;
import android.Manifest;
import android.content.pm.PackageManager;

import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.azure.android.communication.common.CommunicationUserIdentifier;
import com.azure.android.communication.common.CommunicationTokenCredential;
import com.azure.android.communication.calling.CallAgent;
import com.azure.android.communication.calling.CallClient;
import com.azure.android.communication.calling.StartCallOptions;


import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    
    private CallAgent callAgent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getAllPermissions();
        createAgent();
        
        // Bind call button to call `startCall`
        Button callButton = findViewById(R.id.call_button);
        callButton.setOnClickListener(l -> startCall());
        
        setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
    }

    /**
     * Request each required permission if the app doesn't already have it.
     */
    private void getAllPermissions() {
        // See section on requesting permissions
    }

    /**
      * Create the call agent for placing calls
      */
    private void createAgent() {
        // See section on creating the call agent
    }

    /**
     * Place a call to the callee id provided in `callee_id` text input.
     */
    private void startCall() {
        // See section on starting the call
    }
}

Žádost o oprávnění za běhu

Pro Android 6.0 a vyšší (úroveň rozhraní API 23) a targetSdkVersion 23 nebo vyšší se oprávnění udělují za běhu místo při instalaci aplikace. Pro podporu tohoto getAllPermissions problému je možné implementovat volání ActivityCompat.checkSelfPermission a ActivityCompat.requestPermissions pro každé požadované oprávnění.

/**
 * Request each required permission if the app doesn't already have it.
 */
private void getAllPermissions() {
    String[] requiredPermissions = new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE};
    ArrayList<String> permissionsToAskFor = new ArrayList<>();
    for (String permission : requiredPermissions) {
        if (ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
            permissionsToAskFor.add(permission);
        }
    }
    if (!permissionsToAskFor.isEmpty()) {
        ActivityCompat.requestPermissions(this, permissionsToAskFor.toArray(new String[0]), 1);
    }
}

Poznámka

Při návrhu aplikace zvažte, kdy by se o tato oprávnění měla požádat. Oprávnění by se měla vyžadovat podle potřeby, ne předem. Další informace najdete v průvodci oprávněními pro Android.

Objektový model

Následující třídy a rozhraní zpracovávají některé hlavní funkce sady SDK pro volání Azure Communication Services:

Název Description
CallClient CallClient je hlavním vstupním bodem volající sady SDK.
CallAgent Agent CallAgent se používá ke spouštění a správě volání.
CommunicationTokenCredential CommunicationTokenCredential se používá jako přihlašovací údaje tokenu k vytvoření instance agenta CallAgent.
CommunicationIdentifier CommunicationIdentifier se používá jako jiný typ účastníka, který by mohl být součástí hovoru.

Vytvoření agenta z přístupového tokenu uživatele

S tokenem uživatele je možné vytvořit instanci ověřeného agenta volání. Obecně se tento token vygeneruje ze služby s ověřováním specifickým pro danou aplikaci. Další informace o přístupových tokenech uživatelů najdete v příručce Uživatelské přístupové tokeny .

Pro účely rychlého startu nahraďte <User_Access_Token> přístupovým tokenem uživatele vygenerovaným pro váš prostředek služby Azure Communication Service.


/**
 * Create the call agent for placing calls
 */
private void createAgent() {
    String userToken = "<User_Access_Token>";

    try {
        CommunicationTokenCredential credential = new CommunicationTokenCredential(userToken);
        callAgent = new CallClient().createCallAgent(getApplicationContext(), credential).get();
    } catch (Exception ex) {
        Toast.makeText(getApplicationContext(), "Failed to create call agent.", Toast.LENGTH_SHORT).show();
    }
}

Zahájení hovoru pomocí agenta volání

Volání je možné provést prostřednictvím agenta volání a vyžaduje pouze zadání seznamu ID volaných a možností volání. Pro účely rychlého startu se použijí výchozí možnosti volání bez videa a jedno ID volané z textového vstupu.

/**
 * Place a call to the callee id provided in `callee_id` text input.
 */
private void startCall() {
    EditText calleeIdView = findViewById(R.id.callee_id);
    String calleeId = calleeIdView.getText().toString();
    
    StartCallOptions options = new StartCallOptions();

    callAgent.startCall(
        getApplicationContext(),
        new CommunicationUserIdentifier[] {new CommunicationUserIdentifier(calleeId)},
        options);
}

Spusťte aplikaci a zavolejte robota echo.

Aplikaci teď můžete spustit pomocí tlačítka Spustit aplikaci na panelu nástrojů (Shift+F10). Ověřte, že můžete volat voláním 8:echo123. Přehraje se předem nahraná zpráva a pak se vám zpráva zopakuje.

Snímek obrazovky znázorňující dokončenou aplikaci

V tomto rychlém startu se dozvíte, jak zahájit volání pomocí sady SDK pro volání Azure Communication Services pro iOS.

Příklad kódu

Ukázkovou aplikaci si můžete stáhnout z GitHubu.

Požadavky

K dokončení tohoto kurzu budete potřebovat následující požadavky:

Nastavení

Vytvoření projektu Xcode

V Xcode vytvořte nový projekt pro iOS a vyberte šablonu Aplikace . V tomto kurzu se používá architektura SwiftUI, takže byste měli nastavit jazyk na Swift a uživatelské rozhraní na SwiftUI. Během tohoto rychlého startu nebudete vytvářet testy. Zrušte zaškrtnutí políčka Zahrnout testy.

Snímek obrazovky s oknem Nový projekt v Xcode

Instalace balíčku a závislostí pomocí CocoaPods

  1. Pokud chcete pro svou aplikaci vytvořit podfile, otevřete terminál, přejděte do složky projektu a spusťte příkaz:

    pod init

  2. Do souboru Podfile přidejte následující kód a uložte ho (ujistěte se, že "cíl" odpovídá názvu projektu):

    platform :ios, '13.0'
    use_frameworks!
    
    target 'AzureCommunicationCallingSample' do
      pod 'AzureCommunicationCalling', '~> 1.0.0'
    end
    
  3. Spusťte pod install.

  4. Otevřete soubor .xcworkspace pomocí Xcode.

Žádost o přístup k mikrofonu

Pokud chcete získat přístup k mikrofonu zařízení, musíte aktualizovat seznam vlastností informací aplikace pomocí NSMicrophoneUsageDescription. Přidruženou string hodnotu nastavíte na hodnotu, která bude zahrnuta v dialogovém okně, které systém používá k vyžádání přístupu od uživatele.

Klikněte pravým tlačítkem na Info.plist položku stromu projektu a vyberte Otevřít jako>zdrojový kód. Přidejte následující řádky do oddílu nejvyšší úrovně <dict> a pak soubor uložte.

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

Nastavení architektury aplikace

Otevřete soubor ContentView.swift vašeho projektu a přidejte import do horní části souboru deklaraci pro import AzureCommunicationCalling library. Kromě toho ho AVFoundationbudeme potřebovat pro žádost o zvukové oprávnění v kódu.

import AzureCommunicationCalling
import AVFoundation

Nahraďte implementaci ContentView struktury některými jednoduchými ovládacími prvky uživatelského rozhraní, které uživateli umožňují zahájit a ukončit volání. V tomto rychlém startu k těmto ovládacím prvkům připojíme obchodní logiku.

struct ContentView: View {
    @State var callee: String = ""
    @State var callClient: CallClient?
    @State var callAgent: CallAgent?
    @State var call: Call?

    var body: some View {
        NavigationView {
            Form {
                Section {
                    TextField("Who would you like to call?", text: $callee)
                    Button(action: startCall) {
                        Text("Start Call")
                    }.disabled(callAgent == nil)
                    Button(action: endCall) {
                        Text("End Call")
                    }.disabled(call == nil)
                }
            }
            .navigationBarTitle("Calling Quickstart")
        }.onAppear {
            // Initialize call agent
        }
    }

    func startCall() {
        // Ask permissions
        AVAudioSession.sharedInstance().requestRecordPermission { (granted) in
            if granted {
                // Add start call logic
            }
        }
    }

    func endCall() {
        // Add end call logic
    }
}

Objektový model

Následující třídy a rozhraní zpracovávají některé hlavní funkce sady SDK pro volání Azure Communication Services:

Název Description
CallClient CallClient je hlavním vstupním bodem volající sady SDK.
CallAgent Agent CallAgent se používá ke spouštění a správě volání.
CommunicationTokenCredential CommunicationTokenCredential se používá jako přihlašovací údaje tokenu k vytvoření instance agenta CallAgent.
CommunicationUserIdentifier CommunicationUserIdentifier se používá k reprezentaci identity uživatele, která může být jedním z následujících: CommunicationUserIdentifier/PhoneNumberIdentifier/CallingApplication.

Ověření klienta

Inicializuje CallAgent instanci pomocí přístupového tokenu uživatele, který nám umožní provádět a přijímat volání.

V následujícím kódu budete muset nahradit <USER ACCESS TOKEN> platným přístupovým tokenem uživatele pro váš prostředek. Pokud ještě token nemáte k dispozici, projděte si dokumentaci k přístupovým tokenům uživatele .

Do zpětného onAppear volání v ContentView.swift přidejte následující kód:

var userCredential: CommunicationTokenCredential?
do {
    userCredential = try CommunicationTokenCredential(token: "<USER ACCESS TOKEN>")
} catch {
    print("ERROR: It was not possible to create user credential.")
    return
}

self.callClient = CallClient()

// Creates the call agent
self.callClient?.createCallAgent(userCredential: userCredential!) { (agent, error) in
    if error != nil {
        print("ERROR: It was not possible to create a call agent.")
        return
    }
    else {
        self.callAgent = agent
        print("Call agent successfully created.")
    }
}

Zahájení hovoru

Metoda startCall se nastaví jako akce, která se provede při klepnutí na tlačítko Spustit volání . Aktualizujte implementaci tak, aby se spustilo volání pomocí příkazu ASACallAgent:

func startCall()
{
    // Ask permissions
    AVAudioSession.sharedInstance().requestRecordPermission { (granted) in
        if granted {
            // start call logic
            let callees:[CommunicationIdentifier] = [CommunicationUserIdentifier(self.callee)]
            self.callAgent?.startCall(participants: callees, options: StartCallOptions()) { (call, error) in
                if (error == nil) {
                    self.call = call
                } else {
                    print("Failed to get call object")
                }
            }
        }
    }
}

Pomocí vlastností v souboru StartCallOptions můžete také nastavit počáteční možnosti hovoru (tj. umožňují zahájit hovor se ztlumeným mikrofonem).

Ukončení hovoru

Implementujte metodu endCall pro ukončení aktuálního volání při klepnutí na tlačítko Ukončit volání .

func endCall()
{    
    self.call!.hangUp(options: HangUpOptions()) { (error) in
        if (error != nil) {
            print("ERROR: It was not possible to hangup the call.")
        }
    }
}

Spuštění kódu

Aplikaci můžete sestavit a spustit na simulátoru iOS tak, ževyberete Spustitprodukt> nebo použijete klávesovou zkratku (⌘-R).

Konečný vzhled a chování aplikace Rychlý start

Odchozí volání VOIP můžete provést tak, že do textového pole zadáte ID uživatele a klepnete na tlačítko Zahájit hovor . Volání 8:echo123 vás spojí s robotem echo, což je skvělé pro začátek a ověření, že vaše zvuková zařízení fungují.

Poznámka

Při prvním volání vás systém vyzve k přístupu k mikrofonu. V produkční aplikaci byste měli pomocí AVAudioSession rozhraní API zkontrolovat stav oprávnění a řádně aktualizovat chování aplikace, když oprávnění není uděleno.

Vyčištění prostředků

Pokud chcete vyčistit a odebrat předplatné komunikačních služeb, můžete prostředek nebo skupinu prostředků odstranit. Odstraněním skupiny prostředků se odstraní také všechny ostatní prostředky, které jsou k ní přidružené. Přečtěte si další informace o čištění prostředků.

Další kroky

Další informace najdete v následujících článcích: