Linphone 库的应用 (二)

来源:互联网 发布:苹果手机频谱分析软件 编辑:程序博客网 时间:2024/06/01 19:34


  上篇中已经将linphone sdk 引入到自己的项目中并成功编译通过,下面就是代码的阅读和应用了。linphone的demo app 做得很完善,而且音视频通话部分大多也是应用封装得库方法,所以demo中的很多方法是可以拿来直接用的(仅供学习啦。如果商用,还是原创比较好,嘿嘿~~)

 下面记录一下我在自己的项目中借鉴linphone demo的过程和经验:

做音视频通话这部分,主要用到的linphone-iPhone的文件有以下几个:

如上图所示,将这几个文件复制到本地项目的目录下,然后从Xcode中添加进来。因为主要的库应用是linphonecore,所以在要进行操作的类中只要用到库的地方都要加一句#import"linphone/linphonecore.h".

为了能让应用在启动时就为通话进行一些设置,需要在项目的appdelagate.h 和appdelegate.m中进行某些方法的扩充。除了头文件的引入,再就是在application:didFinishLaunchingWithOptions:中加入以下代码,启动这个库的应用。

//开启linphone服务

[[LinphoneManagerinstance]startLibLinphone];


然后就是具体的实现主叫和应答了

linphone-iphone中关于通话的有几个类:PhoneMainView,这个类似与自己项目中的TelephoneViewController类,从该类中调用是主叫还是被叫的界面及应用。

主叫部分:

该部分真正实现功能的代码并不复杂,归根结底还是调用linphone中的库的方法,只需自己完成跳转和关联即可。最根本的功能实现放在TelephoneViewController.m的实现函数turnToIPCallView:中。由于目前仅供测试使用,主叫仍然使用的是sip服务器,格式也是写的固定的已注册过的linphone账号,被叫也是写成的固定的账号:

[selfaddProxyConfig:@"beryl"password:@"123456"domain:@"sip.linphone.org"];

    

   if (textTemp.length >0) {

       ABRecordRef contact = [[[LinphoneManagerinstance]fastAddressBook]getContact:textTemp];

       if (contact) {

            displayName = [FastAddressBookgetContactDisplayName:(__bridgeABRecordRef)(textTemp)];

        }

        [[LinphoneManagerinstance]call:@"mydownload2009"displayName:displayNametransfer:FALSE];

        

    }


以上这段代码就是为临时测试自己项目中引用的linphone库是否能够成功设置的。可见两个固定的账号。首句那个方法就是初始化的主叫的账号并在方法内部进行了设置,其中引用的其他函数也要在TelephoneViewController.m中进行定义(都可以在PhoneMainView中找到)。

这样主叫的部分功能就可以简单的实现了。在一台真机上用自己的应用可以发出呼叫,即可将呼叫通知发给另一台真机上并启动linphone-app的incomingCall,接通后即可通话。

被叫部分:

 被叫部分的实现主要涉及两个controller之间的关联,即TelephoneViewController和IncomingCallViewController

首先在TelephoneViewController.m的viewDidLoad方法中加入下面的代码,实现呼叫的通知:

 [[NSNotificationCenterdefaultCenter]addObserver:self

                                            selector:@selector(callUpdate:)

                                                name:kLinphoneCallUpdate

                                              object:nil];

然后在该类中加入callUpdate的方法定义和实现。该方法主要是实现对call的状态的判断和相应的处理,这里暂时关注LinphoneCallIncomingReceived的状态,即在switch函数中:

case LinphoneCallIncomingReceived:

        {

            [selfdisplayIncomingCall:call];

        }

上面调用的displayIncomingCall方法即是在TelephoneViewController中处理来电时的相应逻辑和界面跳转的。该方法的具体实现也是写在该类中。因为要调来电的界面,所以先要实例化一个incomingCallViewController:

IncomingCallViewController* incomingCallViewController = [[IncomingCallViewControlleralloc]init];

            

            AudioServicesPlaySystemSound([LinphoneManagerinstance].sounds.vibrate);

           if(incomingCallViewController !=nil) {

                [incomingCallViewControllersetCall:call];

                [incomingCallViewControllersetDelegate:self];

//                [self.navigationController pushViewController:incomingCallViewController animated:YES];


上面这段代码都是display方法中的。其中的setCall等方法都是定义在IncomingCallViewController.m中的。
现在开始看IncomingCallViewController.m类,这里主要是来电界面的设计和按钮应答等,包含的方法有setCall,setDelegate,还有这些方法中调用到的update和callUpdate,以及callUpdateEvent方法,这些方法的实现都在这个类中。除此之外就是接听按钮等的触发方法(

onAcceptClick:)了.

今天暂时完成了这些工作,还有的问题就是setCall中对call属性赋值后无法进入下一步,会造成循环执行直到崩溃。。。

然后就是对incomingCallView的设置,不要把界面的源码设置直接放到viewDidLoad中,可以写一个init方法,然后初始化一下,加载界面。



0 0
原创粉丝点击