Browse Source

优化广播相关功能,可以通过按键停止广播,再次按键可以正常呼叫和通话,呼叫挂断或通话结束可以恢复广播。来电时停止广播,通话结束可恢复广播

weizhengliang 2 years ago
parent
commit
8d5d2c46c0

+ 52 - 17
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/activity/CallingbedActivity.kt

@@ -119,6 +119,10 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
     private var serverSuccess = false
 
     private var janusClient: JanusClient? = null
+    private var broadcastOn = false
+    private var broadcastChannelId: String = ""
+    private var playing = false
+    private val myHandler = Handler(Looper.getMainLooper())
 
     //主信息
     private val mainFragment = "main_fragment"
@@ -356,7 +360,7 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
                         CommonUtils.setUrl(activity, info.thirdServer)
                         CommonUtils.setUrlPort(activity, info.thirdServerPort.toString())
                         showMsgMain("restart...")
-                        handler.postDelayed({
+                        myHandler.postDelayed({
                             AppUpdateHelper.restartApp(activity)
                         }, 10000)
                     }
@@ -448,6 +452,7 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
         EventBus.getDefault().unregister(this)
         unRegReceiver()
         handler.removeCallbacksAndMessages(null)
+        myHandler.removeCallbacksAndMessages(null)
         SoundPoolManager.getInstance().release()
         isTimeWorking = false
         stopBroadcast(false)
@@ -917,6 +922,14 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
             }
         }
 
