Преглед на файлове

## [1.1.15] version 34 - 2020-08-02
### Fixed
- 在对话界面增加对通话状态的监听并进行相应的处理
- 如果呼出信号正常,界面失败。接收方在进入通话后会自动挂断并提示对方已挂断
- 解决一个首次安装后呼出导致崩溃的问题
### Added
- 增加了若干个公用免费stun服务器

allen преди 3 години
родител
ревизия
005209265f

+ 2 - 2
WebRTC/src/main/java/com/wdkl/core/socket/MyWebSocket.java

@@ -87,6 +87,7 @@ public class MyWebSocket extends WebSocketClient {
     // ---------------------------------------处理接收消息-------------------------------------
 
     private void handleMessage(String message) {
+        Log.i(TAG," ws msg : " + message);
         Map map = JSON.parseObject(message, Map.class);
         String eventName = (String) map.get("eventName");
         if (eventName == null) return;
@@ -151,8 +152,6 @@ public class MyWebSocket extends WebSocketClient {
         if (eventName.equals("__disconnect")) {
             handleDisConnect(map);
         }
-
-
     }
 
     private void handleDisConnect(Map map) {
@@ -276,6 +275,7 @@ public class MyWebSocket extends WebSocketClient {
 
     /**
      * ------------------------------发送消息----------------------------------------
+     * 返回得到__peer
      */
     public void createRoom(String room, int roomSize, String myId) {
         Map<String, Object> map = new HashMap<>();

+ 2 - 2
build.gradle

@@ -47,12 +47,12 @@ buildscript {
     /**
      * APP版本码
      */
-    ext.app_version_code = 33
+    ext.app_version_code = 34
 
     /**
      * APP版本号
      */
-    ext.app_version = "1.1.14"
+    ext.app_version = "1.1.15"
 
     /**
      * 项目依赖库

+ 149 - 54
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WebRTCVoipAudioActivity.kt

@@ -3,7 +3,7 @@ package com.wdkl.ncs.android.component.home.activity
 import android.app.Activity
 import android.bluetooth.BluetoothAdapter
 import android.bluetooth.BluetoothHeadset
-import android.media.AudioManager
+import android.graphics.Color
 import android.os.Bundle
 import android.os.CountDownTimer
 import android.os.Handler
@@ -27,7 +27,9 @@ import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
 import com.wdkl.ncs.android.middleware.utils.MessageEvent
 import com.wdkl.skywebrtc.CallSession
+import com.wdkl.skywebrtc.CallSession.CallSessionCallback
 import com.wdkl.skywebrtc.EnumType
+import com.wdkl.skywebrtc.EnumType.CallEndReason
 import com.wdkl.skywebrtc.SkyEngineKit
 import com.wdkl.skywebrtc.except.NotInitializedException
 import kotlinx.android.synthetic.main.activity_sip_voip_audio.bao_mother_name_tv
@@ -35,12 +37,13 @@ import kotlinx.android.synthetic.main.activity_sip_voip_audio.call_duration_tv
 import kotlinx.android.synthetic.main.activity_sip_voip_audio.hang_up_imagev
 import kotlinx.android.synthetic.main.activity_sip_voip_audio.room_number_tv
 import kotlinx.android.synthetic.main.activity_web_rtc_voip_audio.*
+import kotlinx.android.synthetic.main.watch_activity_home2.*
 import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
 import java.util.*
 
-class WebRTCVoipAudioActivity : Activity(), View.OnClickListener {
+class WebRTCVoipAudioActivity : Activity(), View.OnClickListener, CallSessionCallback {
     var TAG = WebRTCVoipAudioActivity::class.java.simpleName
 
     var ACTION = "ACTION"
@@ -76,23 +79,12 @@ class WebRTCVoipAudioActivity : Activity(), View.OnClickListener {
         DeviceChannel.calling = true
         init()
 
-        try {
-            gEngineKit = SkyEngineKit.Instance()
-        } catch (e: NotInitializedException) {
-            SkyEngineKit.init(VoipEvent()) //重新初始化
-            try {
-                gEngineKit = SkyEngineKit.Instance()
-            } catch (ex: NotInitializedException) {
-                finish()
-            }
-        }
-
         targetId = intent.getStringExtra("targetId")
         Log.i(TAG, "SIP账号$targetId")
         tcpModel = intent.getSerializableExtra("TcpModel") as TcpModel
         action = intent.getStringExtra(ACTION)
 
-        Log.i(TAG, "tcpModel" + tcpModel.action)
+        Log.i(TAG, "tcpModel.action  " + tcpModel.action)
 
         if (tcpModel.type == TcpType.VOICE) {
             if (tcpModel.action === TcpAction.VoiceAction.CALL) {
@@ -107,7 +99,6 @@ class WebRTCVoipAudioActivity : Activity(), View.OnClickListener {
         }
 
         if (action == CALLING) {
-            Log.i(TAG, "自己同意 拨打过去。。。")
             createCallout()
 
             call_duration_tv.visibility = View.VISIBLE
@@ -127,6 +118,17 @@ class WebRTCVoipAudioActivity : Activity(), View.OnClickListener {
     fun init() {
         hang_up_imagev.setOnClickListener(this)
         hands_free_image.setOnClickListener(this)
+
+        try {
+            gEngineKit = SkyEngineKit.Instance()
+        } catch (e: NotInitializedException) {
+            SkyEngineKit.init(VoipEvent()) //重新初始化
+            try {
+                gEngineKit = SkyEngineKit.Instance()
+            } catch (ex: NotInitializedException) {
+                finish()
+            }
+        }
     }
 
     fun createCallout(){
@@ -139,22 +141,50 @@ class WebRTCVoipAudioActivity : Activity(), View.OnClickListener {
         if ((interactionVO.fromClerkId!=null && interactionVO.fromClerkId>=0) && interactionVO.fromDeviceId!=Constants.deviceId){
             Handler().postDelayed({
                 val session = gEngineKit?.currentSession
-                if (session != null)
+                if (session != null) {
+                    session.setSessionCallback(this)
                     Log.d(TAG, "session = " + session + "; session.getState() = " + session.state)
-                if (session != null && session.state == EnumType.CallState.Incoming) {
-                    session.joinHome(session.roomId)
-                    setAudioDeviceOut(session)
-                } else if (session != null) {
-                    session.sendRefuse()
+                    if (session.state == EnumType.CallState.Incoming){
+                        session.joinHome(session.roomId)
+                        setAudioDeviceOut(session)
+                    } else {
+                        showMessage("对方忙线中")
+                        AppTool.Time.delay(800) {
+                            finish()
+                        }
+                    }
+                } else {
+                    showMessage("对方已挂断")
+                    AppTool.Time.delay(800) {
+                        finish()
+                    }
                 }
             },1000)
         } else {
             var room = UUID.randomUUID().toString() + System.currentTimeMillis()
             Log.i(TAG, "生成的房间号room " + room + "sipid targetId" + targetId)
-            gEngineKit?.startOutCall(applicationContext, room, targetId, true)
+            val outCallResult = gEngineKit?.startOutCall(applicationContext, room, targetId, true)
             val session = gEngineKit?.currentSession
-            if (session!=null) {
-                setAudioDeviceOut(session)
+            if (session == null){
+                showMessage("通话失败,请重试")
+                AppTool.Time.delay(800) {
+                    finish()
+                }
+            } else {
+                session.setSessionCallback(this)
+                if (outCallResult!!) {
+                    setAudioDeviceOut(session)
+                } else {
+                    if (session.state != EnumType.CallState.Idle) {
+                        showMessage("对方忙线中")
+                    } else {
+                        showMessage("通话失败,请重试")
+                        init()
+                    }
+                    AppTool.Time.delay(800) {
+                        finish()
+                    }
+                }
             }
         }
     }
@@ -170,7 +200,7 @@ class WebRTCVoipAudioActivity : Activity(), View.OnClickListener {
         } else {
             Handler().postDelayed({
                 //防止建立连接的时候 不能成功切换外音
-                session?.toggleSpeaker(true)
+                session.toggleSpeaker(true)
             }, 3000)
         }
     }
@@ -184,17 +214,13 @@ class WebRTCVoipAudioActivity : Activity(), View.OnClickListener {
                 Log.i(TAG,"声音切换点击")
                 if (!handsFree) {
                     hands_free_image.setImageResource(R.drawable.av_handfree_hover)
-                    val session = gEngineKit?.getCurrentSession()
-                    if (session != null) {
-                        session?.toggleSpeaker(true)
-                    }
+                    val session = gEngineKit?.currentSession
+                    session?.toggleSpeaker(true)
                     handsFree = true
                 } else {
                     hands_free_image.setImageResource(R.drawable.av_handfree)
-                    val session = gEngineKit?.getCurrentSession()
-                    if (session != null) {
-                        session?.toggleSpeaker(false)
-                    }
+                    val session = gEngineKit?.currentSession
+                    session?.toggleSpeaker(false)
                     handsFree = false
                 }
             }
@@ -223,12 +249,9 @@ class WebRTCVoipAudioActivity : Activity(), View.OnClickListener {
                 TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
             }
 
-            //webrtc
-            val session = gEngineKit?.getCurrentSession()
-            if (session != null) {
-                session.leave()
+            AppTool.Time.delay(800) {
+                finish()
             }
-            finish()
         }
     }
 
@@ -256,32 +279,26 @@ class WebRTCVoipAudioActivity : Activity(), View.OnClickListener {
                 createCallout()
             } else if (tcpModel.action == TcpAction.VoiceAction.HANDOFF) { //对方挂断
                 call_duration_tv.stop()
-                val session = gEngineKit?.getCurrentSession()
-                if (session != null) {
-                    session.leave()
+                AppTool.Time.delay(800) {
+                    finish()
                 }
-                DeviceChannel.calling = false;
-                finish()
             } else if (tcpModel.action === TcpAction.VoiceAction.REJECT) {
                 //voiceStatus.setText("对方拒绝接听");
                 showMessage("对方拒绝接听")
-                MediaPlayHelper.getInstance().stopMusic()
-                DeviceChannel.calling = false;
-                finish()
+                AppTool.Time.delay(800) {
+                    finish()
+                }
             } else if (tcpModel.action === TcpAction.VoiceAction.CALLING) {
-                //voiceStatus.setText("对方正在通话");
                 showMessage("对方正在通话")
-                DeviceChannel.calling = false;
-                AppTool.Time.delay(3000) {
-                    MediaPlayHelper.getInstance().stopMusic()
+                AppTool.Time.delay(800) {
                     finish()
                 }
             } else if (tcpModel.action === TcpAction.VoiceAction.FAILED) {
                 //voiceStatus.setText("对方拒绝");
                 showMessage("呼叫失败,对方可能不在线")
-                DeviceChannel.calling = false;
-                MediaPlayHelper.getInstance().stopMusic()
-                finish()
+                AppTool.Time.delay(800) {
+                    finish()
+                }
             }
         }
     }
@@ -299,16 +316,94 @@ class WebRTCVoipAudioActivity : Activity(), View.OnClickListener {
 
     override fun onDestroy() {
         super.onDestroy()
-        //todo 状态设置为未在通话中
         DeviceChannel.calling = false
         if(countDownTimer != null){
             countDownTimer.cancel()
         }
         MediaPlayHelper.getInstance().stopMusic()
         EventBus.getDefault().unregister(this)
+
+        val session = gEngineKit?.currentSession
+        session?.leave()
     }
 
     override fun onResume() {
         super.onResume()
     }
+
+    override fun didChangeState(var1: EnumType.CallState?) {
+
+    }
+
+    override fun didDisconnected(userId: String?) {
+        runOnUiThread(Runnable {
+            showMessage("对方挂断")
+            AppTool.Time.delay(800) {
+                finish()
+            }
+        })
+    }
+
+    override fun didCreateLocalVideoTrack() {
+    }
+
+    override fun didError(error: String?) {
+        if (error != null) {
+            Log.e(TAG, error)
+            runOnUiThread(Runnable {
+                showMessage(error)
+                AppTool.Time.delay(800) {
+                    finish()
+                }
+            })
+        }
+    }
+
+    override fun didReceiveRemoteVideoTrack(userId: String?) {
+
+    }
+
+    override fun didCallEndWithReason(var1: EnumType.CallEndReason?) {
+        runOnUiThread(Runnable {
+            when (var1) {
+                CallEndReason.Busy -> {
+                    showMessage("忙线中")
+                }
+                CallEndReason.AcceptByOtherClient -> {
+                    showMessage("通话中")
+                }
+                CallEndReason.Hangup -> {
+                    //showMessage("对方挂起")
+                }
+                CallEndReason.MediaError -> {
+                    showMessage("系统错误,请重试")
+                }
+                CallEndReason.OpenCameraFailure -> {
+                    showMessage("打开摄像头错误")
+                }
+                CallEndReason.RemoteHangup -> {
+                    showMessage("对方挂断")
+                }
+                CallEndReason.RemoteSignalError -> {
+                    showMessage("对方信号出错")
+                }
+                CallEndReason.SignalError -> {
+                    showMessage("信号错误")
+                }
+                CallEndReason.Timeout -> {
+                    showMessage("连接超时")
+                }
+            }
+            AppTool.Time.delay(800) {
+                finish()
+            }
+        })
+    }
+
+    override fun didChangeMode(isAudioOnly: Boolean) {
+    }
+
+    override fun didUserLeave(userId: String?) {
+        finish()
+    }
 }

+ 0 - 1
home/src/main/code/com/wdkl/ncs/android/component/home/service/WdKeepAliveService.kt

@@ -76,7 +76,6 @@ class WdKeepAliveService : AbsWorkService() {
     }
 
     override fun stopWork() {
-        EventBus.getDefault().unregister(this)
     }
 
     override fun onBindService(p0: Intent?, p1: Void?): IBinder {

+ 6 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/util/SpeechUtil.java

@@ -97,6 +97,9 @@ public class SpeechUtil {
     }
 
     public synchronized void speak(final String text) {
+        if (textToSpeech==null){
+            return;
+        }
         isStop = false;
         textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null, "uniqueId");
         textToSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@@ -128,6 +131,9 @@ public class SpeechUtil {
     }
 
     public void stopSpeak() {
+        if (textToSpeech==null){
+            return;
+        }
         if (textToSpeech.isSpeaking()) {
             textToSpeech.stop();
             speechTextList.clear();

+ 2 - 0
keepalive/src/main/java/com/wdkl/ncs/keepbackground/watch/WatchDogService.java

@@ -87,6 +87,8 @@ public class WatchDogService extends Service {
             } else {
                 //Android 4.4- 使用 AlarmManager
                 if(WatchProcessPrefHelper.getWorkService()!=null) {
+
+
                     AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
                     Intent i = new Intent(WatchDogService.this, WatchProcessPrefHelper.mWorkServiceClass);
                     mPendingIntent = PendingIntent.getService(WatchDogService.this, HASH_CODE, i, PendingIntent.FLAG_UPDATE_CURRENT);

+ 10 - 0
readme.md

@@ -26,6 +26,16 @@
 
 ---
 
+## [1.1.15] version 34 - 2020-08-02
+### Fixed
+- 在对话界面增加对通话状态的监听并进行相应的处理
+- 如果呼出信号正常,界面失败。接收方在进入通话后会自动挂断并提示对方已挂断
+- 解决一个首次安装后呼出导致崩溃的问题
+### Added
+- 增加了若干个公用免费stun服务器
+
+---
+
 ## [1.1.14] version 33 - 2020-08-02
 ### Changed
 - 注册界面增加注册完成按钮,管理员添加完设备后通过点击此按钮进入

+ 0 - 5
rtc-chat/src/main/java/com/wdkl/skywebrtc/CallSession.java

@@ -258,13 +258,8 @@ public class CallSession implements EngineCallback {
                 if (sessionCallback != null && sessionCallback.get() != null) {
                     sessionCallback.get().didCreateLocalVideoTrack();
                 }
-
             }
-
-
         }));
-
-
     }
 
     // 新成员进入

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

@@ -82,7 +82,6 @@ public class SkyEngineKit {
         // 创建房间
         mCurrentCallSession.createHome(room, 2);
 
-
         return true;
     }
 
@@ -112,7 +111,6 @@ public class SkyEngineKit {
         mCurrentCallSession.shouldStartRing();
         mCurrentCallSession.sendRingBack(targetId, room);
 
-
         return true;
     }
 

+ 2 - 3
rtc-chat/src/main/java/com/wdkl/skywebrtc/engine/webrtc/Peer.java

@@ -189,7 +189,6 @@ public class Peer implements SdpObserver, PeerConnection.Observer {
         if (newState == PeerConnection.IceConnectionState.DISCONNECTED || newState == PeerConnection.IceConnectionState.FAILED) {
             mEvent.onDisconnected(mUserId);
         }
-
     }
 
     @Override
@@ -301,12 +300,12 @@ public class Peer implements SdpObserver, PeerConnection.Observer {
 
     @Override
     public void onCreateFailure(String error) {
-        Log.i(TAG, " SdpObserver onCreateFailure:" + error);
+        Log.e(TAG, " SdpObserver onCreateFailure:" + error);
     }
 
     @Override
     public void onSetFailure(String error) {
-        Log.i(TAG, "SdpObserver onSetFailure:" + error);
+        Log.e(TAG, "SdpObserver onSetFailure:" + error);
     }
 
 

+ 29 - 11
rtc-chat/src/main/java/com/wdkl/skywebrtc/engine/webrtc/WebRTCEngine.java

@@ -208,7 +208,6 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
         if (peer != null) {
             IceCandidate iceCandidate = new IceCandidate(id, label, candidate);
             peer.addRemoteIceCandidate(iceCandidate);
-
         }
     }
 
@@ -515,9 +514,28 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
     // -----------------------------其他方法--------------------------------
     private void initIceServer() {
         // 初始化一些stun和turn的地址
-//        PeerConnection.IceServer var1 = PeerConnection.IceServer.builder("stun:stun.l.google.com:19302")
-//                .createIceServer();
-//        iceServers.add(var1);
+        iceServers.add(PeerConnection.IceServer.builder("stun:stun.xten.com:3478").createIceServer());
+        iceServers.add(PeerConnection.IceServer.builder("stun:stun.voipbuster.com:3478").createIceServer());
+        iceServers.add(PeerConnection.IceServer.builder("stun:stun.sipgate.net:3478").createIceServer());
+        iceServers.add(PeerConnection.IceServer.builder("stun:stun.ideasip.com:3478").createIceServer());
+        iceServers.add(PeerConnection.IceServer.builder("stun:stun.internetcalls.com:3478").createIceServer());
+        /*
+stun.xten.com
+stun.voipbuster.com
+stun.sipgate.net
+stun.ekiga.net
+stun.ideasip.com
+stun.schlund.de
+stun.voiparound.com
+stun.voipstunt.com
+stun.counterpath.com
+stun.1und1.de
+stun.gmx.net
+stun.callwithus.com
+stun.counterpath.net
+stun.internetcalls.com
+numb.viagenie.ca
+         */
 
         PeerConnection.IceServer var11 = PeerConnection.IceServer
                 .builder("stun:"+serverIP+":3478?transport=udp")
@@ -531,15 +549,15 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
                 .setPassword(turnUserPwd)
                 .setTlsCertPolicy(PeerConnection.TlsCertPolicy.TLS_CERT_POLICY_INSECURE_NO_CHECK)
                 .createIceServer();
-//        PeerConnection.IceServer var13 = PeerConnection.IceServer
-//                .builder("turn:"+serverIP+":3478?transport=tcp")
-//                .setUsername(turnUser)
-//                .setPassword(turnUserPwd)
-//                .setTlsCertPolicy(PeerConnection.TlsCertPolicy.TLS_CERT_POLICY_INSECURE_NO_CHECK)
-//                .createIceServer();
+        PeerConnection.IceServer var13 = PeerConnection.IceServer
+                .builder("turn:"+serverIP+":3478?transport=tcp")
+                .setUsername(turnUser)
+                .setPassword(turnUserPwd)
+                .setTlsCertPolicy(PeerConnection.TlsCertPolicy.TLS_CERT_POLICY_INSECURE_NO_CHECK)
+                .createIceServer();
         iceServers.add(var11);
         iceServers.add(var12);
-//        iceServers.add(var13);
+        iceServers.add(var13);
     }