android sip协议通话代码实现

简介

android里面的VOIP网络通话基于sip(Session initiation protocol)协议;android已经集成了sip协议栈,并提供了相应的API给应用开放使用,开发者不需要了解具体的协议内容

基于sip的网络通话基本过程

建立SIP服务器,关于如何建立SIP服务器,请参考这篇文章

需要所有参与通话的客户端注册用户到SIP服务器

一个客户端发起SIP通话到另一个客户端,这个消息首先发到SIP服务器,sip服务器收到消息后转发到目的客户端

目的客户端接收电话

关于SIP网络通话的主要类和描述如下表所示:

类/接口 描述
SipAudioCall 通过SIP处理网络音频电话
SipAudioCall.Listener 关于SIP电话的事件监听器,比如收到一个电话(on ringing)或者呼出一个电话(on calling)
SipErrorCode 定义在SIP活动中的错误代码
SipManager 为SIP任务提供APIs,比如初始化一个SIP连接,提供相关SIP服务的访问。
SipProfile 定义了SIP的相关属性,包含SIP账户、域名和服务器信息
SipProfile.Builder 创建SipProfile的帮助类
SipSession 代表一个SIP会话,跟SIP对话框或者一个没有对话框的独立事务相关联
SipSession.Listener 关于SIP会话的事件监听器,比如注册一个会话(on registering)或者呼出一个电话(on calling)的时候
SipSession.State 定义SIP会话的声明,比如“注册”、“呼出电话”、“打入电话”
SipRegistrationListener 一个关于SIP注册事件监 听器的接口

在应用的AndroidManifest.xml中需要声明下面权限和特征

构造一个SipManager实例.

SipManager manager = SipManager.newInstance(this);

//必须调用此方法创建,这是因为该方法会判断设备是否支持sip协议PackageManager.FEATURE_SIP

如果有的android设备不支持,可以添加android.software.sip.voip.xml和android.software.sip.xml到/system/etc/permissions/下

下面代码是注册一个账户到SIP服务器

SipProfile.Builder builder = new SipProfile.Builder(username, domain);

//uesrname表示注册用户名,domain表示域,实际就是sip服务器ip

builder.setPassword(password); //注册用户密码

SipProfile me = builder.build(); //构造一个SipProfile对象,也就是相当于一个账户信息

Intent i = new Intent();

i.setAction("android.SipDemo.INCOMING_CALL");

PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, Intent.FILL_IN_DATA);

//构造一个PendingIntent对象,这样当sip Service收到一个通话请求时,

//例如收到一个来电时,SipService会调用PendingIntent的send方法发送相应广播消息给调用者,也就是当前的SipProfile对象.

manager.open(me, pi, null); //此处就是用于注册一个账户到sip服务器

//注册一个监听器,用于获取注册账户时的通知状态,当然也可以不注册.

manager.setRegistrationListener(me.getUriString(), new SipRegistrationListener() {

public void onRegistering(String localProfileUri) { //正在注册

}

public void onRegistrationDone(String localProfileUri, long expiryTime) {//注册成功

}

public void onRegistrationFailed(String localProfileUri, int errorCode,

String errorMessage) {

}

});

开始拨号,从一个设备拨打电话到另一个设备,前提是两个设备都已注册,且知道目的设备的sip账户信息.

try {

SipAudioCall.Listener listener = new SipAudioCall.Listener() {

// Much of the client's interaction with the SIP Stack will

// happen via listeners. Even making an outgoing call, don't

// forget to set up a listener to set things up once the call is established.

@Override

public void onCallEstablished(SipAudioCall call) { //当网络通话建立了之后,会收到此通知

call.startAudio(); //启动音频

call.setSpeakerMode(true); //设置为扬声器模式,也就是开启回声抑制

call.toggleMute(); //切换静音,注意默认为非静音,调用此方法后变为静音了

}

@Override

public void onCallEnded(SipAudioCall call) {

}

};

//注意此处的makeAudioCall方法就是打网络电话的,localProfile就是本地设备的SipProfile对象,

//PeerProfile就是目标设备的SipProfile对象,listener是监听器

SipAudioCall call = manager.makeAudioCall(localProfile.getUriString(),

PeerProfile, listener, 30);}catch (Exception e) { }

注意,此处的SipProfile的内容格式,例如,LocalProfile的url格式为"sip:abcde123@10.0.149.240",PeerProfile的url格式为"sip:abcde234@10.0.149.240",url内容也就是sip账户,

其中:

(1) sip: 表示采用sip协议

(2) abcde123和abcde234是用户名, 也称为帐号. 用字母和数字均可。

(3) 10.0.149.240是sip账户所属的服务器地址(当然也可以用域名来表示)

(4) SIP协议默认端口为5060, 默认采用UDP传输,如果需要指定端口为5678,可以修改为sip:abcde123@10.0.149.240:5678,

从localProfile和peerProfile指定的内容可以看出,账户名作为唯一标识,由sip服务器来解析账户名,从而找到对应的目的主机.

目的端接收通话

根据前面的分析,一个设备拨打电话到目的设备时,在目的设备的sip服务(SipService)会发送一个广播消息给当前的目的设备。因此必须提前注册一个广播接收器来接收此消息,这样才知道有来电通知,可以在AndroidManifest.xml静态注册,也可以在应用程序中动态注册,因此下面代码必须放在广播接收器的onReceive()方法中:

案例:

