最近项目中用到语音与视频通话,在网上找了一款名为Linphone的开源app软件(基于android系统),经过一段时间的研究与学习,总算实现了语音/视频通话功能,在此和各位分享一下我的心得。

LinphoneLauncherActivity 是该APP的主入口,在这个Activity组件中,它会启动LinphoneService这个后台服务,然后判断这个后台服务程序是否启动完毕,直到启动完毕后,才让APP进入总的功能组件LinphoneActivity。

LinphoneActivity是整个APP的核心界面组件,它采用了容器的结构模式来组织它所要包含的各个Fragment。它维护了一个专门用于存放各个Fragment实例的Fragment列表。它采用的布局文件是main.xml。这个布局文件主要是分为上下两个部分,然后上边部分主要是菜单与状态栏,下边那部分再分为两大个部分,一个部分是Fragment的容器,另一个部分是代表功能模块的TAB形式的工具栏。LinphoneActivity也会生成一个LinphoneCoreListenerBase的实例并注册到LinphoneCore这个核心实例的事件监听器中,它监听的事件是messageReceived,registrationState,callState。当有电话呼入的时候,这个时间当前的组件也会接收到这个事件,然后将界面切换到CallIncomingActivity这个界面组件。

CallIncomingActivity界面组件就是提供一个界面给用户选择接听还是挂断,并设置相关的接听参数。这个界面组件当中也生成一个LinphoneCoreListenerBase的实例并注册到LinphoneCore这个核心实例的事件监听器中,它监听的事件是callState,状态是State.CallEnd,这样在对方结束了电话呼入时好通知当前界面对方已经结束通话,不再呼入,那个APP应该结束当前界面,回到主界面状态。在CallIncomingActivity界面组件下,用户选择了接听电话,那么APP将切换到CallActivity这个界面组件下,同时判断当前用户是否接受视频电话,从而决定是视频通话,还是语音通话。

CallActivity这个界面组件是通话界面,这个界面组件当中也生成一个LinphoneCoreListenerBase的实例并注册到LinphoneCore这个核心实例的事件监听器中,它监听的事件是callState,callEncryptionChanged。callState会通知新的来电呼入,对方暂停通话,对方更新通话设置等相应的事件消息,发便当前界面针对这些消息作出相应的反馈。这个通话界面主要是控制两个Fragment的动态切换,一个是语音通话的CallAudioFragment,在这个Fragment里,用户可以启用不启用麦克风和摄像头等。同时还可以向新的用户发起电话呼叫,不过从目前的界面看是只允许当前用户向某一个用户进行通话的,如果再邀请一个用户进入通话的话,它是把上一个通话的用户设置为暂停通话状态,然后当前用户与多个用户通话的话,就是不断地切换当前通话的用户。另一个是视频通话的CallVideoFragment,这个Fragment主要是展现两个视频流的窗口,一个是当前用户自己的视频在界面的右下角,另一个是通话对方的视频。默认是展现CallVideoFragment,当用户点击CallVideoFragment这个界面的时候,又切换回CallAudioFragment,这样用户才能看到功能栏方便操作。

CallVideoFragment里有两个关键的SurfaceView,分别用户展现当前用户的视频和对方用户的视频。private SurfaceView mVideoView; 这个是对方用户的视频展现控件。private SurfaceView mCaptureView;这个是当前用户的视频展现控件。首先CallVideoFragment 会生成一个androidVideoWindowImpl的实例,这个实例再通过LinphoneManager.getLc().setVideoWindow(androidVideoWindowImpl)传入到linphone的核心当中,androidVideoWindowImpl的实例当中的相关事件监听器后续就能接收到内核的想着事件消息通知,从而将视频流传递到对应的SurfaceView当中,设置对方用户视频流到SurfaceView 当中的方法是LinphoneManager.getLc().setVideoWindow(vw),设置当前用户视频流到SurfaceView 当中的方法是LinphoneManager.getLc().setPreviewWindow(mCaptureView)。

DialerFragment界面组件,提供一个拨号的键盘,用来输入需要呼叫的SIP号码,然后进行呼叫。拨号呼叫调用的是LinphoneManager.getInstance().newOutgoingCall(mAddress)这个方法,传递的参数是对方的SIP号码或是SIP地址。newOutgoingCall这个方法里会先对当前使用的网络类型进行检测,用的是LinphoneUtils.isHighBandwidthConnection()方法。然后最终调用CallManager.inviteAddress()方法进行呼叫,这个方法最终又调用的    LinphoneCore.inviteAddressWithParams(lAddress, params)方法进行呼叫。当LinphoneActivity 订阅的callState事件的state == State.OutgoingInit || state == State.OutgoingProgress的时候,APP界面组件切换到CallOutgoingActivity,由这个界面来展现正在呼出的状态。

CallOutgoingActivity这个界面组件,当中也生成一个LinphoneCoreListenerBase的实例并注册到LinphoneCore这个核心实例的事件监听器中,它监听的事件是callState,状态是State=Connected或是StreamsRunning的时候,说明对方接听成功,界面组件再切换回CallActivity,并显示是语音通话界面还是视频通话界面。

CallManager是专门用来进行电话呼叫的管理者类,专门负责对进行呼叫,或是对当前进行的呼叫进行参数设置的更新。

