«

Android SipDemo项目实现SIP协议

时间:2024-3-2 20:03     作者:韩俊     分类: Android


上面是android系统下和SIP相关的类和接口。SipDemo总共有三个文件组成,两个activity和一个广播监听者。通过工程文件夹中的AndroidManifest.xml文件可以发现,SipDemo的启动activity是WalkieTalkieActivity类。

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.walkietalkie);

        ToggleButton pushToTalkButton = (ToggleButton) findViewById(R.id.pushToTalk);
        pushToTalkButton.setOnTouchListener(this);
        // Set up the intent filter.  This will be used to fire an
        // IncomingCallReceiver when someone calls the SIP address used by this
        // application.
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.SipDemo.INCOMING_CALL");
        callReceiver = new IncomingCallReceiver();
        this.registerReceiver(callReceiver, filter);

        // "Push to talk" can be a serious pain when the screen keeps turning off.
        // Let's prevent that.
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

 //       initializeManager();
    }
在WalkieTalkieActivity类的创建过程中,主要完成两件事,第一个是完成广播监听者的注册;第二个是实现主窗口按钮的消息监听者挂载。广播监听者的挂载是一个动态的过程,这里主要是利用Intent过滤器和相应的Intent事件关联起来,然后调用注册API将过滤器注册到Intent处理中心。按钮的消息监听者挂载则是通过静态的关联实现的。根据activity的执行流程,下一步就是执行OnStart函数,在这个函数中进行整个SIP协议的初始化。

在初始化SIP协议的过程中,manager类似于一个独体的作用,也就是在整个APP中只能存在一个实例。而虽然me也是只能存在一个实体,但是这个实体是根据需要进行build建造出来的。

if(manager == null) {
          manager = SipManager.newInstance(this);
        }
me是一个和当前域中的用户相关的属性,也就是说用于管理唯一的一个在当前域中存在的用户的相关信息。而用户的唯一性由域信息和用户名唯一构成。

            SipProfile.Builder builder = new SipProfile.Builder(username, domain);
            builder.setPassword(password);
            me = builder.build();

            Intent i = new Intent();
            i.setAction("android.SipDemo.INCOMING_CALL");
            PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, Intent.FILL_IN_DATA);
            manager.open(me, pi, null);
在manager进行打开操作后,就是进行注册的过程,如果当前用户存在则可以实现注册成功。

    public void initiateCall() {

        updateStatus(sipAddress);

        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();
                    updateStatus(call);
                }

                @Override
                public void onCallEnded(SipAudioCall call) {
                    updateStatus("Ready.");
                }
            };

            call = manager.makeAudioCall(me.getUriString(), sipAddress, listener, 30);

        }
呼叫是通过call来实现的,不过SipAudioCall的监听者被重载了。重载主要实现两个函数,第一个函数是呼叫建立,呼叫建立过程中会进行普通的电话功能。如果是呼叫结束,则什么也不处理。最后将会创建一个呼叫者出来。

在IncomingCallReceiver广播接受者中,仅实现接受功能。这个函数主要是一个电话接听的过程。

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();
                    }
                }
            };

            WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context;

            incomingCall = wtActivity.manager.takeAudioCall(intent, listener);
            incomingCall.answerCall(30);
            incomingCall.startAudio();
            incomingCall.setSpeakerMode(true);
            if(incomingCall.isMuted()) {
                incomingCall.toggleMute();
            }

            wtActivity.call = incomingCall;

            wtActivity.updateStatus(incomingCall);


        <p>版权声明:本文为博主原创文章,未经博主允许不得转载。</p>

标签: android

热门推荐