Proposed Pull Request Change

title description author ms.author ms.date ms.topic ms.service
Quickstart - How to call to Teams user from an Android app In this tutorial, you learn how to make a call to Teams user using the Azure Communication Services Calling SDK for Android ruslanzdor ruslanzdor 07/19/2023 include azure-communication-services
📄 Document Links
GitHub View on GitHub Microsoft Learn View on Microsoft Learn
Raw New Markdown
Generating updated version of doc...
Rendered New Markdown
Generating updated version of doc...
+0 -0
+0 -0
--- title: Quickstart - How to call to Teams user from an Android app description: In this tutorial, you learn how to make a call to Teams user using the Azure Communication Services Calling SDK for Android author: ruslanzdor ms.author: ruslanzdor ms.date: 07/19/2023 ms.topic: include ms.service: azure-communication-services --- ## Sample Code Find the finalized code for this quickstart on [GitHub](https://github.com/Azure-Samples/communication-services-android-quickstarts/tree/main/Add%20Voice%20Calling). ## Prerequisites - A working [Communication Services calling Android app](../../getting-started-with-calling.md). - A [Teams deployment](/deployoffice/teams-install). - Teams users must have a Teams Phone license and be [Enterprise Voice enabled](/microsoftteams/direct-routing-enable-users#use-powershell-1) ## Add the Teams UI controls Replace code in activity_main.xml with following snippet. The text box will be used to enter the Teams meeting context and the button will be used to join the specified meeting: ```xml <?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/callee_id" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:hint="Callee Id" android:inputType="textPersonName" 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="46dp" android:gravity="center" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"> <Button android:id="@+id/call_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Call" /> <Button android:id="@+id/hangup_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hangup" /> </LinearLayout> <TextView android:id="@+id/status_bar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="16dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> ``` ## Enable the Teams UI controls Replace the content of `MainActivity.java` with following snippet: ```java 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.media.AudioManager; 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.common.CommunicationIdentifier; import com.azure.android.communication.common.CommunicationUserIdentifier; 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.common.CommunicationTokenCredential; import com.azure.android.communication.calling.StartCallOptions; 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 statusBar; private CallAgent agent; private Call call; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getAllPermissions(); createAgent(); Button callButton = findViewById(R.id.call_button); callButton.setOnClickListener(l -> startCall()); Button hangupButton = findViewById(R.id.hangup_button); hangupButton.setOnClickListener(l -> endCall()); statusBar = findViewById(R.id.status_bar); setVolumeControlStream(AudioManager.STREAM_VOICE_CALL); } /** * Start a call */ private void startCall() { if (UserToken.startsWith("<")) { Toast.makeText(this, "Please enter token in source code", Toast.LENGTH_SHORT).show(); return; } EditText calleeIdView = findViewById(R.id.callee_id); String calleeId = calleeIdView.getText().toString(); if (calleeId.isEmpty()) { Toast.makeText(this, "Please enter callee", Toast.LENGTH_SHORT).show(); return; } ArrayList<CommunicationIdentifier> participants = new ArrayList<>(); participants.add(new CommunicationUserIdentifier(calleeId)); StartCallOptions options = new StartCallOptions(); call = agent.startCall( getApplicationContext(), participants, options); call.addOnStateChangedListener(p -> setStatus(call.getState().toString())); } /** * Ends the call previously started */ private void endCall() { try { call.hangUp(new HangUpOptions()).get(); } catch (ExecutionException | InterruptedException e) { Toast.makeText(this, "Unable to hang up call", 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 message in the status bar */ private void setStatus(String status) { runOnUiThread(() -> statusBar.setText(status)); } } ``` ## Launch the app and join Teams meeting The app can now be launched using the "Run App" button on the toolbar (Shift+F10). Verify you're able to place calls by calling `8:echo123`. A pre-recorded message plays then repeat your message back to you. :::image type="content" source="../../media/android/quickstart-android-call-echobot.png" alt-text="Screenshot showing the completed application.":::
Success! Branch created successfully. Create Pull Request on GitHub
Error: