rychlý start: připojení volající aplikace k Teams schůzce
Důležité
Funkce popsané v tomto dokumentu jsou momentálně ve verzi Public Preview. Tato verze Preview se poskytuje bez smlouvy o úrovni služeb a nedoporučuje se pro produkční úlohy. Některé funkce se nemusí podporovat nebo mohou mít omezené možnosti. Další informace najdete v dodatečných podmínkách použití pro verze Preview v Microsoft Azure.
v tomto rychlém startu se dozvíte, jak připojit Teams schůzku pomocí služby Azure Communication Services, která volá sadu SDK pro JavaScript.
Příklad kódu
Vyhledejte finální kód pro tento rychlý Start v GitHub.
Požadavky
přidat ovládací prvky uživatelského rozhraní Teams
Nahraďte kód v index.html následujícím fragmentem kódu. textové pole se použije k zadání Teamsho kontextu schůzky a tlačítko se použije k připojení k zadané schůzce:
<!DOCTYPE html>
<html>
<head>
<title>Communication Client - Calling Sample</title>
</head>
<body>
<h4>Azure Communication Services</h4>
<h1>Teams meeting join quickstart</h1>
<input id="teams-link-input" type="text" placeholder="Teams meeting link"
style="margin-bottom:1em; width: 300px;" />
<p>Call state <span style="font-weight: bold" id="call-state">-</span></p>
<p><span style="font-weight: bold" id="recording-state"></span></p>
<div>
<button id="join-meeting-button" type="button" disabled="false">
Join Teams Meeting
</button>
<button id="hang-up-button" type="button" disabled="true">
Hang Up
</button>
</div>
<script src="./bundle.js"></script>
</body>
</html>
povolit ovládací prvky uživatelského rozhraní Teams
Nahraďte obsah souboru client.js následujícím fragmentem kódu.
import { CallClient } from "@azure/communication-calling";
import { Features } from "@azure/communication-calling";
import { AzureCommunicationTokenCredential } from '@azure/communication-common';
let call;
let callAgent;
const meetingLinkInput = document.getElementById('teams-link-input');
const hangUpButton = document.getElementById('hang-up-button');
const teamsMeetingJoinButton = document.getElementById('join-meeting-button');
const callStateElement = document.getElementById('call-state');
const recordingStateElement = document.getElementById('recording-state');
async function init() {
const callClient = new CallClient();
const tokenCredential = new AzureCommunicationTokenCredential("<USER ACCESS TOKEN>");
callAgent = await callClient.createCallAgent(tokenCredential, {displayName: 'ACS user'});
teamsMeetingJoinButton.disabled = false;
}
init();
hangUpButton.addEventListener("click", async () => {
// end the current call
await call.hangUp();
// toggle button states
hangUpButton.disabled = true;
teamsMeetingJoinButton.disabled = false;
callStateElement.innerText = '-';
});
teamsMeetingJoinButton.addEventListener("click", () => {
// join with meeting link
call = callAgent.join({meetingLink: meetingLinkInput.value}, {});
call.on('stateChanged', () => {
callStateElement.innerText = call.state;
})
call.api(Features.Recording).on('isRecordingActiveChanged', () => {
if (call.api(Features.Recording).isRecordingActive) {
recordingStateElement.innerText = "This call is being recorded";
}
else {
recordingStateElement.innerText = "";
}
});
// toggle button states
hangUpButton.disabled = false;
teamsMeetingJoinButton.disabled = true;
});
získat odkaz na schůzku Teams
odkaz na Teams schůzku lze načíst pomocí rozhraní api Graph. tato část je popsána v dokumentaci Graph.
komunikační služby, které volá sadu SDK, přijímají úplný Teams odkaz na schůzku. tento odkaz se vrátí jako součást onlineMeeting prostředku, který je přístupný v rámci joinWebUrl vlastnosti . můžete také získat informace o požadované schůzce z adresy URL připojení ke schůzce ve Teams samotném pozváním schůzky.
Spuštění kódu
Uživatelé nástroje Webpack můžou použít webpack-dev-server k sestavení a spuštění vaší aplikace. Spusťte následující příkaz pro vytvoření balíčku aplikace hostitele na místním webovém serveru:
npx webpack-dev-server --entry ./client.js --output bundle.js --debug --devtool inline-source-map
Otevřete prohlížeč a přejděte na http://localhost:8080/ . Měli byste vidět následující:
do textového pole vložte Teams kontext a stisknutím tlačítka připojit Teams schůzku připojte Teams schůzku z aplikace služby komunikace.
v tomto rychlém startu se dozvíte, jak připojit Teams schůzku pomocí služby Azure Communication Services, která volá sadu SDK pro Windows.
Požadavky
přidat ovládací prvky uživatelského rozhraní Teams a povolit ovládací prvky uživatelského rozhraní Teams
Nahraďte kód v souboru MainPage. XAML následujícím fragmentem kódu. textové pole se použije k zadání Teamsho kontextu schůzky a tlačítko se použije k připojení k zadané schůzce:
<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}">
<StackPanel>
<TextBox PlaceholderText="Please enter the Teams meeting link." TextWrapping="Wrap" x:Name="TeamsLinkTextBox" Margin="10,10,10,10" />
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button Content="Join Teams Meeting" Click="JoinButton_ClickAsync" x:Name="JoinButton" Margin="10,10,10,10" />
<Button Content="Leave Meeting" Click="LeaveButton_ClickAsync" x:Name="LeaveButton" Margin="10,10,10,10" />
</StackPanel>
<TextBlock TextWrapping="Wrap" x:Name="CallStatusTextBlock" Margin="10,10,10,10" />
<TextBlock TextWrapping="Wrap" x:Name="RecordingStatusTextBlock" Margin="10,10,10,10" />
</StackPanel>
</Page>
povolit ovládací prvky uživatelského rozhraní Teams
Nahraďte obsah MainPage.xaml.cs následujícím fragmentem kódu:
using System;
using System.Threading.Tasks;
using Windows.UI.Core;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Azure.Communication;
using Azure.Communication.Calling;
namespace CallingQuickstart
{
public sealed partial class MainPage : Page
{
string user_token_ = "<User_Access_Token>";
Call call_;
CallClient call_client;
CallAgent call_agent;
public MainPage()
{
this.InitializeComponent();
call_client = new CallClient();
}
private async void JoinButton_ClickAsync(object sender, RoutedEventArgs e)
{
if (!await ValidateInput())
{
return;
}
//
// Create CallAgent
//
CommunicationTokenCredential token_credential;
try
{
token_credential = new CommunicationTokenCredential(user_token_);
CallAgentOptions call_agent_options = new CallAgentOptions();
call_agent = await call_client.CreateCallAgent(token_credential, call_agent_options);
}
catch
{
await new MessageDialog("It was not possible to create call agent. Please check if token is valid.").ShowAsync();
return;
}
//
// Join a Teams meeting
//
try
{
JoinCallOptions joinCallOptions = new JoinCallOptions();
TeamsMeetingLinkLocator teamsMeetingLinkLocator = new TeamsMeetingLinkLocator(TeamsLinkTextBox.Text);
call_ = await call_agent.JoinAsync(teamsMeetingLinkLocator, joinCallOptions);
}
catch
{
await new MessageDialog("It was not possible to join the Teams meeting. Please check if Teams Link is valid.").ShowAsync();
return;
}
//
// Set up call callbacks
//
call_.OnStateChanged += Call_OnStateChangedAsync;
call_.OnIsRecordingActiveChanged += Call_OnIsRecordingActiveChangedAsync;
}
private async void Call_OnStateChangedAsync(object sender, PropertyChangedEventArgs args)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
CallStatusTextBlock.Text = call_.State.ToString();
});
}
private async void Call_OnIsRecordingActiveChangedAsync(object sender, PropertyChangedEventArgs args)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
RecordingStatusTextBlock.Text = call_.IsRecordingActive ? "Recording is active." : "Recording is inactive.";
});
}
private async void LeaveButton_ClickAsync(object sender, RoutedEventArgs e)
{
try
{
await call_.HangUp(new HangUpOptions());
}
catch
{
await new MessageDialog("It was not possible to leave the Teams meeting.").ShowAsync();
}
}
private async Task<bool> ValidateInput()
{
if (user_token_.StartsWith("<"))
{
await new MessageDialog("Please enter token in source code.").ShowAsync();
return false;
}
if (TeamsLinkTextBox.Text.Trim().Length == 0 || !TeamsLinkTextBox.Text.StartsWith("http"))
{
await new MessageDialog("Please enter Teams meeting link.").ShowAsync();
return false;
}
return true;
}
}
}
získat odkaz na schůzku Teams
odkaz na Teams schůzku lze načíst pomocí rozhraní api Graph. tato část je popsána v dokumentaci Graph.
komunikační služby, které volá sadu SDK, přijímají úplný Teams odkaz na schůzku. Tento odkaz se vrátí jako součást onlineMeeting prostředku, který je přístupný v rámci joinWebUrl vlastnosti. požadované informace o schůzce můžete také získat z adresy URL připojení ke schůzce ve Teams samotném pozváním schůzky.
spuštění aplikace a připojení k Teams schůzce
můžete sestavit a spustit aplikaci na Visual Studio tím, že vyberete ladění > spustit ladění nebo pomocí klávesové zkratky (F5).
do textového pole vložte Teams kontext a stisknutím tlačítka připojit Teams schůzku připojte Teams schůzku z aplikace služby komunikace.
V tomto rychlém startu se dozvíte, jak se připojit ke schůzce Teams pomocí sady SDK volání Azure Communication Services pro Android.
Příklad kódu
Finalizovaný kód pro tento rychlý start najdete na GitHub.
Požadavky
- Pracovní Communication Services, který volá aplikaci pro Android.
- Nasazení Teams nasazení .
Přidání ovládacích prvků Teams uživatelského rozhraní
Nahraďte kód v activity_main.xml následujícím fragmentem kódu. Textové pole se použije k zadání Teams schůzky a tlačítko se použije k připojení zadané schůzky:
<?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">
<EditText
android:id="@+id/teams_meeting_link"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Teams meeting link"
android:inputType="textUri"
android:layout_marginTop="100dp"
android:layout_marginHorizontal="20dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="70dp"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<Button
android:id="@+id/join_meeting_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Join Meeting" />
<Button
android:id="@+id/hangup_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hangup" />
</LinearLayout>
<TextView
android:id="@+id/call_status_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="40dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/recording_status_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Povolení ovládacích prvků Teams uživatelského rozhraní
Nahraďte obsah souboru MainActivity.java následujícím fragmentem kódu:
package com.contoso.acsquickstart;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
import com.azure.android.communication.calling.Call;
import com.azure.android.communication.calling.CallAgent;
import com.azure.android.communication.calling.CallClient;
import com.azure.android.communication.calling.HangUpOptions;
import com.azure.android.communication.calling.JoinCallOptions;
import com.azure.android.communication.common.CommunicationTokenCredential;
import com.azure.android.communication.calling.TeamsMeetingLinkLocator;
public class MainActivity extends AppCompatActivity {
private static final String[] allPermissions = new String[] { Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE };
private static final String UserToken = "<User_Access_Token>";
TextView callStatusBar;
TextView recordingStatusBar;
private CallAgent agent;
private Call call;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getAllPermissions();
createAgent();
Button joinMeetingButton = findViewById(R.id.join_meeting_button);
joinMeetingButton.setOnClickListener(l -> joinTeamsMeeting());
Button hangupButton = findViewById(R.id.hangup_button);
hangupButton.setOnClickListener(l -> leaveMeeting());
callStatusBar = findViewById(R.id.call_status_bar);
recordingStatusBar = findViewById(R.id.recording_status_bar);
}
/**
* Join Teams meeting
*/
private void joinTeamsMeeting() {
if (UserToken.startsWith("<")) {
Toast.makeText(this, "Please enter token in source code", Toast.LENGTH_SHORT).show();
return;
}
EditText calleeIdView = findViewById(R.id.teams_meeting_link);
String meetingLink = calleeIdView.getText().toString();
if (meetingLink.isEmpty()) {
Toast.makeText(this, "Please enter Teams meeting link", Toast.LENGTH_SHORT).show();
return;
}
JoinCallOptions options = new JoinCallOptions();
TeamsMeetingLinkLocator teamsMeetingLinkLocator = new TeamsMeetingLinkLocator(meetingLink);
call = agent.join(
getApplicationContext(),
teamsMeetingLinkLocator,
options);
call.addOnStateChangedListener(p -> setCallStatus(call.getState().toString()));
call.addOnIsRecordingActiveChangedListener(p -> setRecordingStatus(call.isRecordingActive()));
}
/**
* Leave from the meeting
*/
private void leaveMeeting() {
try {
call.hangUp(new HangUpOptions()).get();
} catch (ExecutionException | InterruptedException e) {
Toast.makeText(this, "Unable to leave meeting", Toast.LENGTH_SHORT).show();
}
}
/**
* Create the call agent
*/
private void createAgent() {
try {
CommunicationTokenCredential credential = new CommunicationTokenCredential(UserToken);
agent = new CallClient().createCallAgent(getApplicationContext(), credential).get();
} catch (Exception ex) {
Toast.makeText(getApplicationContext(), "Failed to create call agent.", Toast.LENGTH_SHORT).show();
}
}
/**
* Request each required permission if the app doesn't already have it.
*/
private void getAllPermissions() {
ArrayList<String> permissionsToAskFor = new ArrayList<>();
for (String permission : allPermissions) {
if (ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
permissionsToAskFor.add(permission);
}
}
if (!permissionsToAskFor.isEmpty()) {
ActivityCompat.requestPermissions(this, permissionsToAskFor.toArray(new String[0]), 1);
}
}
/**
* Ensure all permissions were granted, otherwise inform the user permissions are missing.
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, int[] grantResults) {
boolean allPermissionsGranted = true;
for (int result : grantResults) {
allPermissionsGranted &= (result == PackageManager.PERMISSION_GRANTED);
}
if (!allPermissionsGranted) {
Toast.makeText(this, "All permissions are needed to make the call.", Toast.LENGTH_LONG).show();
finish();
}
}
/**
* Shows call status in status bar
*/
private void setCallStatus(String status) {
runOnUiThread(() -> callStatusBar.setText(status));
}
/**
* Shows recording status status bar
*/
private void setRecordingStatus(boolean status) {
if (status == true) {
runOnUiThread(() -> recordingStatusBar.setText("This call is being recorded"));
}
else {
runOnUiThread(() -> recordingStatusBar.setText(""));
}
}
}
Získání odkazu Teams schůzky
Odkaz Teams schůzky můžete načíst pomocí Graph API. Podrobnosti najdete v Graph dokumentaci.
Sada SDK Communication Services volání přijme úplný odkaz na Teams schůzky. Tento odkaz se vrátí jako součást onlineMeeting prostředku, který je přístupný ve joinWebUrl vlastnosti. Požadované informace o schůzce můžete získat také z adresy URL pro připojení ke schůzce v samotné Teams schůzky.
Spuštění aplikace a připojení k Teams schůzce
Aplikaci je teď možné spustit pomocí tlačítka Spustit aplikaci na panelu nástrojů (Shift+F10). Měli byste vidět následující:
Vložte Teams do textového pole a stisknutím Join Meeting (Připojit se ke schůzce) se připojte Teams z vaší Communication Services aplikace.
v tomto rychlém startu se dozvíte, jak připojit Teams schůzku pomocí služby Azure Communication Services call SDK pro iOS.
Požadavky
Pro účely tohoto rychlého startu použijeme beta. 12 z AzureCommunicationCalling SDK, takže musíme aktualizovat souboru podfile a znovu nainstalovat lusky.
Nahraďte své souboru podfile následujícím kódem pro souboru podfile a uložte (Ujistěte se, že "Target" odpovídá názvu vašeho projektu):
platform :ios, '13.0'
use_frameworks!
target 'AzureCommunicationCallingSample' do
pod 'AzureCommunicationCalling', '1.0.0-beta.12'
end
Odstraňte složku lusky, souboru podfile. Lock a .xcworkspace. soubor.
Spusťte pod install a otevřete .xcworkspace s Xcode.
přidat ovládací prvky uživatelského rozhraní Teams a povolit ovládací prvky uživatelského rozhraní Teams
Nahraďte kód v ContentView. SWIFT následujícím fragmentem kódu. textové pole se použije k zadání Teamsho kontextu schůzky a tlačítko se použije k připojení k zadané schůzce:
import SwiftUI
import AzureCommunicationCalling
import AVFoundation
struct ContentView: View {
@State var meetingLink: String = ""
@State var callStatus: String = ""
@State var message: String = ""
@State var recordingStatus: String = ""
@State var callClient: CallClient?
@State var callAgent: CallAgent?
@State var call: Call?
@State var callObserver: CallObserver?
var body: some View {
NavigationView {
Form {
Section {
TextField("Teams meeting link", text: $meetingLink)
Button(action: joinTeamsMeeting) {
Text("Join Teams Meeting")
}.disabled(callAgent == nil)
Button(action: leaveMeeting) {
Text("Leave Meeting")
}.disabled(call == nil)
Text(callStatus)
Text(message)
Text(recordingStatus)
}
}
.navigationBarTitle("Calling Quickstart")
}.onAppear {
// Initialize call agent
var userCredential: CommunicationTokenCredential?
do {
userCredential = try CommunicationTokenCredential(token: "<USER ACCESS TOKEN>")
} catch {
print("ERROR: It was not possible to create user credential.")
self.message = "Please enter your token in source code"
return
}
self.callClient = CallClient()
// Creates the call agent
self.callClient?.createCallAgent(userCredential: userCredential!) { (agent, error) in
if error != nil {
self.message = "Failed to create CallAgent."
return
} else {
self.callAgent = agent
self.message = "Call agent successfully created."
}
}
}
}
func joinTeamsMeeting() {
// Ask permissions
AVAudioSession.sharedInstance().requestRecordPermission { (granted) in
if granted {
let joinCallOptions = JoinCallOptions()
let teamsMeetingLinkLocator = TeamsMeetingLinkLocator(meetingLink: self.meetingLink)
self.callAgent?.join(with: teamsMeetingLinkLocator, joinCallOptions: joinCallOptions) {(call, error) in
if (error == nil) {
self.call = call
self.callObserver = CallObserver(self)
self.call!.delegate = self.callObserver
self.message = "Teams meeting joined successfully"
} else {
print("Failed to get call object")
return
}
}
}
}
}
func leaveMeeting() {
if let call = call {
call.hangUp(options: nil, completionHandler: { (error) in
if error == nil {
self.message = "Leaving Teams meeting was successful"
} else {
self.message = "Leaving Teams meeting failed"
}
})
} else {
self.message = "No active call to hangup"
}
}
}
class CallObserver : NSObject, CallDelegate {
private var owner:ContentView
init(_ view:ContentView) {
owner = view
}
public func call(_ call: Call, didChangeState args: PropertyChangedEventArgs) {
owner.callStatus = CallObserver.callStateToString(state: call.state)
if call.state == .disconnected {
owner.call = nil
owner.message = "Left Meeting"
} else if call.state == .inLobby {
owner.message = "Waiting in lobby !!"
} else if call.state == .connected {
owner.message = "Joined Meeting !!"
}
}
public func call(_ call: Call, didChangeRecordingState args: PropertyChangedEventArgs) {
if (call.isRecordingActive == true) {
owner.recordingStatus = "This call is being recorded"
}
else {
owner.recordingStatus = ""
}
}
private static func callStateToString(state: CallState) -> String {
switch state {
case .connected: return "Connected"
case .connecting: return "Connecting"
case .disconnected: return "Disconnected"
case .disconnecting: return "Disconnecting"
case .earlyMedia: return "EarlyMedia"
case .none: return "None"
case .ringing: return "Ringing"
case .inLobby: return "InLobby"
default: return "Unknown"
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
získat odkaz na schůzku Teams
odkaz na Teams schůzku lze načíst pomocí rozhraní api Graph. tato část je popsána v dokumentaci Graph.
komunikační služby, které volá sadu SDK, přijímají úplný Teams odkaz na schůzku. Tento odkaz se vrátí jako součást onlineMeeting prostředku, který je přístupný v rámci joinWebUrl vlastnosti. požadované informace o schůzce můžete také získat z adresy URL připojení ke schůzce ve Teams samotném pozváním schůzky.
spuštění aplikace a připojení k Teams schůzce
Můžete sestavit a spustit aplikaci v simulátoru iOS tak, že vyberete možnost > spuštění produktu nebo pomocí klávesové zkratky (⌘-R).
do textového pole vložte Teams kontext a stisknutím tlačítka připojit Teams schůzku připojte Teams schůzku z aplikace služby komunikace.
Funkce popsané v tomto dokumentu používají verzi sady SDK komunikačních služeb obecné dostupnosti. interoperabilita Teams vyžaduje Beta verzi sady sdk služby communications Services. Sady SDK beta verze lze prozkoumat na stránce poznámky k verzi.
Při provádění kroku instalovat balíček se sadami beta SDK změňte verzi balíčku na nejnovější beta verzi, a to zadáním verze @1.0.0-beta.10 (verze v okamžiku psaní tohoto článku) v communication-calling názvu balíčku. Nemusíte měnit communication-common příkaz balíčku. Například:
npm install @azure/communication-calling@1.0.0-beta.10 --save
Vyčištění prostředků
Pokud chcete vyčistit a odebrat předplatné služby Communications Services, můžete prostředek nebo skupinu prostředků odstranit. Odstraněním skupiny prostředků se odstraní také všechny další prostředky, které jsou k ní přidružené. Přečtěte si další informace o vyčištění prostředků.
Další kroky
Další informace najdete v následujících článcích:
- Podívejte se na naši ukázku volání Hero
- Další informace o volání funkcí sady SDK
- Další informace o volání funkce