android sip服务器,android sip协议通话实现
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协议通话实现相关推荐
- android提交服务器,Android向WEB服务器提交数据
说明: 1.本系列博文是博主在学习传智播客Android培训视频的学习笔记 2.当然博文不只是罗列视频上讲的知识点,通过查阅资料对一些知识点进行了详细的讲解 3.由于是初学,难免有疏漏之处,还请不吝赐 ...
- android dhcp 服务器,android 获取当前手机的 DHCP 信息ip,server 等操作实例教程
android 获取当前手机的 DHCP 信息ip,server 等操作实例教程WifiManager wifiManager = (WifiManager) getSystemService(Con ...
- android rdp服务器,[Android][FreeRDP与Window远程连接]
1.落笔缘由 之前想了解一下远程控制之类的知识,类似于teamView,向日葵之类的都有移动端的App,而且都挺好用的,但是可惜的是没有源码,不能集成到自己的app里面,无意之间接触到RDP,只是粗糙 ...
- android 杀 服务器,android busybox httpd搭建简单web服务器
安卓手机利用busybox中的httpd命令可以创建一个简单的web服务器. 我们可以在终端模拟器中输入一下命令查看httpd的使用帮助. busybox httpd --help 1|u0_a84@ ...
- SIP for android
SIP for android 会话发起协议 Android提供了一个支持会话发起协议(SIP)的API,这可以让你添加基于SIP的网络电话功能到你的应用程序.Android包括一个完整的 SIP ...
- android sip教程,Android SIP开发教程
Android 系统提供了支持 SIP(Session Initiation Protocol)的 API,允许开发者添加基于 SIP 的因特网电话特性到自己的应用程序中. Android 包含一个完 ...
- java android长连接_基于Java Socket的自定义协议,实现Android与服务器的长连接(一)...
一.基础知识准备 在正式给大家介绍自定义协议之前,我们先对网络传输和协议解析的相关知识点做一个基本的介绍,尽管这些知识点我们在学校里学过,但难免会有所遗忘,这里先做一个简单的介绍,以便对后文的内容理解 ...
- android自带的nsd发现服务器,Android网络服务发现(NSD)协议的使用
Android的网络服务发现协议(NSD)可以用于在小范围的网络中发现邻近设备上的某个应用.这对于一些社交网络.多人游戏类的应用会非常有帮助. Android的NSD的使用方法大致上分为四种操作: 1 ...
- android跨进程关闭服务器,Android IPC机制(五)用Socket实现跨进程聊天程序
本文首发于微信公众号「后厂技术官」 1.Socket简介 Socket也称作"套接字",是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层 ...
最新文章
- 深入理解空间搜索算法 ——数百万数据中的瞬时搜索
- Matlab中的算术运算和数学函数
- VTK:PolyData之WeightedTransformFilter
- Redis 单机模式,主从模式,哨兵模式(sentinel),集群模式(cluster),第三方模式优缺点分析
- 46 道阿里巴巴 Java 面试题,你会几道?
- 修改oracle 的dbname,在oracle 10g上修改dbname的实验
- map按kye排序 按value排序
- python资料-大牛分享python资料
- matlab p q的确定,基于MATLAB软件的P-Q分解法潮流计算 (1)
- SVG 坐标和 viewBox
- 解决无法加载虚拟仿真实验unity3d插件的“failed to update unity web player”问题2019年12月27日
- CAN FD 总线协议深度解析-简单易懂协议详解
- MATLAB中uigetfile函数使用方法
- 影视剪辑,视频剪辑素材音效哪里找?超实用剪辑入门必备素材
- html给图片坐标没连接,4-HTML中的 a, img/标签使用及锚点,路径相关
- 如何用Camtasia将喜欢的视频做出复古的感觉
- Ubuntu18.04/16.04调整屏幕分辨率至1920*1080
- 软件性能测试参数化数据准备,性能测试之如何准备测试数据
- 永中文档在线转换预览双活实现方案
- Android - 分转元、元转分 金额工具类
热门文章
- java 内存不释放_java无法内存释放的问题
- 关于百度飞浆安装不成功的坑
- mysql 初次进入_怎么初次进入mysql?
- Learning to Navigate Unseen Environments: Back Translation with Environmental Dropout
- 算法-数据结构-演示网站(USF)
- 川渝交界处今晨发生5级地震
- 微信小程序分销系统有哪些营销模式?看完你就秒懂了!
- qt内存泄漏检测_qt 关于内存泄漏的检测
- 无线网络两台计算机如何共享打印机,打印机共享:如何实现多台电脑控制共用一台打印机(二无线篇)...
- 测试cpu单核分数软件,最新geekbench5 CPU跑分天梯排行榜