上面是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);


更多相关文章

  1. Android位置服务--用户定位Location
  2. Android应用程序安装与Launcher启动机制
  3. Android经典底部选项卡集成方式之一
  4. android备份服务流程
  5. Android部分功能模块实现
  6. Android启动过程详解(4)——SystemServer
  7. Android(安卓)Binder Mechanism (3) -- 如何向系统注册Service
  8. android 检测外接键盘并设置输入法布局
  9. 设备驱动-----Android关机流程总结

随机推荐

  1. Android(安卓)ButterKnife导入使用出错解
  2. android listview 实现从数据库读取已读
  3. NDROID中LISTVIEW仿QQ群组向上滚动特效
  4. android mediaplayer 自定义 mediacontro
  5. Android学习备忘021——FBReader源码修改
  6. Android实体类序列化
  7. 关于android的设备管理器-DevicePolicyMa
  8. Android(安卓)Gradle 学习之二:重命名APK
  9. Android(安卓)添加数据到本地Excel表中
  10. Android(安卓)框架层为IMountService 增