Android 原生接入 RTC
原生 Android SDK 使用设备上的 WebRTC 采集和渲染。你的 Activity 负责布局、按钮和系统授权;SDK 负责房间、媒体和状态。先用 viewer 票据完成只看入会,再给需要发布的成员签发相应能力票据。
flowchart LR
A["Activity 创建 SDK"] --> B["joinWithAccessTicket"]
B --> C["onJoined / onError"]
C --> D["远端轨道绑定 Renderer"]
D --> E["leave → close"]
接入同批依赖
使用交付的 AAR 或源码 :sdk 模块,并保留该包声明的 WebRTC、OkHttp 与原生依赖。不要只复制 AAR 然后删除依赖,也不要同时引入另一套不同版本的 WebRTC 库。当前 SDK 最低 Android API 26;Manifest 与运行时都要提供实际使用的相机、麦克风权限。
若以交付 AAR 接入,Gradle 还需与本次 SDK 构建匹配的外部依赖;当前源码使用:
dependencies {
implementation(files("libs/AKStreamRtcSDK.aar"))
implementation("io.github.webrtc-sdk:android:144.7559.09")
implementation("com.squareup.okhttp3:okhttp:5.3.0")
}
使用源码 :sdk 模块时由模块声明这些依赖。下一批交付若升级依赖版本,应以那批 AAR 的说明为准,不把本例当作永久固定版本。
SDK 创建方式:
TransformSurfaceViewRenderer localView = new TransformSurfaceViewRenderer(this);
AkNativeRtcClient client = new AkNativeRtcClient(this, localView, listener);
client.setInitialMediaEnabled(false, false);
client.joinWithAccessTicket(serverUrl, roomId, accessTicket, passcode);
这段代码位于 Activity,listener 是宿主实现的 AkNativeRtcClient.Listener,入会信息来自业务后端。调用返回只表示已发起入会;以 onJoined、onError、媒体状态回调判断结果。SDK 已初始化本地渲染器,宿主不要再次 init()。
最少处理 onJoined、onRemoteVideo、onRemoteVideoRemoved、onError 和 onLeft;界面状态还要处理 onLocalMediaState 与 onMediaPermissionChanged。这些回调可能不在 UI 线程,更新 Android 视图时切回主线程。先看到远端真实帧并听到远端声音,再测试本机发布。
| 回调/结果 | Activity 应做什么 | 不应误判成什么 |
|---|---|---|
onJoined(participantId) |
记录当前成员身份,展示会议页 | 远端媒体一定已经到达 |
onRemoteVideo(publicationId, track) |
为该路创建 Renderer,绑定 track | 同名成员的所有发布都可共用一个视图 |
onLocalMediaState(mic,camera) |
更新真实麦克风/相机按钮 | 点击按钮就等于启停成功 |
onMediaPermissionChanged(kind,allowed) |
解释主持限制,禁止无效操作 | 主持解禁会自动打开设备 |
onContinuousRecordingChanged(recording) |
显示当前录制状态或空状态 | 返回 Stopping 就已经有可下载文件 |
onHttpError(error) |
保留状态码,401 重新取票、403 显示权限 | 无限自动重试旧票据 |
画面、声音和生命周期
远端 onRemoteVideo(publicationId, VideoTrack) 到达时,为这一路建立渲染视图并绑定轨道;onRemoteVideoRemoved 只移除对应发布。切换麦克风、相机或输出设备时用 SDK 返回的真实设备 ID,最后以状态回调确定是否生效。
屏幕共享依赖系统 MediaProjection 授权和前台服务;宿主按 SDK 控制器要求转交 Activity 生命周期与授权结果。选择附件等外部 Activity 期间应保留会议状态。正常离会调用 leave(),最终销毁调用 close(),不能只移除页面上的 video 控件。
后台恢复时分别核对成员是否仍在线、本机发送帧和接收端解码帧。某些 Android 设备可能限制后台相机或麦克风;前台服务和悬浮小窗出现,不代表媒体一定持续发送。用第二台设备看画面和听声音,必要时记录采集/发送统计。
onContinuousRecordingChanged 通知录制状态,主持人可调用 startContinuousRecording(RoomCallback) 与 stopContinuousRecording(recordingId, RoomCallback);普通成员用 getContinuousRecording(RoomCallback) 查询。SDK 只给出数据,录制和回放按钮由宿主实现。这些接口已进入 匹配目标版本 对应源码和发布包,安装旧 APK 不会自动具备。全部公开函数的入参、回调和特殊情况见Android 函数参考。
完整依赖版本、线程与系统授权细节以交付包内 Android SDK README 和实际 AAR 为准。上线前按端侧验收清单安装真机包验证。
如果 App 一直显示重连,先确认配置的服务器地址是手机可到达的 HTTPS 地址,而不是开发电脑自己的 127.0.0.1;再分别检查证书、房间票据、WebSocket 和媒体端口。安装被系统取消应先解决安装确认,不能把旧安装包的行为当作新 SDK 的结果。