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