SIP(Session Initiation Protocol)服务在Android 2.3中正式引入,能够支持VOIP,当然在早期版本中,也有不少第三方成功的将SIP服务移植到Android中。比较著名的客户端包括sipdroid等。在Android中,SIP客户端的实现位于android.net.sip包中,主要的类包括SipAudioCall、SipManager、SipProfile、SipSession等。
使用SIP,要求"android.permission.INTERNET"和"android.permission.USE_SIP"权限。考虑到即使软件平台采用了Android 2.3,在硬件配置上也可能不能完全支持SIP,所以在AndroidManifest.xml还应声明"android.hardware.sip.voip"、"android.hardware.wifi"、"android.hardware.microphone"等。
1.SipManager
SipManager用于初始化SIP链接和接入SIP服务等。能够创建SIP会话。比较常用的方法包括:
createSipSession() //创建SIP会话
getCallId() //获得呼叫ID
makeAudioCall() //发起语音呼叫
newInstance() //创建一个SipManager实例
register() //注册帐号
takeAudioCall() //接听电话
open() //打开SIP会话
另外支持SIP并不意味着一定支持VOIP,是否支持SIP协议栈和是否支持VOIP功能与硬件设备有关,在基于SIP发起语音呼叫前,还需判断支持SIP和语音呼叫,方法为isVoipSupported()和isApiSupported()。
2.SipAudioCall
SipAudioCall用来处理基于SIP的网络语音呼叫,通过SipManager的makeAudioCall()方法和
takeAudioCall()方法可以获得SipAudioCall的实例。
但需要注意的是,SipAudioCall要求"android.permission.INTERNET"和
"android.permission.USE_SIP"权限。
另外其startAudio()方法还要求"android.permission.ACCESS_WIFI_STATE"、"android.permission.WAKE_LOCK"、
"android.permission.RECORD_AUDIO"权限。其setSpeakerMode()方法还要求"android.permission.MODIFY_PHONE_STATE"权限。
SipAudioCall的常用方法包括:
startAudio() //在一个已建立的SIP链接中发起通话
setSpeakerMode() //设置通话模式
toggleMute() //进行静音模式
getPeerProfile() //获取对方的信息
endCall() //结束一个语音呼叫SIP链接
answerCall() //应答一个语音呼叫SIP链接
makeCall() //发起一个语音呼叫SIP链接
sendDtmf() //发送DTMF音
另外通过设置SipAudioCall.Listener()监听器可以监听到SIP链接建立和结束的信息。在SIP语音呼叫链接建立后,就可以传输RTP(Real-time Transport Protocol)流了。在RFC 3551中对SDP(Session Description
Protocol)采用的RTP流进行了明确的定义。其语音流为AMR格式。
3.SipProfile
SipProfile包含了一个SIP账户的帐户名、密码、端口、SIP域和SIP服务器地址等信息。
通过SipProfile.Builder可以构建一个SipProfile实例,另外也可以从SipSession中获取本地和对方的SipProfile实例。
SipProfile的常用方法包括:
getPassword() //获得密码
getUriString() //获得URI
getSipDomain() //获得SIP域
getDisplayName() //获得显示名
getUserName() //获得账户名
4.SipSession
SipSession意味着一个SIP会话。通过SipManager的createSipSession()方法可以获得发起呼叫时的SIP会话,通过SipManager的getSessionFor()方法可以获得收到呼叫时的SIP会话。
通过SipSession.Listener监听器可以监听到会话的信息如呼叫忙、呼叫结束、呼叫建立、注册请求、铃声等。
同SipSession.State监听器可以监听到会话的状态,SIP会话的状态目前有DEREGISTERING、INCOMING_CALL、INCOMING_CALL_ANSWERING、IN_CALL、NOT_DEFINED、OUTGOING_CALL、OUTGOING_CALL_CANCELING、OUTGOING_CALL_RING_BACK、PINGING、READY_TO_CALL、REGISTERING等。
SipSession的常用方法包括:
getPeerProfile() //获取对方的信息
setListener() //设置SipSession.Listener监听器
register() //注册到SIP服务器
下面是发起SIP呼叫的一般过程:
public void initiateCall()
{
try {
SipAudioCall.Listener listener = new SipAudioCall.Listener() {
public void onCallEstablished(SipAudioCall call) {
call.startAudio();
call.setSpeakerMode(true);
call.toggleMute();
}
@Override
public void onCallEnded(SipAudioCall call) {
……
}
};
call = manager.makeAudioCall(me.getUriString(), sipAddress, listener, 30);
}
catch (Exception e) {
if (me SipProfile!= null) {
try {
meSipManager.close(me.getUriString());
}
catch (Exception ee) {
ee.printStackTrace();
}
}
if (call != null)
{
call.close();
}
}
}
下面是收到SIP呼叫的一般处理过程:
public class IncomingCallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
SipAudioCall incomingCall = null;
try {
SipAudioCall.Listener listener = new SipAudioCall.Listener() {
@Override
public void onRinging(SipAudioCall call, SipProfile caller) {
try {
call.answerCall(30);
} catch (Exception e) {
e.printStackTrace();
}
}
};
incomingCall = meSipManager.takeAudioCall(intent, listener);
incomingCall.answerCall(30);
incomingCall.startAudio();
incomingCall.setSpeakerMode(true);
if(incomingCall.isMuted()) {
incomingCall.toggleMute();
}
} catch (Exception e) {
if (incomingCall != null) {
incomingCall.close();
}
}
}
}
在框架层,SIP协议栈的具体实现位于frameworks\base\voip中,和其他服务一样,在框架上采用的同样是C/S架构,其框架层服务为SipService。