try {

SipAudioCall.Listener listener = new SipAudioCall.Listener() {

@Override

public void onRinging(SipAudioCall call, SipProfile caller) {

try {

call.answerCall(30);

} catch (Exception e) {

e.printStackTrace();

}

}

};

//takeAudioCall就表示需要为接听电话创建一个SipAudioCall对象.

SipAudioCall incomingCall = manager.takeAudioCall(intent, listener);

incomingCall.answerCall(30); //接听电话

incomingCall.startAudio(); //启动音频

incomingCall.setSpeakerMode(true);

注意点:

1.所有参与网络通话的设备和sip服务器的网络必须是连接的,网络类型可以是以太网,wifi,mobile等都可以.

如果通话过程有问题,可以检测设备网络收发包是否正常.

2.对应的设备必须支持sip,voip功能才行.

android sip服务器,android sip协议通话实现相关推荐

  1. android提交服务器,Android向WEB服务器提交数据

    说明: 1.本系列博文是博主在学习传智播客Android培训视频的学习笔记 2.当然博文不只是罗列视频上讲的知识点,通过查阅资料对一些知识点进行了详细的讲解 3.由于是初学,难免有疏漏之处,还请不吝赐 ...

  2. android dhcp 服务器,android 获取当前手机的 DHCP 信息ip,server 等操作实例教程

    android 获取当前手机的 DHCP 信息ip,server 等操作实例教程WifiManager wifiManager = (WifiManager) getSystemService(Con ...

  3. android rdp服务器,[Android][FreeRDP与Window远程连接]

    1.落笔缘由 之前想了解一下远程控制之类的知识,类似于teamView,向日葵之类的都有移动端的App,而且都挺好用的,但是可惜的是没有源码,不能集成到自己的app里面,无意之间接触到RDP,只是粗糙 ...

  4. android 杀 服务器,android busybox httpd搭建简单web服务器

    安卓手机利用busybox中的httpd命令可以创建一个简单的web服务器. 我们可以在终端模拟器中输入一下命令查看httpd的使用帮助. busybox httpd --help 1|u0_a84@ ...

  5. SIP for android

    SIP for android   会话发起协议 Android提供了一个支持会话发起协议(SIP)的API,这可以让你添加基于SIP的网络电话功能到你的应用程序.Android包括一个完整的 SIP ...

  6. android sip教程,Android SIP开发教程

    Android 系统提供了支持 SIP(Session Initiation Protocol)的 API,允许开发者添加基于 SIP 的因特网电话特性到自己的应用程序中. Android 包含一个完 ...

  7. java android长连接_基于Java Socket的自定义协议,实现Android与服务器的长连接(一)...

    一.基础知识准备 在正式给大家介绍自定义协议之前,我们先对网络传输和协议解析的相关知识点做一个基本的介绍,尽管这些知识点我们在学校里学过,但难免会有所遗忘,这里先做一个简单的介绍,以便对后文的内容理解 ...

  8. android自带的nsd发现服务器,Android网络服务发现(NSD)协议的使用

    Android的网络服务发现协议(NSD)可以用于在小范围的网络中发现邻近设备上的某个应用.这对于一些社交网络.多人游戏类的应用会非常有帮助. Android的NSD的使用方法大致上分为四种操作: 1 ...

  9. android跨进程关闭服务器,Android IPC机制(五)用Socket实现跨进程聊天程序

    本文首发于微信公众号「后厂技术官」 1.Socket简介 Socket也称作"套接字",是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层 ...

最新文章

  1. 深入理解空间搜索算法 ——数百万数据中的瞬时搜索
  2. Matlab中的算术运算和数学函数
  3. VTK:PolyData之WeightedTransformFilter
  4. Redis 单机模式,主从模式,哨兵模式(sentinel),集群模式(cluster),第三方模式优缺点分析
  5. 46 道阿里巴巴 Java 面试题,你会几道?
  6. 修改oracle 的dbname,在oracle 10g上修改dbname的实验
  7. map按kye排序 按value排序
  8. python资料-大牛分享python资料
  9. matlab p q的确定,基于MATLAB软件的P-Q分解法潮流计算 (1)
  10. SVG 坐标和 viewBox
  11. 解决无法加载虚拟仿真实验unity3d插件的“failed to update unity web player”问题2019年12月27日
  12. CAN FD 总线协议深度解析-简单易懂协议详解
  13. MATLAB中uigetfile函数使用方法
  14. 影视剪辑,视频剪辑素材音效哪里找?超实用剪辑入门必备素材
  15. html给图片坐标没连接,4-HTML中的 a, img/标签使用及锚点,路径相关
  16. 如何用Camtasia将喜欢的视频做出复古的感觉
  17. Ubuntu18.04/16.04调整屏幕分辨率至1920*1080
  18. 软件性能测试参数化数据准备,性能测试之如何准备测试数据
  19. 永中文档在线转换预览双活实现方案
  20. Android - 分转元、元转分 金额工具类

热门文章

  1. java 内存不释放_java无法内存释放的问题
  2. 关于百度飞浆安装不成功的坑
  3. mysql 初次进入_怎么初次进入mysql?
  4. Learning to Navigate Unseen Environments: Back Translation with Environmental Dropout
  5. 算法-数据结构-演示网站(USF)
  6. 川渝交界处今晨发生5级地震
  7. 微信小程序分销系统有哪些营销模式?看完你就秒懂了!
  8. qt内存泄漏检测_qt 关于内存泄漏的检测
  9. 无线网络两台计算机如何共享打印机,打印机共享:如何实现多台电脑控制共用一台打印机(二无线篇)...
  10. 测试cpu单核分数软件,最新geekbench5 CPU跑分天梯排行榜