+        //如果当前正在播放广播
+        if (buffer[5].toInt() == 1 || buffer[6].toInt() == 1 || buffer[5].toInt() == 2 || buffer[6].toInt() == 2) {
+            if (playing) {
+                stopBroadcast(true)
+                return
+            }
+        }
+
         //首页
         if (buffer[0].toInt() == 1 || buffer[0].toInt() == 2) {
             if (skyCallFragment == null) {
@@ -962,12 +975,14 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
 
         //呼叫
         else if (buffer[4].toInt() == 1 || buffer[4].toInt() == 2) {
-            runOnUiThread {
-                clickVCall(true)
+            if (skyCallFragment == null) {
+                runOnUiThread {
+                    clickVCall(true)
+                }
             }
         }
 
-        //呼叫护士键短按或长按松开
+        //面板呼叫护士键短按或长按松开
         else if (buffer[5].toInt() == 1 || buffer[5].toInt() == 2) {
             runOnUiThread {
                 clickVCall(false)
@@ -1177,7 +1192,10 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
     //开始呼叫
     fun startCall(type: Int) {
         if (Constant.CUSTOM_ID != -1) {
-            stopBroadcast(false)
+            if (playing) {
+                stopBroadcast(false)
+            }
+
             //通话之前先判断webrtc socket和tcp是否连接正常,否则不能建立通话
             if (Constant.TCP_CONNECTED && !TextUtils.isEmpty(Constant.SIP_ID)) {
                 //去电界面
@@ -1186,6 +1204,7 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
                 var fragment = SkyCallFragment()
                 var bundle = Bundle()
                 bundle.putInt("call_state", 0)
+                bundle.putBoolean("bc_play", false)
                 fragment.arguments = bundle
                 addCallFragment(fragment)
             } else {
@@ -1212,6 +1231,13 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
                     Constant.CALL_STATE = Constant.CALL_STANDBY
                     removeCallFragment()
                 }
+
+                //退出通话,如果还有广播在播放则重新启动广播
+                myHandler.postDelayed({
+                    if (broadcastOn) {
+                        startBroadcast()
+                    }
+                }, 2000)
             }
 
             //Sip注册状态
@@ -1255,7 +1281,9 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
                     Log.d("TCP", "received tcp action: " + tcpModel.action + ", type: " + tcpModel.type)
                     if (tcpModel.getType() == TcpType.VOICE) {
                         if (tcpModel.data != null) {
-                            stopBroadcast(false)
+                            if (playing) {
+                                stopBroadcast(false)
+                            }
                             val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
                             if (tcpModel.action == TcpAction.VoiceAction.CALL) {
                                 Constant.fromId = tcpModel.fromId
@@ -1269,16 +1297,13 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
                                     var bundle = Bundle()
                                     bundle.putInt("call_state", 1)
                                     bundle.putSerializable("tcp_model", tcpModel)
+                                    bundle.putBoolean("bc_play", broadcastOn)
                                     fragment.arguments = bundle
                                     addCallFragment(fragment)
                                 } else {
                                     showMessage(R.string.call_init_error)
                                     Constant.CALL_STATE = Constant.CALL_STANDBY
-                                    VoiceUtil.rejectAudioCall(
-                                        Constant.DEVICE_ID,
-                                        Constant.fromId,
-                                        Constant.interactionId
-                                    )
+                                    VoiceUtil.rejectAudioCall(Constant.DEVICE_ID, Constant.fromId, Constant.interactionId)
                                 }
                             }
                         }
@@ -1309,14 +1334,16 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
                     } else if (tcpModel.type == TcpType.BROADCAST) {
                         if (tcpModel.action == TcpAction.BroadcastAction.START) {
                             if (Constant.TCP_CONNECTED && !TextUtils.isEmpty(Constant.SIP_ID)) {
-                                if (tcpModel.data != null) {
-                                    val channelId = tcpModel.data.toString()
-                                    startBroadcast(channelId)
+                                if (tcpModel.data != null && !broadcastOn) {
+                                    broadcastOn = true
+                                    broadcastChannelId = tcpModel.data.toString()
+                                    startBroadcast()
                                 }
                             } else {
                                 showMessage("服务未连接或sipId为空")
                             }
                         } else if (tcpModel.action == TcpAction.BroadcastAction.STOP) {
+                            broadcastOn = false
                             stopBroadcast(true)
                         }
                     } else if (tcpModel.type == TcpType.DEVICE) {
@@ -1401,14 +1428,20 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
         }
     }
 
-    private fun startBroadcast(channelId: String) {
+    private fun startBroadcast() {
+        if (TextUtils.isEmpty(broadcastChannelId)) {
+            broadcastOn = false
+            return
+        }
+
+        playing = true
         showMsgMain(getString(R.string.broadcast_start))
         //初始化 engine
         WebRTCEngine.getInstance().init(true, this)
         //初始化 janusClient
         janusClient = JanusClient(JanusConstant.JANUS_URL, Constant.SIP_ID.toBigInteger())
         //初始化 StreamingCallback
-        val streamingCallback = StreamingCallback(janusClient, Constant.SIP_ID.toBigInteger(), channelId.toBigInteger())
+        val streamingCallback = StreamingCallback(janusClient, Constant.SIP_ID.toBigInteger(), broadcastChannelId.toBigInteger())
         janusClient?.setJanusCallback(streamingCallback)
 
         janusClient?.connect()
@@ -1419,6 +1452,7 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
     }
 
     private fun stopBroadcast(showMsg: Boolean) {
+        playing = false
         if (showMsg) {
             showMsgMain(getString(R.string.broadcast_stop))
         }
@@ -1428,6 +1462,7 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
         }
         if (janusClient != null) {
             janusClient?.destroySession()
+            janusClient = null
         }
     }
 
@@ -1491,7 +1526,7 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
                 if (count < 8) {
                     count++
                     SettingConfig.setNetErrResetCount(this, count)
-                    Handler().postDelayed({
+                    myHandler.postDelayed({
                         AppUpdateHelper.reboot(activity)
                     }, 5000)
                 } else {

+ 2 - 0
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/fragment/BaseCallFragment.kt

@@ -28,6 +28,7 @@ abstract class BaseCallFragment: Fragment() {
     //通话状态:0-去电, 1-来电, 2-探视
     protected var callState : Int = 0
     protected var tcpModel: TcpModel? = null
+    protected var bcPlay: Boolean = false
 
     //计时器
     lateinit var countDownTimer: CountDownTimer
@@ -37,6 +38,7 @@ abstract class BaseCallFragment: Fragment() {
         super.onCreate(savedInstanceState)
         retainInstance = true
         callState = arguments.getInt("call_state")
+        bcPlay = arguments.getBoolean("bc_play")
         if (arguments.getSerializable("tcp_model") != null) {
             tcpModel = arguments.getSerializable("tcp_model") as TcpModel
         }

+ 36 - 17
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/fragment/SkyCallFragment.kt

@@ -52,15 +52,13 @@ class SkyCallFragment: BaseCallFragment(), CallSessionCallback {
     private val handler = Handler(Looper.getMainLooper())
 
     private var visiting: Boolean = false
-
     private var audioCall: Boolean = true
-
     private var callEnded: Boolean = false
-
     private var outGoing: Boolean = false
-
     private var callSuccess: Boolean = false
 
+    private var janusInit = false
+
     override fun getLayId(): Int {
         return R.layout.sky_voice_call_layout
     }
@@ -74,6 +72,18 @@ class SkyCallFragment: BaseCallFragment(), CallSessionCallback {
             interactionVO = Gson().fromJson(tcpModel!!.data.toString(), InteractionVO::class.java)
         }
 
+
+        //判断是否有广播在播放
+        if (bcPlay && callState == 1) {
+            handler.postDelayed({
+                janusInit()
+            }, 2000)
+        } else {
+            janusInit()
+        }
+    }
+
+    private fun janusInit() {
         //初始化 engine
         WebRTCEngine.getInstance().init(true, this.context)
         //初始化 janusClient
@@ -107,7 +117,7 @@ class SkyCallFragment: BaseCallFragment(), CallSessionCallback {
                             acceptCall()
                             janusClient!!.connect()
                         }
-                    }, 1200)
+                    }, 1500)
                 } else {
                     RingPlayHelper.playRingTone(baseActivity, R.raw.ring_tone, true)
                 }
@@ -126,11 +136,13 @@ class SkyCallFragment: BaseCallFragment(), CallSessionCallback {
         videoRoomCallback = VideoRoomCallback(janusClient, room, Constant.SIP_ID.toBigInteger())
         videoRoomCallback!!.callSessionCallback = this
         janusClient!!.setJanusCallback(videoRoomCallback)
+
+        janusInit = true
     }
 
     override fun bindEvent() {
         //去电取消或通话挂断
-        sky_voice_call_hangup.setOnClickListener {
+        /*sky_voice_call_hangup.setOnClickListener {
             RingPlayHelper.stopRingTone()
             if (Constant.CALL_STATE == Constant.CALL_CALLING) {
                 //结束sip通话
@@ -159,7 +171,7 @@ class SkyCallFragment: BaseCallFragment(), CallSessionCallback {
             VoiceUtil.acceptAudioCall(Constant.DEVICE_ID, fromId, interactionVO?.id)
             acceptCall()
             janusClient!!.connect()
-        }
+        }*/
     }
 
     override fun destroy() {
@@ -169,6 +181,7 @@ class SkyCallFragment: BaseCallFragment(), CallSessionCallback {
             sky_voice_call_timer.stop()
         }
         RingPlayHelper.stopRingTone()
+        handler.removeCallbacksAndMessages(null)
     }
 
     private fun startOutgoing() {
@@ -279,15 +292,17 @@ class SkyCallFragment: BaseCallFragment(), CallSessionCallback {
                 }
             }
 
-            if (janusClient!!.webSocketChannel != null) {
-                janusClient!!.callState = EnumType.CallState.Idle
-                if (callState == 0) {
-                    janusClient!!.destroyRoom(janusClient!!.currentHandleId, null)
-                } else {
-                    janusClient!!.leaveRoom()
-                }
+            if (janusInit) {
+                if (janusClient!!.webSocketChannel != null) {
+                    janusClient!!.callState = EnumType.CallState.Idle
+                    if (callState == 0) {
+                        janusClient!!.destroyRoom(janusClient!!.currentHandleId, null)
+                    } else {
+                        janusClient!!.leaveRoom()
+                    }
 
-                janusClient!!.disConnect()
+                    janusClient!!.disConnect()
+                }
             }
 
             backToMain()
@@ -399,12 +414,12 @@ class SkyCallFragment: BaseCallFragment(), CallSessionCallback {
                                 Constant.interactionId = curInteractionVO.id
                                 fromId = curTcpModel.fromId
                                 acceptCall()
-                                if (TextUtils.isEmpty(curInteractionVO.toSipId)) {
+                                /*if (TextUtils.isEmpty(curInteractionVO.toSipId)) {
                                     //通话失败,重置并返回主界面
                                     showMessage("targetSipId empty!")
                                     Constant.CALL_STATE = Constant.CALL_STANDBY
                                     callEnd(true)
-                                }
+                                }*/
                             } else if (curTcpModel.getAction() == TcpAction.VoiceAction.REJECT) {
                                 //我方呼出,对方拒绝
                                 showMessage(R.string.call_reject)
@@ -454,6 +469,10 @@ class SkyCallFragment: BaseCallFragment(), CallSessionCallback {
 
             //外部呼叫按键
             Constant.EVENT_SERIAL_EVENT -> {
+                if (!janusInit) {
+                    return
+                }
+
                 if (messageEvent.message is String) {
                     val serialAction = messageEvent.message as String
                     if (serialAction.equals("cancel")) {

+ 3 - 2
callingbed/src/main/res/layout/sky_voice_call_layout.xml

@@ -48,7 +48,7 @@
                     android:layout_height="wrap_content"
                     android:layout_marginTop="20dp"
                     android:gravity="center"
-                    android:text="@string/call_in_calling"
+                    android:text=""
                     android:textColor="#9E9E9F"
                     android:textSize="32sp" />
 
@@ -80,7 +80,8 @@
                     android:gravity="center"
                     android:text="00:00"
                     android:textColor="@color/white"
-                    android:textSize="24sp" />
+                    android:textSize="24sp"
+                    android:visibility="gone"/>
 
                 <ImageView
                     android:id="@+id/sky_voice_call_hangup"