`
923723914
  • 浏览: 660732 次
文章分类
社区版块
存档分类
最新评论

CSipsimple的封装

 
阅读更多
简介

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,AndroidStudio直接运行

    【Csipsimple二次封装的Demo】是一个基于Android Studio的项目,旨在为开发者提供一个可以直接运行的、精简版的Csipsimple应用实例。Csipsimple是一款开源的SIP(Session Initiation Protocol)客户端,用于实现VoIP...

    CSipSimple可编译版本

    CSipSimple是一款开源的VoIP(Voice over IP)应用程序,专为Android平台设计。它基于SIP协议,允许用户通过互联网进行语音、视频通话以及发送即时消息。在IT行业中,了解并掌握像CSipSimple这样的应用是十分重要的...

    CSipSimple

    CSipSimple是一款开源的Android应用,专为移动设备设计,实现了VoIP(Voice over Internet Protocol)功能,即通过互联网进行语音通信。它基于SIP(Session Initiation Protocol)协议,这是一种用于控制多媒体通信...

    csipsimple

    csipsimple 是开方式比较好用的ip电话软件。兼容标准ip协议。速度快。

    CSipSimple android项目(基于官方demo)

    CSipSimple是一款开源的Android应用,它为用户提供VoIP(Voice over Internet Protocol)服务,即通过互联网进行语音和视频通信。这款应用基于SIP(Session Initiation Protocol)协议,这是一种用于控制多媒体通信...

    CsipSimple源代码

    CsipSimple是一款基于Android平台的开源通信应用,其核心是利用了PJSIP库来实现SIP(Session Initiation Protocol)协议的功能。SIP是一种互联网信令协议,用于建立、管理和终止多媒体通信会话,如语音通话、视频...

    csipsimple 好用的安卓软电话

    csipsimple 好用的安卓软电话,和电话簿完美结合,支持流量监控,支持G729编码,跟bria有一拼

    支持视频通话的csipsimple android网络电话

    支持视频通话的csipsimple android网络电话

    csipsimple_(2459)最新版_0积分下载

    CSIPSimple是一款针对Android平台的开源VoIP(Voice over IP)软件,它的主要功能是提供一个用户友好的界面,让用户可以使用互联网进行语音通话、视频通话以及即时消息交流。这款应用基于SIP(Session Initiation ...

    CSipSimple安装文档

    CSipSimple是一款基于Android操作系统的SIP软电话应用,它允许用户使用VoIP(Voice over Internet Protocol)服务进行语音通话。安装文档提供了在CentOS6.5 32位系统上安装CSipSimple所需步骤的详细说明。文档指出了...

    csipsimple-master

    "csipsimple-master" 是一个开源的VoIP(Voice over Internet Protocol)应用程序项目,主要针对Android平台。这个项目的核心是实现SIP(Session Initiation Protocol)通信,它允许用户通过互联网进行语音、视频...

    CSipSimple源码12月15日更新版

    从CSipSimple官网svn上下载的源码。需要用lz工具解压。

    CSipsimple-latest-trunk.apk

    android 上sip 软件件,是一个开源的软件,这是人个2012年10年4月更新的一个软件

    CSipSimple支持视频通信版本源码

    最近在研究视频通信,决定使用CSipSimple做二次开发,网上的资源版本都是只支持语音的,自己捣鼓了一下弄出来一个支持视频通信的。 文件解压之后将两个工程直接导入eclipse就可以使用了。使用视频通信需要在设置里面...

    CSipSimple-2.2.apk

    定位功能,轻松定位,能很详细的展示对方所在街道名称和地段。

    CSipSimple源码

    理解RTP如何封装和传输音频和视频流对于实现CSipSimple的功能至关重要。 7. **SIP库集成**:CSipSimple可能依赖于开源SIP库,如pjsip。开发者需要学习如何集成这些库,处理编译、链接和运行时问题。 8. **UI设计**...

    Pjsip注册二次封装后的代码

    5. **二次封装**:对 Csipsimple 进行封装,主要是为了简化接口,隐藏底层复杂的SIP交互逻辑,让调用者能以更简洁的方式进行SIP注册和通信。这可能涉及到创建Java层的API,将C/C++的回调函数转换为Java接口,以及...

    CSipsimple for so(最新版)

    包含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...

Global site tag (gtag.js) - Google Analytics