文章插图
上面是系统下和SIP相关的类和接口 。总共有三个文件组成,两个和一个广播监听者 。通过工程文件夹中的.xml文件可以发现,的启动是类 。
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();}
在类的创建过程中,主要完成两件事,第一个是完成广播监听者的注册;第二个是实现主窗口按钮的消息监听者挂载 。广播监听者的挂载是一个动态的过程,这里主要是利用过滤器和相应的事件关联起来,然后调用注册API将过滤器注册到处理中心 。按钮的消息监听者挂载则是通过静态的关联实现的 。根据的执行流程,下一步就是执行函数,在这个函数中进行整个SIP协议的初始化 。
在初始化SIP协议的过程中,类似于一个独体的作用,也就是在整个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);
在进行打开操作后,就是进行注册的过程,如果当前用户存在则可以实现注册成功 。
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.@Overridepublic void onCallEstablished(SipAudioCall call) {call.startAudio();call.setSpeakerMode(true);call.toggleMute();updateStatus(call);}@Overridepublic void onCallEnded(SipAudioCall call) {updateStatus("Ready.");}};call = manager.makeAudioCall(me.getUriString(), sipAddress, listener, 30);}
呼叫是通过call来实现的,不过的监听者被重载了 。重载主要实现两个函数,第一个函数是呼叫建立,呼叫建立过程中会进行普通的电话功能 。如果是呼叫结束,则什么也不处理 。最后将会创建一个呼叫者出来 。
在广播接受者中,仅实现接受功能 。这个函数主要是一个电话接听的过程 。
【Android SipDemo项目实现SIP协议】
public void onReceive(Context context, Intent intent) {SipAudioCall incomingCall = null;try {SipAudioCall.Listener listener = new SipAudioCall.Listener() {@Overridepublic 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);
- 2023Android程序员找工作现状分析
- Android2.3 Sip简单分析
- 二 Android——数据持久化技术 SharedPreference存储
- 论android 中list erase用法
- vue-cil3项目根据inquirer进行分环境及多配置打包
- Jupyter 安装与使用
- 10分钟搭建 NDK 的 Android 开发环境
- 基于Android的人脸识别门禁系统
- 基于H5微信小程序的移动网赚项目设计与实现+springboot
- Android预定义ProgressBar的样式