Forráskód Böngészése

#CHANGE 通话优化

weizhengliang 3 éve
szülő
commit
18d6f97706

+ 101 - 48
nursehome/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/SkyCallFragment.kt

@@ -40,6 +40,8 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
 
     private val handler = Handler(Looper.getMainLooper())
 
+    private var callEnded: Boolean = false
+
     override fun getLayId(): Int {
         return R.layout.sky_voice_call_layout
     }
@@ -79,14 +81,20 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
 
             1 -> {
                 //接受通话
+                Constants.CALL_STATE = Constants.CALL_CALLING
+                DeviceChannel.calling = true
+                val session = gEngineKit?.getCurrentSession()
+                if (session != null) {
+                    session.setSessionCallback(this)
+                }
                 if (onlyAudio) {
                     Handler().postDelayed({
                         joinAudioCall()
-                    }, 1500)
+                    }, 500)
                 } else {
                     Handler().postDelayed({
                         joinVideoCall()
-                    }, 2000)
+                    }, 500)
                 }
             }
         }
@@ -119,15 +127,11 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
         //通话挂断
         sky_voice_call_hangup.setOnClickListener {
             //结束sip通话
-            val session = gEngineKit?.getCurrentSession()
-            if (session != null) {
-                session.leave()
-            }
+            gEngineKit?.endCall()
 
             Constants.CALL_STATE = Constants.CALL_STANDBY
             DeviceChannel.calling = false
             sky_voice_call_timer.stop()
-            backToMain()
         }
     }
 
@@ -151,11 +155,23 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
         val session = gEngineKit?.getCurrentSession()
         if (session != null) {
             Log.e("dds", "audio call session state: " + session.state)
-            session.setSessionCallback(this)
-        }
-        if (session != null && session.state == EnumType.CallState.Incoming) {
-            session.joinHome(session.roomId)
-            session.toggleSpeaker(true)
+
+            if (session.state == EnumType.CallState.Incoming) {
+                session.joinHome(session.roomId)
+                session.toggleSpeaker(true)
+            } else if (session.state == EnumType.CallState.Idle) {
+                callEnd()
+                return
+            }
+
+            Handler().postDelayed({
+                if (session.state == EnumType.CallState.Connected){
+                    showCalling(onlyAudio)
+                } else {
+                    gEngineKit?.endCall()
+                    callEnd()
+                }
+            }, 1500)
         }
     }
 
@@ -164,18 +180,30 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
         val session = gEngineKit?.getCurrentSession()
         if (session != null) {
             Log.e("dds", "video call session state: " + session.state)
-            session.setSessionCallback(this)
-        }
-        if (session != null && session.state == EnumType.CallState.Incoming) {
-            val surfaceView = gEngineKit!!.currentSession.setupLocalVideo(false)
-            if (surfaceView != null) {
-                localSurfaceView = surfaceView as SurfaceViewRenderer
-                localSurfaceView!!.setZOrderMediaOverlay(false)
-                fullscreen_video_frame.addView(localSurfaceView)
+
+            if (session.state == EnumType.CallState.Incoming) {
+                val surfaceView = gEngineKit!!.currentSession.setupLocalVideo(false)
+                if (surfaceView != null) {
+                    localSurfaceView = surfaceView as SurfaceViewRenderer
+                    localSurfaceView!!.setZOrderMediaOverlay(false)
+                    fullscreen_video_frame.addView(localSurfaceView)
+                }
+
+                session.joinHome(session.roomId)
+                session.toggleSpeaker(true)
+            } else if (session.state == EnumType.CallState.Idle) {
+                callEnd()
+                return
             }
 
-            session.joinHome(session.roomId)
-            session.toggleSpeaker(true)
+            Handler().postDelayed({
+                if (session.state == EnumType.CallState.Connected){
+                    showCalling(onlyAudio)
+                } else {
+                    gEngineKit?.endCall()
+                    callEnd()
+                }
+            }, 2000)
         }
     }
 
@@ -192,8 +220,6 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
             ll_voice_call.visibility = View.GONE
         }
 
-        Constants.CALL_STATE = Constants.CALL_CALLING
-        DeviceChannel.calling = true
         sky_voice_call_calling_text.text = "通话中..."
         sky_voice_call_timer.visibility = View.VISIBLE
         sky_voice_call_timer.base = SystemClock.elapsedRealtime()
@@ -217,8 +243,20 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
             if (session == null) {
                 return false
             } else {
+                Constants.CALL_STATE = Constants.CALL_CALLING
+                DeviceChannel.calling = true
                 session.setSessionCallback(this)
                 session.toggleSpeaker(true)
+
+                //3s还未连接上则判定为通话失败
+                Handler().postDelayed({
+                    if (session.state == EnumType.CallState.Connected){
+                        showCalling(onlyAudio)
+                    } else {
+                        gEngineKit?.endCall()
+                        callEnd()
+                    }
+                }, 3000)
             }
         }
         return b
