通过集成声网视频 SDK,开发者能够在社交、工作、教育和 IoT app 里快速实现实时音视频互动。
本文介绍如何通过少量代码集成声网视频 SDK ,在你的 Android app 里实现互动直播。
下图展示在 app 中集成声网互动直播的基本工作流程:
实现互动直播的步骤如下:
joinChannel
创建并加入频道。使用同一频道名称的 app 客户端默认加入同一频道。setClientRole
切换用户角色。App 客户端加入频道需要以下信息:
开始前,请确保你的开发环境满足以下条件:
实现视频通话之前,参考如下步骤设置你的项目:
如需创建新项目,在 Android Studio 里,依次选择 Phone and Tablet > Empty Activity,创建 Android 项目。
创建项目后,Android Studio 会自动开始同步 gradle。请确保同步成功再进行下一步操作。
使用 Maven Central 将 Agora 视频 SDK 集成到你的项目中。更多集成方式,请参考集成 SDK 的其他方法。
a. 在 /Gradle Scripts/build.gradle(Project: <projectname>)
文件中添加如下代码,以添加 Maven Central 依赖:
buildscript {
repositories {
...
mavenCentral()
}
...
}
allprojects {
repositories {
...
mavenCentral()
}
}
b. 在 /Gradle Scripts/build.gradle(Module: <projectname>.app)
文件中添加如下代码,将 Agora 视频 SDK 集成到你的 Android 项目中:
...
dependencies {
...
// x.y.z,请填写具体的 SDK 版本号,如:3.5.0 或 3.7.0.2。
// 通过发版说明获取最新版本号。
implementation 'io.agora.rtc:full-sdk:x.y.z'
}
/app/Manifests/AndroidManifest.xml
文件中的 </application>
后面添加如下网络和设备权限: <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<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" />
<!-- 对于 Android 12.0 及以上设备,还需要添加如下权限: -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
在 /Gradle Scripts/proguard-rules.pro
文件中添加如下行,以防止声网 SDK 的代码被混淆:
-keep class io.agora.**{*;}
本节介绍如何使用声网视频 SDK 在你的 app 里实现互动直播。
互动直播的用户界面中,通常有两个视图框,分别用于展示本地视频和远端视频。在 /app/res/layout/activity_main.xml
文件中,用如下代码进行替换:
<?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:id="@+id/local_video_view_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white" />
<FrameLayout
android:id="@+id/remote_video_view_container"
android:layout_width="160dp"
android:layout_height="160dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="16dp"
android:background="@android:color/darker_gray" />
</RelativeLayout>
本节介绍如何导入所需的 Android 相关的类,获取 Android 权限。
导入 Android 相关的类
在 /app/java/com.example.<projectname>/MainActivity
文件中,在 package com.example.<projectname>
后添加如下代码:
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.view.SurfaceView;
import android.widget.FrameLayout;
获取 Android 权限
启动应用程序时,检查是否已在 app 中授予了实现直播所需的权限。如果未授权,使用内置的 Android 功能申请权限;如果已授权,则返回 true
。
在 /app/java/com.example.<projectname>/MainActivity
文件中,在 onCreate
函数前添加如下代码:
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;
}
打开你的 app,创建 RtcEngine
实例,启用视频后加入频道。如果本地用户是主播,则将本地视频发布到用户界面下方的视图中。如果另一主播加入该频道,你的 app 会捕捉到这一加入事件,并将远端视频添加到用户界面右上角的视图中。
互动直播的 API 使用时序见下图:
按照以下步骤实现该逻辑:
导入声网相关的类
在 /app/java/com.example.<projectname>/MainActivity
文件中,在 import android.os.Bundle;
后加入如下代码:
import io.agora.rtc.Constants;
import io.agora.rtc.IRtcEngineEventHandler;
import io.agora.rtc.RtcEngine;
import io.agora.rtc.video.VideoCanvas;
创建变量
在 /app/java/com.example.<projectname>/MainActivity
文件中,在 AppCompatActivity {
后加入如下代码:
// 填写你的项目在声网控制台中生成的 App ID。
private String appId = "";
// 填写频道名称。
private String channelName = "";
// 填写声网控制台中生成的临时 Token。
private String token = "";
private RtcEngine mRtcEngine;
private final IRtcEngineEventHandler mRtcEventHandler = new IRtcEngineEventHandler() {
@Override
// 监听频道内的远端主播,获取主播的 uid 信息。
public void onUserJoined(int uid, int elapsed) {
runOnUiThread(new Runnable() {
@Override
public void run() {
// 从 onUserJoined 回调获取 uid 后,调用 setupRemoteVideo,设置远端视频视图。
setupRemoteVideo(uid);
}
});
}
};
初始化 app 并加入频道
调用核心方法来创建并加入声网直播频道。在如下示例代码,我们使用 initializeAndJoinChannel
函数来封装核心方法。
在 /app/java/com.example.<projectname>/MainActivity
文件中,在 onCreate
函数后添加如下代码:
private void initializeAndJoinChannel() {
try {
mRtcEngine = RtcEngine.create(getBaseContext(), appId, mRtcEventHandler);
} catch (Exception e) {
throw new RuntimeException("Check the error.");
}
// 直播场景下,设置频道场景为 BROADCASTING。
mRtcEngine.setChannelProfile(Constants.CHANNEL_PROFILE_LIVE_BROADCASTING);
// 根据场景设置用户角色为 BORADCASTER 或 AUDIENCE。
mRtcEngine.setClientRole(Constants.CLIENT_ROLE_BROADCASTER);
// 视频默认禁用,你需要调用 enableVideo 开始视频流。
mRtcEngine.enableVideo();
FrameLayout container = findViewById(R.id.local_video_view_container);
// 调用 CreateRendererView 创建一个 SurfaceView 对象,并将其作为 FrameLayout 的子对象。
SurfaceView surfaceView = RtcEngine.CreateRendererView(getBaseContext());
container.addView(surfaceView);
// 将 SurfaceView 对象传入声网,以渲染本地视频。
mRtcEngine.setupLocalVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_FIT, 0));
// 使用 Token 加入频道。
mRtcEngine.joinChannel(token, channelName, "", 0);
}
当远端主播加入频道时添加远端界面
在 /app/java/com.example.<projectname>/MainActivity
文件中,在 initializeAndJoinChannel
函数后加入如下代码:
private void setupRemoteVideo(int uid) {
FrameLayout container = findViewById(R.id.remote_video_view_container);
SurfaceView surfaceView = RtcEngine.CreateRendererView(getBaseContext());
surfaceView.setZOrderMediaOverlay(true);
container.addView(surfaceView);
mRtcEngine.setupRemoteVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_FIT, uid));
}
添加完互动直播功能后,可以添加启动和关闭 app 的逻辑。App 启动时,用户就加入了互动直播;app 关闭时,直播结束。
检查 app 是否有正确的权限。如果已授予权限,调用 initializeAndJoinChannel
加入直播频道。
在 /app/java/com.example.<projectname>/MainActivity
文件中,用如下代码替换 onCreate
。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 如果已经授予所有权限,初始化 RtcEngine 对象并加入一个频道。
if (checkSelfPermission(REQUESTED_PERMISSIONS[0], PERMISSION_REQ_ID) &&
checkSelfPermission(REQUESTED_PERMISSIONS[1], PERMISSION_REQ_ID)) {
initializeAndJoinChannel();
}
}
App 关闭后,清理你在 initializeAndJoinChannel
函数中创建的所有资源。
在 /app/java/com.example.<projectname>/MainActivity
文件中,在 onCreate
函数后添加 onDestroy
。
protected void onDestroy() {
super.onDestroy();
mRtcEngine.leaveChannel();
mRtcEngine.destroy();
}
将 Android 设备连接到你的电脑,并在 Android Studio 里点击 Run 'app'
。片刻后,项目便会安装到你的设备上。按照以下步骤测试直播 app:
BROADCASTER
,便会在本地视图中看到自己。Demo/index.html
文件,并输入相同的 App ID、频道名和临时 Token,加入直播。为保证通信安全,声网不推荐在生产环境中使用临时 Token。请参考使用 Token 鉴权,了解如何从你的服务器中获取 Token 并开始直播。
本节提供了额外的信息供参考。
声网在 GitHub 上提供了一个开源的互动直播示例项目 JoinChannelVideo 供你参考。
除了通过 Maven Central 集成 Agora 视频 SDK 外,你也可以手动复制 SDK 文件,将 SDK 导入你的项目。
在 SDK 下载页面下载最新版本的 Agora 视频 SDK,并解压。
打开 SDK 包 libs 文件夹,将以下文件或子文件夹复制到你的项目路径中。
文件或子文件夹 | 你的项目路径 |
---|---|
agora-rtc-sdk.jar 文件 |
/app/libs/ |
arm64-v8a 文件夹 |
/app/src/main/jniLibs/ |
armeabi-v7a 文件夹 |
/app/src/main/jniLibs/ |
x86 文件夹 |
/app/src/main/jniLibs/ |
x86_64 文件夹 |
/app/src/main/jniLibs/ |
include 文件夹 |
/app/src/main/jniLibs/ |
如果你使用 armeabi 架构, 请将 armeabi-v7a
文件夹的文件复制到你的项目 armeabi
文件中。如果出现不兼容问题,请联系我们。
声网视频 SDK 不报告直播频道中观众的事件。如有需要,请参考直播场景下,如何监听远端观众角色用户加入/离开频道的事件。