简介
CSipsimple的核心在PJSIP(JNI中),而Java代码只是实现了PJSIP的管理和界面的展示。
本篇将对CSipsimple进行重新封装,把项目封装成jar,简单的说是重新封装了如何使用PJSIP,方便其它项目直接使用。
项目
先看效果图:
支持多个帐户,效果图如上。
通话效果如图,支持多个帐户、多个电话。
支持媒体设置,效果上图。
G729 编码测试
测试项目如图:
主要测试源码介绍
InCallMediaControl 类是媒体设置对话框(直接引用CSipsimple)
MainActivity 主界面
SessionManager 会话管理
SipCallStatus 通话界面
SipSession 会话
MainActivity 中主要就是注册了,如下:
public SipProfile buildAccount() {//
Log.d("", "buildAccount");
SipProfile account = new SipProfile();
account.setDisplayName("1001");
String[] serverParts = "baidu.com:5060".split(":");
account.setAccId("<sip:" + SipUri.encodeUser("1001") + "@"
+ serverParts[0].trim() + ">");
String regUri = "sip:" + "baidu:5060";
account.setRegUri(regUri);
account.setProxies(new String[] { regUri });
account.setRealm("*");
account.setUsername("1001");
account.setData("1001");
account.setScheme(SipProfile.CRED_SCHEME_DIGEST);
account.setDatatype(SipProfile.CRED_DATA_PLAIN_PASSWD);
// By default auto transport
account.setTransport(SipProfile.TRANSPORT_UDP);
return account;
}
SipSession 一个会话单元
SessionManager 管理会话,会话分为四个步骤:连接Sip,连接对方,连接成功,连接结束(一个会话的流程)
其中会话里面有一个接口,监听会话信息,如下:
@Override
public boolean onSipSessionState(int state,
SipCallSessionImpl sipCallSessionImpl, String accId) {
if (mLastSessionState == state)
return false;
mLastSessionState = state;
String number = sipCallSessionImpl.getRemoteContact();
number = SipUri.getDisplayedSimpleContact(number);
SipSession sipSession = hasSipSessionByNumber(number);
if (state != UAStateReceiver.UA_STATE_RINGRING) {
SipManager.getInstance().getMediaManager().stopRing();
}
if (state == UAStateReceiver.UA_STATE_INCOMING_CALL) {
if (sipSession != null
&& sipSession.getCallStatus() == CallStatus.ConnectSuccess)
return true;
if (sipSession != null)
delSipSession(sipSession);
sipSession = new SipSession(number, CallType.IncomeCall);
sipSession.setRingTime(System.currentTimeMillis());
sipSession.setCallStatus(CallStatus.ConnectOther);
getSipSessions().add(sipSession);
ActivityHelp.jumpToNewActivity(mContext, SipCallStatus.class,
number);
SipManager.getInstance().getMediaManager()
.startRing(sipCallSessionImpl.getRemoteContact());
getWakeLock().acquire();
} else if (state == UAStateReceiver.UA_STATE_OUTGOING_CALL) {
} else if (state == UAStateReceiver.UA_STATE_RINGRING) {
if (sipSession == null)
return false;
sipSession.setRingTime(System.currentTimeMillis());
sipSession.setCallStatus(CallStatus.ConnectSuccess);// 响铃
} else if (state == UAStateReceiver.UA_STATE_INCALL) {
if (getWakeLock().isHeld())
getWakeLock().release();
if (sipSession == null)
return false;
if (sipSession.getInCallTime() == 0)
sipSession.setInCallTime(System.currentTimeMillis());
sipSession.setCallStatus(CallStatus.ConnectSuccess);//
} else if (state == UAStateReceiver.UA_STATE_IDLE
|| state == UAStateReceiver.UA_STATE_IDLE_BUSY) {
if (getWakeLock().isHeld())
getWakeLock().release();
if (sipSession == null)
return false;
sipSession.setCallStatus(CallStatus.ConnectOver);// 结束
sipSession.setSessionOver(true);
} else if (state == UAStateReceiver.UA_STATE_IDLE_NOTFOUND) {
} else if (state == UAStateReceiver.UA_STATE_HOLD) {
}
if (sipSession != null) {
sipSession.setSipCallSessionImpl(sipCallSessionImpl);
sipSession.onISipSessionStatusListener();
if (state == UAStateReceiver.UA_STATE_IDLE
|| state == UAStateReceiver.UA_STATE_IDLE_BUSY) { // 更改通知
cancelCallNotification();
} else {
showCallNotification(sipSession);
}
}
return false;
}
该接口是根据PJSIP触发。
使用G729 编码,只需要设置其优先级即可,代码如下:
SipManager.getInstance().setCodecPriority("G729/8000/1",
SipManager.CODEC_NB, "240");
SipManager.getInstance().setCodecPriority("G729/8000/1",
SipManager.CODEC_WB, "240");
设置好后,重新启动sip便可使用了。经测试语音良好。
最新版新增:
优化注册流程;新增获取当前使用的编码;新增编解码的限制。
限制编码使用如下:
// [speex/16000/1, speex/8000/1, speex/32000/1, GSM/8000/1, PCMU/8000/1,
// PCMA/8000/1, G722/16000/1, AMR/8000/1, AMR-WB/16000/1, ISAC/16000/1,
// ILBC/8000/1, G729/8000/1, SILK/8000/1, SILK/12000/1, SILK/16000/1,
// SILK/24000/1]
SipManager.getInstance().addAudioCodesForOnlyUse("G729/8000/1");// 谨慎使用,如果对方无此编码,对方不会接收会话
如果其它项目直接使用,只要实现注册,实现该接口即可实现会话了,是不是很方便?
小结
CSipsimple的重新封装告一段落,以后其它项目可直接应用Jar包便可实现Sip的功能。
项目下载(已添加资源)
项目下载(最新版,优化注册流程;新增获取当前使用的编码;新增编解码的限制)
项目下载(最新稳定版,解决部分bug,解决通话异常情况)
分享到:
相关推荐
【Csipsimple二次封装的Demo】是一个基于Android Studio的项目,旨在为开发者提供一个可以直接运行的、精简版的Csipsimple应用实例。Csipsimple是一款开源的SIP(Session Initiation Protocol)客户端,用于实现VoIP...
CSipSimple是一款开源的VoIP(Voice over IP)应用程序,专为Android平台设计。它基于SIP协议,允许用户通过互联网进行语音、视频通话以及发送即时消息。在IT行业中,了解并掌握像CSipSimple这样的应用是十分重要的...
CSipSimple是一款开源的Android应用,专为移动设备设计,实现了VoIP(Voice over Internet Protocol)功能,即通过互联网进行语音通信。它基于SIP(Session Initiation Protocol)协议,这是一种用于控制多媒体通信...
csipsimple 是开方式比较好用的ip电话软件。兼容标准ip协议。速度快。
CSipSimple是一款开源的Android应用,它为用户提供VoIP(Voice over Internet Protocol)服务,即通过互联网进行语音和视频通信。这款应用基于SIP(Session Initiation Protocol)协议,这是一种用于控制多媒体通信...
CsipSimple是一款基于Android平台的开源通信应用,其核心是利用了PJSIP库来实现SIP(Session Initiation Protocol)协议的功能。SIP是一种互联网信令协议,用于建立、管理和终止多媒体通信会话,如语音通话、视频...
csipsimple 好用的安卓软电话,和电话簿完美结合,支持流量监控,支持G729编码,跟bria有一拼
支持视频通话的csipsimple android网络电话
CSIPSimple是一款针对Android平台的开源VoIP(Voice over IP)软件,它的主要功能是提供一个用户友好的界面,让用户可以使用互联网进行语音通话、视频通话以及即时消息交流。这款应用基于SIP(Session Initiation ...
CSipSimple是一款基于Android操作系统的SIP软电话应用,它允许用户使用VoIP(Voice over Internet Protocol)服务进行语音通话。安装文档提供了在CentOS6.5 32位系统上安装CSipSimple所需步骤的详细说明。文档指出了...
"csipsimple-master" 是一个开源的VoIP(Voice over Internet Protocol)应用程序项目,主要针对Android平台。这个项目的核心是实现SIP(Session Initiation Protocol)通信,它允许用户通过互联网进行语音、视频...
从CSipSimple官网svn上下载的源码。需要用lz工具解压。
android 上sip 软件件,是一个开源的软件,这是人个2012年10年4月更新的一个软件
最近在研究视频通信,决定使用CSipSimple做二次开发,网上的资源版本都是只支持语音的,自己捣鼓了一下弄出来一个支持视频通信的。 文件解压之后将两个工程直接导入eclipse就可以使用了。使用视频通信需要在设置里面...
定位功能,轻松定位,能很详细的展示对方所在街道名称和地段。
理解RTP如何封装和传输音频和视频流对于实现CSipSimple的功能至关重要。 7. **SIP库集成**:CSipSimple可能依赖于开源SIP库,如pjsip。开发者需要学习如何集成这些库,处理编译、链接和运行时问题。 8. **UI设计**...
5. **二次封装**:对 Csipsimple 进行封装,主要是为了简化接口,隐藏底层复杂的SIP交互逻辑,让调用者能以更简洁的方式进行SIP注册和通信。这可能涉及到创建Java层的API,将C/C++的回调函数转换为Java接口,以及...
包含CSipsimple(最新版)所有可用的.so文件 libpj_aac_codec.so libpj_codec2_codec.so libpj_g726_codec.so libpj_g729_codec.so libpj_g7221_codec.so libpj_opensl_dev.so libpj_opus_codec.so libpj_silk_codec...