Przeglądaj źródła

<修改anr问题,修改tcp启动流程,增加tts语音播报功能,需要提前集成语音服务apk>

weizhengliang 4 lat temu
rodzic
commit
fcd44f2184

+ 7 - 7
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHomeActivity.kt

@@ -20,8 +20,10 @@ import com.wdkl.ncs.android.component.home.R
 import com.wdkl.ncs.android.component.home.databinding.WatchActivityHomeBinding
 import com.wdkl.ncs.android.component.home.launch.HomeLaunch
 import com.wdkl.ncs.android.component.home.util.NetHelper
+import com.wdkl.ncs.android.component.home.util.SpeechUtil
 import com.wdkl.ncs.android.component.nursehome.common.Constants
 import com.wdkl.ncs.android.lib.base.BaseActivity
+import com.wdkl.ncs.android.lib.base.BaseApplication
 import com.wdkl.ncs.android.lib.utils.AppTool
 import com.wdkl.ncs.android.lib.utils.push
 import com.wdkl.ncs.android.lib.utils.showMessage
@@ -63,13 +65,6 @@ class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivity
         AppTool.SystemUI.showNavigationBar(this,false)
         AppTool.SystemUI.ImmersiveWithBottomBarColor(this, Color.BLACK)
 
-        Thread ( Runnable {
-            run {
-                //TcpClient.getInstance().init("192.168.1.138", 5080, 9)
-//                TcpClient.getInstance().init("47.106.200.55", 5080, 9)
-                TcpClient.getInstance().init(Constants.tcp_server, Constants.tcp_port, Constants.heart_beat)
-            }
-        }).start()
 
         watch_name_tv.text = Constants.user_name
 
@@ -94,6 +89,10 @@ class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivity
             }
         }
         regReceiver()