@@ -227,6 +265,11 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
     //通话结束
     private fun callEnd() {
         Log.e("dds", "call end !!!!!!!!!!!!!!!!!!")
+        if (callEnded) {
+            return
+        }
+        callEnded = true
+
         Constants.CALL_STATE = Constants.CALL_STANDBY
         DeviceChannel.calling = false
 
@@ -246,22 +289,24 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
      *******************************************************/
     override fun didChangeState(state: EnumType.CallState?) {
         Log.e("dds", "didChangeState: " + state)
-        handler.post {
+        /*handler.post {
             if (state == EnumType.CallState.Connected) {
                 //更新界面显示
                 showCalling(onlyAudio)
             }
-        }
+        }*/
     }
 
     override fun didDisconnected(userId: String?) {
         handler.post {
+            showMessage("断开连接")
             callEnd()
         }
     }
 
     override fun didError(error: String?) {
         handler.post {
+            showMessage("通话错误")
             callEnd()
         }
     }
@@ -270,11 +315,14 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
     override fun didCreateLocalVideoTrack() {
         Log.e("dds", "didCreateLocalVideoTrack")
         handler.post {
-            if (localSurfaceView == null) {
-                val surfaceView = gEngineKit!!.currentSession.setupLocalVideo(true)
-                Log.e("dds", "didCreateLocalVideoTrack surfaceView: " + surfaceView)
-                if (surfaceView != null) {
-                    localSurfaceView = surfaceView as SurfaceViewRenderer
+            val session = gEngineKit!!.currentSession
+            if (session != null && !callEnded) {
+                if (localSurfaceView == null) {
+                    val surfaceView = gEngineKit!!.currentSession.setupLocalVideo(true)
+                    Log.e("dds", "didCreateLocalVideoTrack surfaceView: " + surfaceView)
+                    if (surfaceView != null) {
+                        localSurfaceView = surfaceView as SurfaceViewRenderer
+                    }
                 }
             }
         }
@@ -284,25 +332,28 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
     override fun didReceiveRemoteVideoTrack(userId: String?) {
         Log.e("dds", "didReceiveRemoteVideoTrack  userId: " + userId)
         handler.post {
-            //本地画面
-            if (localSurfaceView != null) {
-                localSurfaceView!!.setZOrderMediaOverlay(true)
-                if (localSurfaceView!!.parent != null) {
-                    (localSurfaceView!!.parent as ViewGroup).removeView(localSurfaceView)
+            val session = gEngineKit!!.currentSession
+            if (session != null && !callEnded) {
+                //本地画面
+                if (localSurfaceView != null) {
+                    localSurfaceView!!.setZOrderMediaOverlay(true)
+                    if (localSurfaceView!!.parent != null) {
+                        (localSurfaceView!!.parent as ViewGroup).removeView(localSurfaceView)
+                    }
+                    pip_video_frame!!.addView(localSurfaceView)
                 }
-                pip_video_frame!!.addView(localSurfaceView)
-            }
 
-            //远端画面
-            val surfaceView = gEngineKit!!.currentSession.setupRemoteVideo(userId, false)
-            Log.e("dds", "didReceiveRemoteVideoTrack,surfaceView = $surfaceView")
-            if (surfaceView != null) {
-                remoteSurfaceView = surfaceView as SurfaceViewRenderer
-                fullscreen_video_frame.removeAllViews()
-                if (remoteSurfaceView!!.parent != null) {
-                    (remoteSurfaceView!!.parent as ViewGroup).removeView(remoteSurfaceView)
+                //远端画面
+                val surfaceView = gEngineKit!!.currentSession.setupRemoteVideo(userId, false)
+                Log.e("dds", "didReceiveRemoteVideoTrack,surfaceView = $surfaceView")
+                if (surfaceView != null) {
+                    remoteSurfaceView = surfaceView as SurfaceViewRenderer
+                    fullscreen_video_frame.removeAllViews()
+                    if (remoteSurfaceView!!.parent != null) {
+                        (remoteSurfaceView!!.parent as ViewGroup).removeView(remoteSurfaceView)
+                    }
+                    fullscreen_video_frame.addView(remoteSurfaceView)
                 }
-                fullscreen_video_frame.addView(remoteSurfaceView)
             }
         }
     }
@@ -317,7 +368,7 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
                     showMessage("通话中")
                 }
                 EnumType.CallEndReason.Hangup -> {
-                    //showMessage("挂断")
+                    showMessage("通话结束")
                 }
                 EnumType.CallEndReason.MediaError -> {
                     showMessage("媒体错误")
@@ -351,6 +402,7 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
 
     override fun didUserLeave(userId: String?) {
         handler.post {
+            showMessage("通话结束")
             callEnd()
         }
     }
@@ -368,6 +420,7 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
                         if (curTcpModel.getAction() == TcpAction.VoiceAction.HANDOFF) {
                             //对方挂断,不论我方呼出或呼入
                             if (Constants.interactionId == curInteractionVO.id) {
+                                gEngineKit?.endCall()
                                 callEnd()
                             }
                         }

+ 2 - 2
rtc-chat/src/main/java/com/wdkl/skywebrtc/SkyEngineKit.java

@@ -127,14 +127,14 @@ public class SkyEngineKit {
                 if (mCurrentCallSession.getState() == EnumType.CallState.Incoming) {
                     // 接收到邀请,还没同意,发送拒绝
                     mCurrentCallSession.sendRefuse();
-                } else {
+                } else if (mCurrentCallSession.getState() == EnumType.CallState.Connected || mCurrentCallSession.getState() == EnumType.CallState.Connecting) {
                     // 已经接通,挂断电话
                     mCurrentCallSession.leave();
                 }
             } else {
                 if (mCurrentCallSession.getState() == EnumType.CallState.Outgoing) {
                     mCurrentCallSession.sendCancel();
-                } else {
+                } else if (mCurrentCallSession.getState() == EnumType.CallState.Connected || mCurrentCallSession.getState() == EnumType.CallState.Connecting) {
                     // 已经接通,挂断电话
                     mCurrentCallSession.leave();
                 }

+ 8 - 0
rtc-chat/src/main/java/com/wdkl/skywebrtc/engine/webrtc/WebRTCEngine.java

@@ -120,6 +120,14 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
 
             Peer peer = new Peer(_factory, iceServers, id, this);
             peer.setOffer(false);
+
+            if(_localStream==null){
+                if(mCallback!=null){
+                    mCallback.disconnected(EnumType.CallEndReason.Busy);
+                }
+                return;
+            }
+
             // add localStream
             peer.addLocalStream(_localStream);
             // 添加列表

+ 12 - 12
webrtc/src/main/java/com/wdkl/core/socket/SocketManager.java

@@ -128,44 +128,44 @@ public class SocketManager implements IEvent {
 
     // ======================================================================================
     public void createRoom(String room, int roomSize) {
-        if (webSocket != null) {
+        if (webSocket != null && webSocket.isOpen()) {
             webSocket.createRoom(room, roomSize, myId);
         }
 
     }
 
     public void sendInvite(String room, List<String> users, boolean audioOnly) {
-        if (webSocket != null) {
+        if (webSocket != null && webSocket.isOpen()) {
             webSocket.sendInvite(room, myId, users, audioOnly);
         }
     }
 
     public void sendLeave(String room, String userId) {
-        if (webSocket != null) {
+        if (webSocket != null && webSocket.isOpen()) {
             webSocket.sendLeave(myId, room, userId);
         }
     }
 
     public void sendRingBack(String targetId, String room) {
-        if (webSocket != null) {
+        if (webSocket != null && webSocket.isOpen()) {
             webSocket.sendRing(myId, targetId, room);
         }
     }
 
     public void sendRefuse(String room, String inviteId, int refuseType) {
-        if (webSocket != null) {
+        if (webSocket != null && webSocket.isOpen()) {
             webSocket.sendRefuse(room, inviteId, myId, refuseType);
         }
     }
 
     public void sendCancel(String mRoomId, List<String> userIds) {
-        if (webSocket != null) {
+        if (webSocket != null && webSocket.isOpen()) {
             webSocket.sendCancel(mRoomId, myId, userIds);
         }
     }
 
     public void sendJoin(String room) {
-        if (webSocket != null) {
+        if (webSocket != null && webSocket.isOpen()) {
             webSocket.sendJoin(room, myId);
         }
     }
@@ -175,31 +175,31 @@ public class SocketManager implements IEvent {
     }
 
     public void sendOffer(String userId, String sdp) {
-        if (webSocket != null) {
+        if (webSocket != null && webSocket.isOpen()) {
             webSocket.sendOffer(myId, userId, sdp);
         }
     }
 
     public void sendAnswer(String userId, String sdp) {
-        if (webSocket != null) {
+        if (webSocket != null && webSocket.isOpen()) {
             webSocket.sendAnswer(myId, userId, sdp);
         }
     }
 
     public void sendIceCandidate(String userId, String id, int label, String candidate) {
-        if (webSocket != null) {
+        if (webSocket != null && webSocket.isOpen()) {
             webSocket.sendIceCandidate(myId, userId, id, label, candidate);
         }
     }
 
     public void sendTransAudio(String userId) {
-        if (webSocket != null) {
+        if (webSocket != null && webSocket.isOpen()) {
             webSocket.sendTransAudio(myId, userId);
         }
     }
 
     public void sendDisconnect(String room, String userId) {
-        if (webSocket != null) {
+        if (webSocket != null && webSocket.isOpen()) {
             webSocket.sendDisconnect(room, myId, userId);
         }
     }