在对Linphone客户端源码的研究过程中,收获了很多很多。对于正在从事android开发或者想要学习安卓开发的各位朋友,Linphone都是一个很好的学习工具,尤其是界面的布局、监听器的使用、app工程的结构、以及代码的书写风格。由于时间较短,Linphone剩余的功能没有仔细去熟悉,希望各位去细细品味,体会个中细节,定会有意想不到的收获。

互勉之!

linphone android中文,Linphone(安卓) 客户端APP语音视频通话流程解读相关推荐

  1. 基于安卓Android手机微博系统客户端app

    本Android微博平台app包含有手机端(客户端)和电脑端(服务端),服务端开发环境是eclipse,客户端开发环境是Android eclipse ADT. 这个毕业设计题目不同于其他的题目,其他 ...

  2. android 小视频 应用,心意短视频安卓,心意短视频安卓客户端app软件预约 v1.0-手游汇...

    心意短视频安卓是一款非常有趣的线上看视屏社交服务软件,全网最新最全的优质视频资源为你及时的推送,手机线上随时操作,根据你的需要,随时点播超您方便,各种最新的搞笑视频,最新的段子热梗不断的更新,挑战你的 ...

  3. 共享单车安卓客户端app设计

    目录 碎片(Fragment) 百度地图API 使用百度地图定位并显示位置 首先展示一下最终的成品效果吧,首先是登陆界面: 然后是地图显示界面(A表示自身位置,B表示自行车位置): 此外还有密码修改界 ...

  4. 用android实现GB28181监控客户端app

    武汉一直笼罩在新冠状病毒的疫情中,我不喜欢在朋友圈拿疫情去炒作,但我知道,如果真的智能AI智能识别,智能机器人,自动驾驶,远程分级诊疗等热门技术如果只要有一样能够落地能够应用,武汉的疫情不会如此被动. ...

  5. 毕业设计——家校互动系统后台+安卓客户端app分享

    给大家分享一个毕业设计哈,虽然代码写的思路可能有些混乱,不过功能还是很丰富,文档也很齐全.希望对初学者们有些帮助. 这个作品是基于Android系统的家校互动系统的设计与实现,不仅有Android家长 ...

  6. 基于android的手机微博客户端app

    回到当今,在互联网的基础上促进人类沟通的大功臣要属日渐成熟地.多样的,各类聊天类.社交类.新闻类的app了.在国外的FaceBook的兴起,受到当地人强烈的追捧,因此,在国内,出现了微博.微博的意思就 ...

  7. Linphone android去电增加自定义SIP消息头的流程分析

    一.首先看一下如何在发起去电的sip请求中添加自定义的消息头 增加自定义头消息发方法,so已经提供了native方法, 发起呼叫的示例如下: LinphoneCallParams params = l ...

  8. android 评测软件,安卓评测app下载 安卓评测软件 for Android v8.4.3 安卓版 下载-脚本之家...

    安卓评测是安卓优化大师特别为android手机量身打造的一款性能评测应用软件.多项测试完整反映android的手机性能,三大模块让您对设备的更加了解.在安卓评测中您不仅能够与各机型一争高下,更可以获知 ...

  9. java基于Android的天文观星系统APP

    基于Android的天文观星系统为用户提供在线天文圈服务,系统包括安卓端和后台. 安卓单用户可以先进行注册,填写个人的基本信息提交到服务器,服务器把数据保存到数据库.管理员对会员的信息进行验证后,会员 ...

最新文章

  1. Lab模式的妙用--人像处理
  2. Java中常量定义的几种方式
  3. VC模仿超炫QQ界面的实现
  4. Testing Windows Live Writer 2
  5. Chrome浏览器和百度搜索引擎兼容度不佳
  6. SecureCRT 中 python 命令行使用退格键(backspace)出现 ^H 解决办法
  7. 数字图像处理学习笔记(二):SIFT(尺度不变特征变换)算法
  8. 合作开发过程产生的专利_合作开发合同(二)
  9. Redis集群部署(半自动)
  10. FreeBSD 恢复root密码-FreeBSD 5 或都之后版本.
  11. android判断是否被点击方法,android 中有没有判断imageview是否以被单击的函数方法?...
  12. C语言指令启动mcs51计时器是,单片机原理及应用-中国大学mooc-题库零氪
  13. MYSQL 取上一条记录,与下一条记录
  14. c#迁移文件的时候提示:对路径xxx的访问被拒绝
  15. vuejs --- 子组件向父组件传值(子传父)
  16. 思考-IT行业设备分销代理商的运营模式
  17. php7 memcached sasl,memcached sasl
  18. Day5.牛客网剑指offer 67题之43-54题(java代码)
  19. 爬取图片-工作常用小工具01
  20. oracle ppt讲义,oracle课件.ppt

热门文章

  1. 【软件评测师】基础理论篇:1 软件测试概述
  2. Elasticsearch day1
  3. 131、基于51单片机智能电子秤HX711仿真设计
  4. 自动驾驶算法详解(3): LQR算法进行轨迹跟踪,lqr_speed_steering_control( )的python实现
  5. 性能测试-关于阿里云PTS使用与思考
  6. 机器学习中的数学——点估计(四):最大后验估计(Maximum Posteriori Probability,MAP)
  7. 磁盘分区4K未对齐的解决方案
  8. 最全overleaf在线编辑数学公式以及遇到错误的解决方法!
  9. 企业如何利用数据库加速AI之旅
  10. 浏览器开发者工具基本使用教程