+
+        //TTS初始化
+        SpeechUtil.getInstance().init(BaseApplication.appContext)
+        SpeechUtil.getInstance().startSpeechThread()
     }
 
     private fun regReceiver() {
@@ -117,6 +116,7 @@ class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivity
 
     override fun destory() {
         unRegReceiver()
+        SpeechUtil.getInstance().release()
     }
 
     override fun render() {

+ 15 - 1
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchRegisterActivity.kt

@@ -28,6 +28,7 @@ import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchDevicePresenter
 import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
 import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
 import com.wdkl.ncs.android.middleware.model.vo.WatchContactsVO
+import com.wdkl.ncs.android.middleware.tcp.TcpClient
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
 import com.wdkl.ncs.android.middleware.utils.MessageEvent
 import io.reactivex.Observable
@@ -65,9 +66,22 @@ class WatchRegisterActivity: BaseActivity<WatchDevicePresenter, WatchActivityReg
     }
 
     override fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO) {
-        Constants.tcp_server = tcpSeverDTO.tcpServer
+        Constants.tcp_server = tcpSeverDTO.publicIp
         Constants.tcp_port = tcpSeverDTO.tcpPort
         Constants.heart_beat = tcpSeverDTO.readerIdleTime
+
+        startConnectTcpServer()
+        showMessage("开始连接TCP服务器...")
+    }
+
+    private fun startConnectTcpServer() {
+        Thread ( Runnable {
+            run {
+                //TcpClient.getInstance().init("192.168.1.138", 5080, 9)
+                //TcpClient.getInstance().init("47.106.200.55", 5080, 9)
+                TcpClient.getInstance().init(Constants.tcp_server, Constants.tcp_port, Constants.heart_beat)
+            }
+        }).start()
     }
 
     override fun showData(data: DeviceDO) {

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

@@ -5,13 +5,16 @@ import android.content.Intent
 import android.os.IBinder
 import android.util.Log
 import com.google.gson.FieldNamingPolicy
+import com.google.gson.Gson
 import com.google.gson.GsonBuilder
 import com.wdkl.ncs.android.component.home.activity.RTCVoipAudioRingingActivity
 import com.wdkl.ncs.android.component.home.activity.WatchEventDetailActivity
 import com.wdkl.ncs.android.component.home.util.AppUtils
+import com.wdkl.ncs.android.component.home.util.SpeechUtil
 import com.wdkl.ncs.android.lib.utils.push
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
 import com.wdkl.ncs.android.middleware.utils.MessageEvent
 import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.Subscribe
@@ -47,6 +50,16 @@ class TcpHandleService : Service(){
             //data 是 InteractionVO
             //var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
             //var interactionVO = gson.fromJson(tcpModel.data.toString(), InteractionVO::class.java)
+            if (tcpModel.type == TcpType.IM) {
+                SpeechUtil.getInstance().newSpeech("您有新的语音留言待处理", false)
+            } else if (tcpModel.type == TcpType.EVENT) {
+                val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
+                var eventStr = ""
+                if (interactionVO != null) {
+                    eventStr = interactionVO.fromFrameFullName.replace("-", "") + ", 需要" + interactionVO.data
+                }
+                SpeechUtil.getInstance().newSpeech("您有新的事件待处理, " + eventStr, false)
+            }
 
             var intent = Intent()
             intent.setClass(this, WatchEventDetailActivity::class.java)

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

@@ -0,0 +1,180 @@
+package com.wdkl.ncs.android.component.home.util;
+
+import android.content.Context;
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.UtteranceProgressListener;
+import android.text.TextUtils;
+import android.util.Log;
+
+
+import com.wdkl.ncs.android.component.nursehome.common.Constants;
+
+import java.util.ArrayList;
+import java.util.Locale;
+
+public class SpeechUtil {
+    private static final String TAG = "SpeechUtil";
+
+    private TextToSpeech textToSpeech;
+    private static SpeechUtil speech;
+    private int speakIndex = 0;
+    private int loopCount = 1;
+    private boolean isStop = true;
+    public volatile static ArrayList<String> speechTextList = new ArrayList<>();
+    private Thread speechThread;
+    private boolean isSpeechLoop = true;
+    private String speakSpeech;
+    private final Object lockObject = new Object();
+
+    public static SpeechUtil getInstance() {
+        if (speech == null) {
+            synchronized (SpeechUtil.class) {
+                if (speech == null) {
+                    speech = new SpeechUtil();
+                }
+            }
+        }
+        return speech;
+    }
+
+    public void init(Context context) {
+        textToSpeech = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
+            @Override
+            public void onInit(int status) {
+                if (status == TextToSpeech.SUCCESS) {
+                    int supported = textToSpeech.setLanguage(Locale.CHINESE);
+                    if ((supported != TextToSpeech.LANG_AVAILABLE) && (supported != TextToSpeech.LANG_COUNTRY_AVAILABLE)) {
+                        Constants.Companion.setTts_state(1);
+                        Log.d(TAG, "onInit: 当前不支持中文");
+                    } else {
+                        Constants.Companion.setTts_state(2);
+                        Log.d(TAG, "onInit: 支持中文");
+                    }
+                    Log.d(TAG, "onInit: TTS引擎初始化成功");
+                } else {
+                    Constants.Companion.setTts_state(0);
+                    Log.d(TAG, "onInit: TTS引擎初始化失败");
+                }
+            }
+        }, "com.iflytek.speechcloud");
+        textToSpeech.setSpeechRate(0.5f);
+    }
+
+    public void newSpeech(String text, boolean emergency) {
+        synchronized (lockObject) {
+            if (Constants.Companion.getTts_state() == 2) {
+                if (emergency) {
+                    speechTextList.add(0, text);
+                } else {
+                    speechTextList.add(text);
+                }
+                startSpeechThread();
+            }
+        }
+    }
+
+    public synchronized void speak(final String text) {
+        isStop = false;
+        textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null, "uniqueId");
+        textToSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
+            @Override
+            public void onStart(String utteranceId) {
+                //LogUtil.d(TAG, "speak onStart..." + utteranceId);
+            }
+
+            @Override
+            public void onDone(String utteranceId) {
+                speakIndex++;
+                //LogUtil.d(TAG, "speak onDone...index: " + speakIndex + ", loop: " + loopCount);
+                if (speakIndex < loopCount) {
+                    //循环播报
+                    speak(text);
+                } else {
+                    //语音播报完毕
+                    speakIndex = 0;
+                    isStop = true;
+                }
+            }
+
+            @Override
+            public void onError(String utteranceId) {
+                isStop = true;
+                Log.d(TAG, "speak onError..." + utteranceId);
+            }
+        });
+    }
+
+    public void stopSpeak() {
+        if (textToSpeech.isSpeaking()) {
+            textToSpeech.stop();
+            speechTextList.clear();
+            isStop = true;
+            speakIndex = 0;
+            Log.d(TAG, "stop speak");
+        }
+    }
+
+    public void removeSpeak(String text) {
+        synchronized (lockObject) {
+            if (!TextUtils.isEmpty(text) && !TextUtils.isEmpty(speakSpeech)) {
+                if (text.equals(speakSpeech) && textToSpeech.isSpeaking()) {
+                    textToSpeech.stop();
+                    speechTextList.remove(text);
+                    isStop = true;
+                    speakIndex = 0;
+                } else {
+                    speechTextList.remove(text);
+                }
+            }
+        }
+    }
+
+    public void setSpeechLoopCount(int count) {
+        loopCount = count;
+    }
+
+    public void release() {
+        speechTextList.clear();
+        isStop = true;
+        speakIndex = 0;
+        if (textToSpeech != null) {
+            textToSpeech.stop();
+            textToSpeech.shutdown();
+            textToSpeech = null;
+        }
+    }
+
+    public void startSpeechThread() {
+        if (null == speechThread) {
+            speechThread = new Thread(new SpeechRunnable());
+            speechThread.start();
+        } else if (!speechThread.isAlive()) {
+            speechThread.start();
+        }
+    }
+
+    public class SpeechRunnable implements Runnable {
+        public void run() {
+            while (isSpeechLoop) {
+                //synchronized (lockObject) {
+                    if (speechTextList.size() > 0 && isStop) {
+                        speakSpeech = speechTextList.get(0);
+                        Log.d(TAG, "speakSpeech: " + speakSpeech);
+                        speak(speakSpeech);
+
+                        //if (speechTextList.contains(speakSpeech)) {
+                            speechTextList.remove(speakSpeech);
+                        //}
+                    }
+                //}
+
+                try {
+                    Thread.sleep(50);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+}

+ 1 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constants.kt

@@ -11,7 +11,7 @@ class Constants {
         var tcp_server: String? = "192.168.1.138"
         var tcp_port: Int = 5080
         var heart_beat: Int = 9
-
+        var tts_state: Int = 0
     }
 
 

+ 16 - 8
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/dto/TcpSeverDTO.java

@@ -1,8 +1,6 @@
 package com.wdkl.ncs.android.middleware.model.dto;
 
 
-import java.io.Serializable;
-
 /**
  * @author
  * @title: TcpSevserDTO
@@ -11,20 +9,30 @@ import java.io.Serializable;
  * @date 2021/4/1512:21
  */
 
-public class TcpSeverDTO implements Serializable {
+public class TcpSeverDTO {
+
+    private String localIp;
 
-    private String tcpServer;
+    private String publicIp;
 
     private Integer tcpPort;
 
     private Integer readerIdleTime;
 
-    public String getTcpServer() {
-        return tcpServer;
+    public String getLocalIp() {
+        return localIp;
+    }
+
+    public void setLocalIp(String localIp) {
+        this.localIp = localIp;
+    }
+
+    public String getPublicIp() {
+        return publicIp;
     }
 
-    public void setTcpServer(String tcpServer) {
-        this.tcpServer = tcpServer;
+    public void setPublicIp(String publicIp) {
+        this.publicIp = publicIp;
     }
 
     public Integer getTcpPort() {

+ 3 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClient.java

@@ -121,7 +121,9 @@ public class TcpClient {
     //发送消息,线程安全
     public synchronized void sendMsg(String content) {
         Log.e(TAG, "发送的数据 " + content);
-        tcpClientHandler.sendMsg(content);
+        if (tcpClientHandler != null) {
+            tcpClientHandler.sendMsg(content);
+        }
     }
 
     //测试

+ 2 - 2
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClientHandler.java

@@ -88,12 +88,12 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
     public void sendMsg(String msg){
         if (ctx==null){
             System.out.println("ctx is null");
-            try {
+            /*try {
                 Thread.sleep(1000);
                 sendMsg(msg);
             } catch (InterruptedException e) {
                 e.printStackTrace();
-            }
+            }*/
             return;
         }
         ctx.writeAndFlush(Unpooled.copiedBuffer(msg, CharsetUtil.UTF_8));