集成 SDK
更新时间: 2024/03/15 16:57:57
本文为您介绍了 Flutter 端集成 NERTC SDK 的操作步骤,帮助您快速集成 SDK 并实现实时音视频通话的基本功能。
开发环境要求
在开始运行工程之前,请您准备以下开发环境:
- Flutter 3.0.0 及以上版本。
- Dart 2.17.0 及以上版本且低于3.0.0 版本。
- Android 端开发:
- Android Studio 4.1 及以上版本。
- App 要求 Android 5.0 及以上版本 Android 设备。
- 使用 Java 作为开发语言。
- iOS 端开发:
- Xcode 11.0 及以上版本。
- App 要求 iOS 11 及以上版本 iOS 设备。
- 请确保您的项目已设置有效的开发者签名。
- 使用 Objective-C 作为开发语言。
- 安装 Flutter 和 Dart 插件
步骤1: (可选)创建项目
您可以参考此步骤创建新项目,若是需要集成到已有的项目中,请忽略该步骤。创建Flutter项目的详细操作步骤请参见Flutter get-started。
-
在 Android Studio 的顶部菜单依次选择 File > New > New Flutter Project 新建工程。选择 Flutter Application ,单击 Next。
-
配置 Project 信息。
设置项目名称、项目位置和 Flutter SDK 位置路径。
- Flutter SDK path请选择 Flutter SDK 根目录。
- 项目名称和路径请设置为小写英文字母,且用下划线分割开。
-
设置包名,单击Finish。
如果您的应用计划上架商店,建议一开始的时候把这个全网唯一的包名设置好,因为应用上架之后就不能再修改了。
-
打开 Xcode,从菜单栏中选择File > New > Project。
-
在弹出的Choose a template for your new project窗口中,选择Flutter,单击Next。
-
填写项目名称、组织名称和组织标识符,选择项目存储位置,并选择所需的语言和界面,单击Next。
项目名称和路径请设置为小写英文字母,且用下划线分割开。
-
选择 Flutter SDK 的路径,并选择所需的项目文件夹。
步骤2: 导入 SDK
NERTC Flutter SDK 已正式发布到 pub.dev ,您可以在 pub 库中查询最新版本,通过配置 pubspec.yaml
自动下载更新。
在项目的 pubspec.yaml
文件中添加以下依赖项:
environment:
sdk: ">=2.12.0 <3.0.0"
# 依赖项
dependencies:
flutter:
sdk: flutter
# NERTC Flutter SDK 依赖项
nertc_core: ^4.6.52-rc.0
cupertino_icons: ^1.0.3
# 权限处理插件依赖项
permission_handler: ^10.2.0
示例代码中的版本号为举例,请替换为最新的版本号。
从4.6.52版本开始,名称从 nertc 改为 nertc_core。
步骤3: 添加权限
通过 Flutter SDK 实现音视频通话之前,需要开通摄像头和麦克风的使用权限,以开启视频和语音通话功能。
- 打开
app/src/main/AndroidManifest.xml
文件,添加必要的设备权限。
例如:
java//网络相关
<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.CHANGE_WIFI_STATE"/>
//防止通话过程中锁屏
<uses-permission android:name="android.permission.WAKE_LOCK"/>
//视频权限
<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.BLUETOOTH"/>
//蓝牙连接权限,此权限还需在运行应用时动态申请,否则 Android 12 及以上的设备蓝牙无法正常工作
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
//外置存储卡写入权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
//蓝牙 startBluetoothSco 会用到此权限
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
// V5.4.0及之后版本需要,更改设备的网络状态,如打开或关闭网络连接、更改网络类型等。
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
//获取设备信息
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
//允许应用程序使用camera硬件资源
<uses-feature android:name="android.hardware.camera"/>
//自动对焦
<uses-feature android:name="android.hardware.camera.autofocus"/>
//如果 Android targetSdkVersion 大于等于 31,需要添加以下标签,否则虚拟背景功能无法使用
<application>
<uses-native-library android:name="libOpenCL.so" android:required="false"/>
</application>
......//APP需要的其他设备权限
权限说明如下表所示。
必要性 | 获取的权限 | 使用目的 |
---|---|---|
必要权限 | 访问网络权限(INTERNET) | SDK 基本功能都需要在联网的情况下才可以使用 |
网络连接状态(ACCESS_NETWORK_STATE) | 判断网络连接状态及网络是否可用 | |
Wifi网络状态(ACCESS_WIFI_STATE和CHANGE_WIFI_STATE) | 判断网络连接状态及网络是否可用 | |
摄像头(CAMERA和camera.autofocus) | 视频通话时,用于采集视频画面 | |
麦克风(RECORD_AUDIO) | 音视频通话时,用于采集声音 | |
修改音频设置(MODIFY_AUDIO_SETTINGS) | 修改音频设备配置时需要使用该权限 | |
非必要权限 | 设备存储(WRITE_EXTERNAL_STORAGE) | 存储 SDK 配置文件和日志文件 |
设备存储(READ_EXTERNAL_STORAGE) | 读取 SDK 配置文件和日志文件 | |
蓝牙(BLUETOOTH和BLUETOOTH_CONNECT) | 连接蓝牙耳机和耳麦时需要该权限
|
|
WAKE_LOCK | 防止通话过程中锁屏 | |
设备信息(READ_PHONE_STATE) | SDK 需要监听电话的打断,在电话呼入时,停止音频的采集,电话结束时,恢复音频采集 | |
更改设备的网络状态(CHANGE_NETWORK_STATE) | SDK 操作多网卡 |
Android 6.0 及以上版本要求部分重要权限必须申请动态权限,不能只通过 AndroidMainfest.xml
文件申请静态权限。请自行在 pub 上寻找第三方 Flutter 插件来实现动态权限,或者参考如下示例代码。
final permissions = [Permission.camera, Permission.microphone];
if (Platform.isAndroid) {
permissions.add(Permission.storage);
}
List<Permission> missed = [];
for (var permission in permissions) {
PermissionStatus status = await permission.status;
if (status != PermissionStatus.granted) {
missed.add(permission);
}
}
bool allGranted = missed.isEmpty;
if (!allGranted) {
List<Permission> showRationale = [];
for (var permission in missed) {
bool isShown = await permission.shouldShowRequestRationale;
if (isShown) {
showRationale.add(permission);
}
}
if (showRationale.isNotEmpty) {
ConfirmAction? action = await showDialog<ConfirmAction>(
context: context,
builder: (BuildContext context) {
return AlertDialog(
content: const Text('You need to allow some permissions'),
actions: <Widget>[
TextButton(
child: const Text('Cancel'),
onPressed: () {
Navigator.of(context).pop(ConfirmAction.CANCEL);
},
),
TextButton(
child: const Text('Accept'),
onPressed: () {
Navigator.of(context).pop(ConfirmAction.ACCEPT);
},
)
],
);
});
if (action == ConfirmAction.ACCEPT) {
Map<Permission, PermissionStatus> allStatus = await missed.request();
allGranted = true;
for (var status in allStatus.values) {
if (status != PermissionStatus.granted) {
allGranted = false;
}
}
}
} else {
Map<Permission, PermissionStatus> allStatus = await missed.request();
allGranted = true;
for (var status in allStatus.values) {
if (status != PermissionStatus.granted) {
allGranted = false;
}
}
}
}
:::
请给 App 授权麦克风、摄像头和 Wi-Fi 的使用权限。
编辑 info.plist
文件,添加以下三项。
- Privacy - Microphone Usage Description,并填入麦克风使用目的提示语。
- Privacy - Camera Usage Description,并填入摄像头使用目的提示语。
- Application uses Wi-Fi,设置为 YES。
如果使用 Platform View,并且 Flutter 版本低于 1.22,请在 Info > Custom iOS Target Properties 中,增加字段 io.flutter.embedded_views_preview
,并设置 Value 为 YES。
:::
步骤4:配置防代码混淆(仅 Android 端)
代码混淆是指使用简短无意义的名称重命名类、方法、属性等,增加逆向工程的难度,保障 Android 程序源码的安全性。为了避免因重命名类,导致调用 NERTC SDK 异常,您需要配置防代码混淆。
在 /example/android/app
目录下的 proguard-rules.pro
文件中,为 NERTC SDK 添加 -keep 类的配置,可以防止混淆 NERTC SDK 公共类名称。
-keep class com.netease.lava.** {*;}
-keep class com.netease.yunxin.** {*;}