使用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
类,存储几个静态最终变量ChatMessages
ADT,用于用户消息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视频通话之旅吧!
- DDeepSeek-V3.1-BaseDeepSeek-V3.1 是一款支持思考模式与非思考模式的混合模型Python00
- QQwen-Image-Edit基于200亿参数Qwen-Image构建,Qwen-Image-Edit实现精准文本渲染与图像编辑,融合语义与外观控制能力Jinja00
GitCode-文心大模型-智源研究院AI应用开发大赛
GitCode&文心大模型&智源研究院强强联合,发起的AI应用开发大赛;总奖池8W,单人最高可得价值3W奖励。快来参加吧~057CommonUtilLibrary
快速开发工具类收集,史上最全的开发工具类,欢迎Follow、Fork、StarJava04GitCode百大开源项目
GitCode百大计划旨在表彰GitCode平台上积极推动项目社区化,拥有广泛影响力的G-Star项目,入选项目不仅代表了GitCode开源生态的蓬勃发展,也反映了当下开源行业的发展趋势。07GOT-OCR-2.0-hf
阶跃星辰StepFun推出的GOT-OCR-2.0-hf是一款强大的多语言OCR开源模型,支持从普通文档到复杂场景的文字识别。它能精准处理表格、图表、数学公式、几何图形甚至乐谱等特殊内容,输出结果可通过第三方工具渲染成多种格式。模型支持1024×1024高分辨率输入,具备多页批量处理、动态分块识别和交互式区域选择等创新功能,用户可通过坐标或颜色指定识别区域。基于Apache 2.0协议开源,提供Hugging Face演示和完整代码,适用于学术研究到工业应用的广泛场景,为OCR领域带来突破性解决方案。00openHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!C0381- WWan2.2-S2V-14B【Wan2.2 全新发布|更强画质,更快生成】新一代视频生成模型 Wan2.2,创新采用MoE架构,实现电影级美学与复杂运动控制,支持720P高清文本/图像生成视频,消费级显卡即可流畅运行,性能达业界领先水平Python00
- GGLM-4.5-AirGLM-4.5 系列模型是专为智能体设计的基础模型。GLM-4.5拥有 3550 亿总参数量,其中 320 亿活跃参数;GLM-4.5-Air采用更紧凑的设计,拥有 1060 亿总参数量,其中 120 亿活跃参数。GLM-4.5模型统一了推理、编码和智能体能力,以满足智能体应用的复杂需求Jinja00
Yi-Coder
Yi Coder 编程模型,小而强大的编程助手HTML013
热门内容推荐
最新内容推荐
项目优选









