People engage longer when they see, hear, and interact with each other. The Agora SDK enables you to embed real-time voice and video interaction in any app, on any device, anywhere.
This page shows the minimum code you need to add voice call into your app by using the Agora Voice SDK for Android.
The following figure shows the workflow of a voice call implemented by the Agora SDK.
As shown in the figure, the workflow for adding Voice Call in your project is as follows:
Retrieve a token
A token is the credential that authenticates a user when your app client joins a channel. In a test or production environment, your app client retrieves tokens from a server in your security infrastructure.
Join a channel
Call joinChannel
to create and join a channel. App clients that pass the same channel name join the same channel.
Publish and subscribe to audio in the channel
After joining a channel, the app client automatically publishes and subscribes to audio in the channel.
For an app client to join an RTC channel, you need the following information:
Before proceeding, ensure that your development environment meets the following requirements:
Follow the steps to create the environment necessary to add voice call into your app.
For new projects, in Android Studio, create a Phone and Tablet Android project with an Empty Activity.
Integrate the Voice SDK into your project with Maven Central. For more integration methods, see Other approaches to intergrate the SDK.
a. In /Gradle Scripts/build.gradle(Project: <projectname>)
, add the following lines to add the Maven Central dependency:
buildscript {
repositories {
...
mavenCentral()
}
...
}
allprojects {
repositories {
...
mavenCentral()
}
}
b. In /Gradle Scripts/build.gradle(Module: <projectname>.app)
, add the following lines to integrate the Agora Voice SDK into your Android project:
...
dependencies {
...
// For x.y.z, fill in a specific SDK version number. For example, 3.5.0 or 3.7.0.2.
// Get the latest version number through the release notes.
implementation 'io.agora.rtc:voice-sdk:x.y.z'
}
Add permissions for network and device access.
In /app/Manifests/AndroidManifest.xml
, add the following permissions after </application>
:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<!-- Add the following permission on devices running Android 12.0 or later -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
To prevent obfuscating the code in the Agora SDK, add the following line to /Gradle Scripts/proguard-rules.pro
:
-keep class io.agora.**{*;}
This section shows how to use the Agora Voice SDK to implement Voice Call into your app step by step.
In /app/res/layout/activity_main.xml
, replace the content with the following:
<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/darker_gray">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="40dp"
android:layout_marginLeft="16dp"
android:layout_marginStart="16dp"
android:layout_gravity="center_vertical|start"
android:text="Welcome to the Agora Voice Call channel."/>
</FrameLayout>
</RelativeLayout>
Refer to the following steps to import the necessary Android classes and handle the Android permissions.
Import Android classes
In /app/java/com.example.<projectname>/MainActivity
, add the following lines after package com.example.<projectname>
:
// Java
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.pm.PackageManager;
// Kotlin
import android.content.pm.PackageManager
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import android.Manifest
import java.lang.Exception
Handle the Android permissions
When your app launches, check if the permissions necessary to insert voice call functionality into the app are granted. If the permissions are not granted, use the built-in Android functionality to request them; if they are, return true
.
To implement the system logic, in /app/java/com.example.<projectname>/MainActivity
, add the following lines before the onCreate
function:
// Java
private static final int PERMISSION_REQ_ID = 22;
private static final String[] REQUESTED_PERMISSIONS = {
Manifest.permission.RECORD_AUDIO,
Manifest.permission.CAMERA
};
private boolean checkSelfPermission(String permission, int requestCode) {
if (ContextCompat.checkSelfPermission(this, permission) !=
PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, REQUESTED_PERMISSIONS, requestCode);
return false;
}
return true;
}
// Kotlin
private val PERMISSION_REQ_ID_RECORD_AUDIO = 22
private val PERMISSION_REQ_ID_CAMERA = PERMISSION_REQ_ID_RECORD_AUDIO + 1
private fun checkSelfPermission(permission: String, requestCode: Int): Boolean {
if (ContextCompat.checkSelfPermission(this, permission) !=
PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
arrayOf(permission),
requestCode)
return false
}
return true
}
When your app opens, you create an RtEngine
instance, join a channel, and publish the local audio to the channel. When another user joins the channel, your apps catches the join event and receive the audio from the remote user.
The following figure shows the API call sequence of implementing Voice Call.
To implement this logic, take the following steps:
Import the Agora classes.
In /app/java/com.example.<projectname>/MainActivity
, add the following lines after import android.os.Bundle;
// Java
import io.agora.rtc.RtcEngine;
import io.agora.rtc.IRtcEngineEventHandler;
// Kotlin
import io.agora.rtc.RtcEngine
import io.agora.rtc.IRtcEngineEventHandler
Create the variables that you use to create and join a voice call channel.
In /app/java/com.example.<projectname>/MainActivity
, add the following lines after AppCompatActivity {
:
// Java
// Fill the App ID of your project generated on Agora Console.
private String appId = "";
// Fill the channel name.
private String channelName = "";
// Fill the temp token generated on Agora Console.
private String token = "";
private RtcEngine mRtcEngine;
private final IRtcEngineEventHandler mRtcEventHandler = new IRtcEngineEventHandler() {
};
// Kotlin
// Fill the App ID of your project generated on Agora Console.
private val APP_ID = ""
// Fill the channel name.
private val CHANNEL = ""
// Fill the temp token generated on Agora Console.
private val TOKEN = ""
private var mRtcEngine: RtcEngine ?= null
private val mRtcEventHandler = object : IRtcEngineEventHandler() {
}
Initialize the app and join the channel.
Call the following core methods to join a channel in the MainActivity
class. In the following sample code, the initializeAndJoinChannel
function encapsulates these core methods.
In /app/java/com.example.<projectname>/MainActivity
, add the following lines after the onCreate
function:
// Java
private void initializeAndJoinChannel() {
try {
mRtcEngine = RtcEngine.create(getBaseContext(), appId, mRtcEventHandler);
} catch (Exception e) {
throw new RuntimeException("Check the error");
}
mRtcEngine.joinChannel(token, channelName, "", 0);
}
// Kotlin
private fun initializeAndJoinChannel() {
try {
mRtcEngine = RtcEngine.create(baseContext, APP_ID, mRtcEventHandler)
} catch (e: Exception) {
}
mRtcEngine!!.joinChannel(TOKEN, CHANNEL, "", 0)
}
Now you have created the Voice Call functionality, start and stop the app. In this implementation, a voice call starts when the user opens your app. The call ends when the user closes your app.
To implement this function, do the following:
Check that the app has the corrent permissions. If permissions are granted, call initializeAndJoinChannel
to join a voice call channel.
In /app/java/com.example.<projectname>/MainActivity
, replace onCreate
with the following code in the MainActivity
class.
// Java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (checkSelfPermission(REQUESTED_PERMISSIONS[0], PERMISSION_REQ_ID)) {
initializeAndJoinChannel();
}
}
// Kotlin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (checkSelfPermission(Manifest.permission.RECORD_AUDIO, PERMISSION_REQ_ID_RECORD_AUDIO)) {
initializeAndJoinChannel();
}
}
When the user closes this app, clean up all the resources you created in initializeAndJoinChannel
.
In /app/java/com.example.<projectname>/MainActivity
, add onDestroy
after the onCreate
function.
// Java
protected void onDestroy() {
super.onDestroy();
mRtcEngine.leaveChannel();
mRtcEngine.destroy();
}
// Kotlin
override fun onDestroy() {
super.onDestroy()
mRtcEngine?.leaveChannel()
RtcEngine.destroy()
}
To test your app, follow the steps:
appId
and token
parameters with the App ID and temporary token that you retrieve from Agora Console. Fill channelName
with the channel name that you use to generate the temporary token.Run 'app'
on your Android Studio. A moment later you will see the project installed on your device. Generating a token by hand is not helpful in a production context. Authenticate Your Users with Tokens shows you how to start video calling with a token that you retrieve from your server.
In addition to integrating the Agora Voice SDK for Android through MavenCentral, you can also import the SDK into your project by manually copying the SDK files.
File or subfolder | Path of your project |
---|---|
agora-rtc-sdk.jar file | /app/libs/ |
arm64-v8a folder | /app/src/main/jniLibs/ |
armeabi-v7a folder | /app/src/main/jniLibs/ |
include folder | /app/src/main/jniLibs/ |
x86 folder | /app/src/main/jniLibs/ |
x86_64 folder | /app/src/main/jniLibs/ |
armeabi-v7a
folder to the armeabi
file of your project. Contact support@agora.io if you encounter any incompability issue.