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

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

2024-05-23 03:54:12作者:翟江哲Frasier

Android WebRTC Video Chat App

好消息! 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 打电话

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

现在我们已经处理了接听电话,让我们编写代码拨打电话。你需要一个EditText和一个Button,模板已经提供。当你按下按钮时,会触发makeCall方法,向对方发送JSON消息,表示你想进行聊天。

public void makeCall(View view){
    String callNum = mCallNumET.getText().toString();
    if (callNum.isEmpty() || callNum.equals(this.username)) {
        Toast.makeText(this, "请输入一个有效的用户名")

至此,我们完成了接收和拨打视频电话的基本功能。在实际应用中,你可以在此基础上进一步完善界面设计,增加更多的功能,如拒绝来电、显示联系人列表等。由于篇幅所限,更多高级特性请参阅源代码和官方文档。

项目特点:

  1. 易于集成 - PubNub提供官方Android WebRTC信号API,只需几步就能快速搭建视频通话应用。
  2. 跨平台兼容性 - 与PubNub JavaScript WebRTC SDK无缝对接,轻松实现iOS和Android之间的视频通话。
  3. 强大的信令支持 - PubNub不仅提供信令服务,还能帮助管理诸如文本聊天、用户状态等多种应用场景。
  4. 可扩展性 - 源代码结构清晰,易于自定义和扩展,满足不同需求的视频通话体验。

不要犹豫,立即行动,用这个开源项目开启你的Android WebRTC视频通话之旅吧!

登录后查看全文
热门项目推荐

热门内容推荐

最新内容推荐

项目优选

收起
openHiTLS-examplesopenHiTLS-examples
本仓将为广大高校开发者提供开源实践和创新开发平台,收集和展示openHiTLS示例代码及创新应用,欢迎大家投稿,让全世界看到您的精巧密码实现设计,也让更多人通过您的优秀成果,理解、喜爱上密码技术。
C
47
248
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
346
381
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
871
516
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
179
263
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
131
184
kernelkernel
deepin linux kernel
C
22
5
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
7
0
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
335
1.09 K
harmony-utilsharmony-utils
harmony-utils 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类,致力于助力开发者迅速构建鸿蒙应用。其封装的工具涵盖了APP、设备、屏幕、授权、通知、线程间通信、弹框、吐司、生物认证、用户首选项、拍照、相册、扫码、文件、日志,异常捕获、字符、字符串、数字、集合、日期、随机、base64、加密、解密、JSON等一系列的功能和操作,能够满足各种不同的开发需求。
ArkTS
31
0
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.08 K
0