您的位置:华清远见教育科技集团 >> Android资料 >> Android 中如何使用SIP服务  
 
Android 中如何使用SIP服务
分享到:

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。

 
 更多相关文章

·Android音频混响特效的设置
·Android可视化音频均衡器
·Android重低音及环绕音音效的添加
·如何使用Android JetPlayer类
·Android RingtoneManager 铃声管理
·Android AudioTrack音频播放分析