使用Android WebRTC视频通话应用,实现跨平台通信的快捷方式

好消息! PubNub现已提供官方的Android WebRTC信号API,这意味着在Android上创建视频通话应用程序变得轻而易举,并且与PubNub JavaScript WebRTC SDK完全兼容。只需几分钟的时间,您就可以构建自己的跨平台视频通话应用。
注意: 此示例使用PubNub的Android WebRTC SDK进行信令以传输元数据并建立点对点连接。一旦连接建立,视频和语音将通过公共Google STUN/TURN服务器进行流传输。
记住,PubNub提供了WebRTC的信令服务,但需要与托管的WebRTC解决方案相结合。要了解更多关于PubNub在WebRTC中扮演的角色以及它不提供的服务,请查阅这篇文章:Does PubNub Provide WebRTC and Video Chat?
为什么选择PubNub?—— 信令的力量
WebRTC本身不是一个独立的API,它需要一个信号服务来协调通信。在两个参与者之间建立连接之前,需要交换一些按会话描述协议(SDP)编码的元数据,包括:
- 用于打开和关闭连接的会话控制消息
- 错误消息
- 编解码器/编解码器设置、带宽和媒体类型
- 安全连接建立所需的密钥
- 主机IP地址和端口等网络数据
PubNub使这种信令变得简单,并为您提供扩展WebRTC应用程序的强大功能。
开始使用
您可以参考官方文档来了解PnWebRTC。
这里有一个GitHub仓库,其中包含了我们即将构建的应用程序的骨架。建议您下载或将其克隆到本地,并在开始新项目时参考。我在Android Studio中创建了这个项目,因此教程也将基于此工具。不过,对于使用Eclipse或其他IDE的开发者来说,步骤应该大致相似。
应用模板
应用模板包含以下部分:
- 已设置依赖项和权限(注释掉)
LoginActivity,用于创建用户名MainActivity,监听和发起通话Constants类,存储几个静态最终变量ChatMessagesADT,用于用户消息ChatAdapter,将用户消息放入ListView- 相应的布局和菜单XML文件
从GitHub克隆或fork该仓库后导入Android Studio即可开始。
创建自己的应用
如果你想要从头开始创建自己的应用,首先按照本指南的第一步设置权限和依赖。至少,你应该阅读其他步骤,看看如何使用PubNub对象处理通话前的事件。
第一步:权限和依赖项
显然,PubNub-WebRTC应用程序会使用互联网、摄像头和一些其他功能。我们必须先为应用授予这些功能的权限。打开AndroidManifest.xml并在<manifest>标签之后,<application>标签之前添加以下行:
<!-- WebRTC Dependencies -->
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<!-- PubNub Dependencies -->
<!--<uses-permission android:name="android.permission.INTERNET" />-->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="your.package.name.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="your.package.name.permission.C2D_MESSAGE" />
然后,在你的app的build.gradle中添加以下依赖:
dependencies {
...
compile 'io.pristine:libjingle:9694@aar'
compile 'com.pubnub:pubnub-android:3.7.4'
compile 'me.kevingleason:pnwebrtc:1.0.6@aar'
}
同步Gradle文件,现在你应该已经有了Pristine的WebRTC库、Pubnub Android SDK和PnWebRTC信令API。
完美!现在我们准备好编写代码来实现视频通话应用。
第二步:呼叫前的信令与PubNub
为了开始实现视频通话,你需要获取发布和订阅密钥。首先在PubNub注册获取账号。注册后,你可以在PubNub开发者仪表盘找到你的唯一PubNub密钥。免费的Sandbox层应该为你构建和测试WebRTC应用提供足够的带宽。
PnWebRTC API用于将用户与WebRTC PeerConnection连接起来。然而,重要的是要考虑其他功能的信令,比如视频通话之外的文字聊天、用户状态或者拒接来电。
2.1 配置常量
这类信令应在单独的PubNub对象上完成,并在一个不同的频道上进行,以免SDP消息导致应用程序崩溃。我建议保留一个像-stdby这样的后缀作为您的用户的备用频道。在util/Constants.java文件中创建一个 Pub/Sub 密钥和备用后缀,以及一个用于存储用户名的键和JSON通话用户键,这将在我们拨打或接听电话时使用。
// Constants.java
public class Constants {
public static final String STDBY_SUFFIX = "-stdby";
public static final String PUB_KEY = "demo"; // 使用你的 Pub Key
public static final String SUB_KEY = "demo"; // 使用你的 Sub Key
public static final String USER_NAME = "user_name";
public static final String JSON_CALL_USER = "call_user";
...
}
这些值将在整个应用中使用,所以最好将其作为静态最终变量存储。你也可以将它们放在strings.xml中,但这需要更多的代码来访问它们。
2.2 初始化PubNub
接下来,我们将创建一个初始化PubNub的方法。在MainActivity中,首先声明一个Pubnub实例变量。然后,在onCreate方法末尾调用initPubNub()。
public class MainActivity extends Activity {
private Pubnub mPubNub;
...
public void initPubNub() {
String stdbyChannel = this.username + Constants.STDBY_SUFFIX;
this.mPubNub = new Pubnub(Constants.PUB_KEY, Constants.SUB_KEY);
this.mPubNub.setUUID(this.username);
try {
this.mPubNub.subscribe(stdbyChannel, new Callback() {
@Override
public void successCallback(String channel, Object message) {
Log.d("MA-success", "MESSAGE: " + message.toString());
if (!(message instanceof JSONObject)) return; // 忽略非JSONObject
JSONObject jsonMsg = (JSONObject) message;
try {
if (!jsonMsg.has(Constants.JSON_CALL_USER)) return;
String user = jsonMsg.getString(Constants.JSON_CALL_USER);
// 考虑接受/拒绝通话
Intent intent = new Intent(MainActivity.this, VideoChatActivity.class);
intent.putExtra(Constants.USER_NAME, username);
intent.putExtra(Constants.JSON_CALL_USER, user);
startActivity(intent);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
} catch (PubnubException e) {
e.printStackTrace();
}
}
...
}
这个函数将你订阅到用户名的备用频道。当收到消息时,它提取出JSON_CALL_USER字段,即call_user。在这个演示中,只要你在intent中提供user_name,它就会尝试自动将你连接到那个用户。你可以看到我们将用户转向VideoChatActivity,我们将在第三部分实现这一部分。
2.3 打电话
现在我们已经处理了接听电话,让我们编写代码拨打电话。你需要一个EditText和一个Button,模板已经提供。当你按下按钮时,会触发makeCall方法,向对方发送JSON消息,表示你想进行聊天。
public void makeCall(View view){
String callNum = mCallNumET.getText().toString();
if (callNum.isEmpty() || callNum.equals(this.username)) {
Toast.makeText(this, "请输入一个有效的用户名")
至此,我们完成了接收和拨打视频电话的基本功能。在实际应用中,你可以在此基础上进一步完善界面设计,增加更多的功能,如拒绝来电、显示联系人列表等。由于篇幅所限,更多高级特性请参阅源代码和官方文档。
项目特点:
- 易于集成 - PubNub提供官方Android WebRTC信号API,只需几步就能快速搭建视频通话应用。
- 跨平台兼容性 - 与PubNub JavaScript WebRTC SDK无缝对接,轻松实现iOS和Android之间的视频通话。
- 强大的信令支持 - PubNub不仅提供信令服务,还能帮助管理诸如文本聊天、用户状态等多种应用场景。
- 可扩展性 - 源代码结构清晰,易于自定义和扩展,满足不同需求的视频通话体验。
不要犹豫,立即行动,用这个开源项目开启你的Android WebRTC视频通话之旅吧!
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust098- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
MiMo-V2.5-ProMiMo-V2.5-Pro作为旗舰模型,擅⻓处理复杂Agent任务,单次任务可完成近千次⼯具调⽤与⼗余轮上 下⽂压缩。Python00
GLM-5.1GLM-5.1是智谱迄今最智能的旗舰模型,也是目前全球最强的开源模型。GLM-5.1大大提高了代码能力,在完成长程任务方面提升尤为显著。和此前分钟级交互的模型不同,它能够在一次任务中独立、持续工作超过8小时,期间自主规划、执行、自我进化,最终交付完整的工程级成果。Jinja00
Kimi-K2.6Kimi K2.6 是一款开源的原生多模态智能体模型,在长程编码、编码驱动设计、主动自主执行以及群体任务编排等实用能力方面实现了显著提升。Python00
MiniMax-M2.7MiniMax-M2.7 是我们首个深度参与自身进化过程的模型。M2.7 具备构建复杂智能体应用框架的能力,能够借助智能体团队、复杂技能以及动态工具搜索,完成高度精细的生产力任务。Python00