Browse Source

fix: 数字人视频兼容

master
高志龙 3 months ago
parent
commit
084dfe528a
  1. 3
      app/build.gradle
  2. 10
      app/src/main/java/qianmu/container/activity/H5/UpdateFileActivity.java
  3. 230
      app/src/main/java/qianmu/container/activity/H5/WebViewActivity.java
  4. 800
      app/src/main/java/qianmu/container/activity/H5/WebViewActivity11.java
  5. 6
      app/src/main/java/qianmu/container/app/Constant.java
  6. 1
      app/src/main/java/qianmu/container/app/MyApplication.java
  7. 9
      app/src/main/java/qianmu/container/data/DeviceData.java
  8. 27
      app/src/main/java/qianmu/container/util/FileUtil.java
  9. 137
      app/src/main/java/qianmu/container/util/TTSUtil.java
  10. 5
      app/src/main/res/layout/activity_webview.xml

3
app/build.gradle

@ -12,13 +12,14 @@ android {
minSdkVersion 22 minSdkVersion 22
targetSdkVersion 30 targetSdkVersion 30
versionCode 6 versionCode 6
versionName "V2.0.8.14"
versionName "V2.0.8.15"
// 2.0.8.2 // 2.0.8.2
// 2.0.8.3 mac修改 // 2.0.8.3 mac修改
// V2.0.8.5 // V2.0.8.5
// 2.0.8.6 // 2.0.8.6
// 2.0.8.12 // 2.0.8.12
//V2.0.8.14 5 //V2.0.8.14 5
//V2.0.8.15
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles 'consumer-rules.pro' consumerProguardFiles 'consumer-rules.pro'

10
app/src/main/java/qianmu/container/activity/H5/UpdateFileActivity.java

@ -420,10 +420,8 @@ public class UpdateFileActivity extends BaseActivity {
// 思必驰授权 // 思必驰授权
private void initSbcSDK(){ private void initSbcSDK(){
String code = DeviceData.getDeviceInfo(DeviceData.VOICE_CODE);
LoggerUtil.e("设备语音code: ", code);
if(!StringUtil.isEmpty(code)){
String dataJson = DeviceData.getDeviceInfo(DeviceData.VOICE_CONFIG);
String dataJson = DeviceData.getDeviceInfo(DeviceData.VOICE_CONFIG);
if(!StringUtil.isEmpty(dataJson)){
JsonObject jsonObject = new JsonParser().parse(dataJson).getAsJsonObject(); JsonObject jsonObject = new JsonParser().parse(dataJson).getAsJsonObject();
String productId = jsonObject.get("productId").getAsString(); String productId = jsonObject.get("productId").getAsString();
String apiKey = jsonObject.get("apiKey").getAsString(); String apiKey = jsonObject.get("apiKey").getAsString();
@ -436,12 +434,12 @@ public class UpdateFileActivity extends BaseActivity {
.setProductKey(productKey) .setProductKey(productKey)
.setProductSecret(productSecret) .setProductSecret(productSecret)
.create(); .create();
//config.setExtraParameter("DEVICE_NAME", code);
DUILiteSDK.init(getApplicationContext()); DUILiteSDK.init(getApplicationContext());
// SDK 授权 // SDK 授权
DUILiteSDK.doAuth(getApplicationContext(), config, new DUILiteSDK.InitListener() { DUILiteSDK.doAuth(getApplicationContext(), config, new DUILiteSDK.InitListener() {
@Override @Override
public void success() { public void success() {
MyApplication.getInstance().duiliteConfig = true;
LoggerUtil.d("DUILiteSDKInit: ", "授权成功! "); LoggerUtil.d("DUILiteSDKInit: ", "授权成功! ");
} }
@Override @Override
@ -453,7 +451,7 @@ public class UpdateFileActivity extends BaseActivity {
LoggerUtil.e("initSDK: ","语音授权码获取失败"); LoggerUtil.e("initSDK: ","语音授权码获取失败");
} }
}else{ }else{
LoggerUtil.e("initSDK: ","语音激活码获取失败");
LoggerUtil.e("initSDK: ","语音授权码获取失败");
} }
} }

230
app/src/main/java/qianmu/container/activity/H5/WebViewActivity.java

@ -1,10 +1,14 @@
package qianmu.container.activity.H5; package qianmu.container.activity.H5;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color;
import android.media.MediaPlayer;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
@ -15,6 +19,7 @@ import android.util.DisplayMetrics;
import android.util.Log; import android.util.Log;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager; import android.view.WindowManager;
import android.webkit.ConsoleMessage; import android.webkit.ConsoleMessage;
import android.webkit.CookieManager; import android.webkit.CookieManager;
@ -25,6 +30,8 @@ import android.webkit.WebResourceResponse;
import android.webkit.WebSettings; import android.webkit.WebSettings;
import android.webkit.WebView; import android.webkit.WebView;
import android.webkit.WebViewClient; import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.VideoView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.databinding.DataBindingUtil; import androidx.databinding.DataBindingUtil;
@ -47,13 +54,18 @@ import com.shockman.sm.vendor.SmUtils;
import com.shockman.sm.vendor.TargetVo; import com.shockman.sm.vendor.TargetVo;
import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.EventBus;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map;
import java.util.Scanner; import java.util.Scanner;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@ -103,12 +115,16 @@ public class WebViewActivity extends BaseActivity {
//static String HtmlUrl = "http://192.168.1.196:5501/index.html"; //static String HtmlUrl = "http://192.168.1.196:5501/index.html";
int time = 0; int time = 0;
String interfaceRequestData=""; String interfaceRequestData="";
private VideoView currentVideo; //当前
private VideoView proVideo; //上一个视频
private boolean isChatMan=false; //是否是数字人项目
// 语音听写对象 // 语音听写对象
private AICloudASREngine mEngine; private AICloudASREngine mEngine;
private AICloudASRIntent aiCloudASRIntent; private AICloudASRIntent aiCloudASRIntent;
private TTSUtil ttsUtil; private TTSUtil ttsUtil;
private String oldString=""; private String oldString="";
private String resultString = "";
private Map<String, VideoView> videoMap = new HashMap<>();
private String videoAfter="";
// 语音听写对象 // 语音听写对象
private ASR mAsr; private ASR mAsr;
@ -175,6 +191,74 @@ public class WebViewActivity extends BaseActivity {
DeviceUtil.screenType(this); DeviceUtil.screenType(this);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
binding = DataBindingUtil.setContentView(this, R.layout.activity_webview); binding = DataBindingUtil.setContentView(this, R.layout.activity_webview);
String jsonString = FileUtil.readLocalJsonForStorage(this, StringUtil.strSplice(Constant.CACHE_PATH3,"/JSON/getChatManVideo.json"));
if(!StringUtil.isEmpty(jsonString)){ //是AI
LoggerUtil.e("getChatManVideo:","有数字人视频");
// 设置背景透明度
binding.web.setBackgroundColor(Color.TRANSPARENT);
isChatMan = true;
try {
JSONObject jsonObject = new JSONObject(jsonString);
JSONArray dataArray = jsonObject.getJSONArray("data");
for (int i = 0; i < dataArray.length(); i++) {
JSONObject videoObj = dataArray.getJSONObject(i).getJSONObject("content");
String vType = videoObj.getString("type");
Uri videoUri = Uri.parse(StringUtil.strSplice(Constant.CACHE_PATH3,videoObj.getJSONArray("url").getString(0)));
VideoView video = new VideoView(this);
video.setId(View.generateViewId());
FrameLayout.LayoutParams videoParams = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, // 宽度匹配父布局
ViewGroup.LayoutParams.MATCH_PARENT // 高度匹配父布局
);
video.setLayoutParams(videoParams);
if("bg".equals(vType)){
currentVideo = video;
proVideo = video;
video.setVisibility(View.VISIBLE);
}else{
video.setVisibility(View.GONE);
}
binding.videoLayout.addView(video);
video.setVideoURI(videoUri);
if("chatback".equals(vType) || "chatto".equals(vType)){
video.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
video.start();
}
});
video.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
return true; // 返回true表示已处理,不会弹出系统默认提示
}
});
video.setOnCompletionListener( mp -> changeVideo("bg"));
}else{
video.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.setLooping(true); // 可选:设置循环播
video.start();
}
});
video.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
return true;
}
});
}
videoMap.put(vType, video);
}
}catch (JSONException e){
e.printStackTrace();
}
}
//设置密码 //设置密码
initPass(); initPass();
try{ try{
@ -191,6 +275,86 @@ public class WebViewActivity extends BaseActivity {
LoggerUtil.e("语音ASR:","初始化失败!"); LoggerUtil.e("语音ASR:","初始化失败!");
} }
} }
//切换视频状态
private void changeVideoAfter(){
if("".equals(videoAfter)){ //新状态正常
changeVideo("back");
}else{ //新状态彩蛋
changeVideo("to");
}
}
//切换视频
public void changeVideo(String type){
LoggerUtil.e("切换视频", type.trim()+" isChatMan: "+String.valueOf(isChatMan));
if(!isChatMan){
return;
}
VideoView nextVideo;
proVideo.clearAnimation();
currentVideo.clearAnimation();
switch(type.trim()){
case "back" :
nextVideo = videoMap.get("chatback");
break;
case "to" :
nextVideo = videoMap.get("chatto");
break;
case "bg" :
nextVideo = "".equals(videoAfter) ? videoMap.get("bg") : videoMap.get("bg1");
break;
case "answer" :
nextVideo = "".equals(videoAfter) ? videoMap.get("speek") : videoMap.get("speek1");
break;
case "hello" :
nextVideo = "".equals(videoAfter) ? videoMap.get("hello") : videoMap.get("hello1");
break;
default:
nextVideo = "".equals(videoAfter) ? videoMap.get("bg") : videoMap.get("bg1");
}
// 检查是否是重复切换
if (nextVideo == currentVideo) {
return;
}
proVideo = currentVideo;
proVideo.animate()
.alpha(0.5f)
.setDuration(240)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
proVideo.pause();
proVideo.stopPlayback();
proVideo.setVisibility(View.GONE);
proVideo.setAlpha(1.0f);
}
})
.start();
nextVideo.setAlpha(0.5f);
nextVideo.setVisibility(View.VISIBLE);
currentVideo = nextVideo;
// 开始淡入动画
currentVideo.animate()
.alpha(1.0f)
.setDuration(300)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
currentVideo.seekTo(0);
currentVideo.start();
currentVideo.setAlpha(1.0f);
LoggerUtil.e("切换视频:","动画播放完成");
}
})
.start();
}
@Override @Override
protected void setData() { protected void setData() {
@ -410,7 +574,18 @@ public class WebViewActivity extends BaseActivity {
handler.removeMessages(TYPE_REFURBISH_WEBVIEW); handler.removeMessages(TYPE_REFURBISH_WEBVIEW);
handler.sendEmptyMessageDelayed(TYPE_REFURBISH_WEBVIEW,3000); handler.sendEmptyMessageDelayed(TYPE_REFURBISH_WEBVIEW,3000);
} }
// h5调用android:彩蛋
@JavascriptInterface
public void changeVideoState(String txt) {
LoggerUtil.e(TAG,"JS调用了Android的方法:changeVideoState()");
videoAfter = txt;
runOnUiThread(new Runnable() {
@Override
public void run() {
changeVideoAfter();
}
});
}
// h5调用android:开始识别语音 // h5调用android:开始识别语音
@JavascriptInterface @JavascriptInterface
public void startRecord() { public void startRecord() {
@ -459,11 +634,40 @@ public class WebViewActivity extends BaseActivity {
LoggerUtil.e(TAG,"JS调用了Android的方法:stopTTS()"); LoggerUtil.e(TAG,"JS调用了Android的方法:stopTTS()");
if("sbc".equals(Constant.TTSHome)){ if("sbc".equals(Constant.TTSHome)){
ttsUtil.stopTTs(); ttsUtil.stopTTs();
runOnUiThread(new Runnable() {
@Override
public void run() {
changeVideo("bg");
}
});
}else if("kdxf".equals(Constant.TTSHome)){ }else if("kdxf".equals(Constant.TTSHome)){
kxdfttsUtil.stopTTs(); kxdfttsUtil.stopTTs();
} }
} }
@JavascriptInterface
public void stopTTS(String str) {
LoggerUtil.e(TAG,"JS调用了Android的方法:stopTTS()");
ttsUtil.stopTTs();
if("change".equals(str)){
runOnUiThread(new Runnable() {
@Override
public void run() {
changeVideo("bg");
}
});
}
}
// h5调用android:播放指定视频
@JavascriptInterface
public void playAudio(String str) {
LoggerUtil.e("JS调用了Android的方法:playAudio", str);
runOnUiThread(new Runnable() {
@Override
public void run() {
changeVideo(str);
}
});
}
// h5调用android:新版指路机传入的数据 // h5调用android:新版指路机传入的数据
@JavascriptInterface @JavascriptInterface
public void jxbData(String data) { public void jxbData(String data) {
@ -541,7 +745,8 @@ public class WebViewActivity extends BaseActivity {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
binding.web.loadUrl(StringUtil.strSplice("javascript:window.voiceContent('{\"data\":\""+msg+"\",\"flag\":0}');"));
//binding.web.loadUrl(StringUtil.strSplice("javascript:window.voiceContent('{\"data\":\""+msg+"\",\"flag\":0}');"));
binding.web.loadUrl(StringUtil.strSplice("javascript:window.giveAskText('" + msg + "');"));
} }
}); });
} }
@ -625,6 +830,7 @@ public class WebViewActivity extends BaseActivity {
} }
break; break;
case Constant.VOID_STOP: case Constant.VOID_STOP:
changeVideo("bg");
// TTS播放完成 // TTS播放完成
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
@ -642,7 +848,7 @@ public class WebViewActivity extends BaseActivity {
//-------- //--------
private void initASR(){ private void initASR(){
if(mEngine == null){
if(mEngine == null && MyApplication.getInstance().duiliteConfig){
AICloudASRConfig config = new AICloudASRConfig(); AICloudASRConfig config = new AICloudASRConfig();
config.setLocalVadEnable(true); config.setLocalVadEnable(true);
config.setVadResource("vad_aihome_v0.11.bin"); config.setVadResource("vad_aihome_v0.11.bin");
@ -667,7 +873,8 @@ public class WebViewActivity extends BaseActivity {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
binding.web.evaluateJavascript("javascript: window.voiceContent('{\"data\":\"\",\"error\":\""+error.getMessage()+"\",\"flag\":2}');", null);
//binding.web.evaluateJavascript("javascript: window.voiceContent('{\"data\":\"\",\"error\":\""+error.getMessage()+"\",\"flag\":2}');", null);
binding.web.evaluateJavascript("javascript: window.youAskOver('');", null);
} }
}); });
stopAsr(); stopAsr();
@ -681,8 +888,7 @@ public class WebViewActivity extends BaseActivity {
oldString = StringUtil.strSplice(oldString,parser.getText()); oldString = StringUtil.strSplice(oldString,parser.getText());
} }
if(!"".equals(parser.getVar())){ if(!"".equals(parser.getVar())){
resultString = StringUtil.strSplice(oldString,parser.getVar());
voiceContent(resultString);
voiceContent( StringUtil.strSplice(oldString,parser.getVar()));
} }
} }
} }
@ -692,7 +898,8 @@ public class WebViewActivity extends BaseActivity {
if (status == AIConstant.OPT_SUCCESS) { if (status == AIConstant.OPT_SUCCESS) {
LoggerUtil.e("ASRInit: ","初始化成功!"); LoggerUtil.e("ASRInit: ","初始化成功!");
} else if (status == AIConstant.OPT_FAILED) { } else if (status == AIConstant.OPT_FAILED) {
binding.web.evaluateJavascript("javascript: window.voiceContent('{\"data\":\"\",\"error\":\"初始化失败\",\"flag\":2}');", null);
//binding.web.evaluateJavascript("javascript: window.voiceContent('{\"data\":\"\",\"error\":\"初始化失败\",\"flag\":2}');", null);
LoggerUtil.e("ASRInit: ","初始化失败!code:" + status);
} }
} }
@ -700,7 +907,6 @@ public class WebViewActivity extends BaseActivity {
public void onBeginningOfSpeech() { public void onBeginningOfSpeech() {
//本地vad打开时,才会执行 //本地vad打开时,才会执行
oldString=""; oldString="";
resultString="";
LoggerUtil.e("ASRInit: ","onBeginningOfSpeech"); LoggerUtil.e("ASRInit: ","onBeginningOfSpeech");
} }
@ -716,7 +922,8 @@ public class WebViewActivity extends BaseActivity {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
binding.web.evaluateJavascript("javascript: window.voiceContent('{\"data\":\""+resultString+"\",\"flag\":1}');", null);
//binding.web.evaluateJavascript("javascript: window.voiceContent('{\"data\":\""+resultString+"\",\"flag\":1}');", null);
binding.web.evaluateJavascript("javascript: window.youAskOver('');", null);
} }
}); });
LoggerUtil.e("ASRInit: ","onEndOfSpeech"); LoggerUtil.e("ASRInit: ","onEndOfSpeech");
@ -725,7 +932,6 @@ public class WebViewActivity extends BaseActivity {
@Override @Override
public void onReadyForSpeech() { public void onReadyForSpeech() {
oldString=""; oldString="";
resultString="";
LoggerUtil.e("ASRInit: ","onReadyForSpeech"); LoggerUtil.e("ASRInit: ","onReadyForSpeech");
} }

800
app/src/main/java/qianmu/container/activity/H5/WebViewActivity11.java

@ -0,0 +1,800 @@
package qianmu.container.activity.H5;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Debug;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.webkit.ConsoleMessage;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.VideoView;
import androidx.annotation.NonNull;
import androidx.core.view.ViewCompat;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.GridLayoutManager;
import com.aispeech.AIError;
import com.aispeech.AIResult;
import com.aispeech.common.AIConstant;
import com.aispeech.common.JSONResultParser;
import com.aispeech.export.config.AICloudASRConfig;
import com.aispeech.export.engines2.AICloudASREngine;
import com.aispeech.export.intent.AICloudASRIntent;
import com.aispeech.export.listeners.AIASRListener;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;
import org.greenrobot.eventbus.EventBus;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import qianmu.container.R;
import qianmu.container.activity.BaseActivity;
import qianmu.container.adapter.KeyAdapter;
import qianmu.container.app.Constant;
import qianmu.container.app.MyApplication;
import qianmu.container.data.AppData;
import qianmu.container.data.DeviceData;
import qianmu.container.data.ScreenSaverData;
import qianmu.container.databinding.ActivityWebviewBinding;
import qianmu.container.entity.MessageEvent;
import qianmu.container.socket.SocketClient;
import qianmu.container.util.CalendarUtils;
import qianmu.container.util.DeviceUtil;
import qianmu.container.util.FileUtil;
import qianmu.container.util.KeyboardUtil;
import qianmu.container.util.LoggerUtil;
import qianmu.container.util.StringUtil;
import qianmu.container.util.TTSUtil;
import qianmu.container.util.ToastUtils;
import static qianmu.container.service.ContainerService.initFirstTime;
@Route(path = Constant.ROUTE_WEB_VIEW)
public class WebViewActivity extends BaseActivity {
String TAG="WebViewActivity";
ActivityWebviewBinding binding;
static final int TYPE_REFURBISH_WEBVIEW = 100;//刷新webview
static final int TYPE_GO_SAVESCREEN = 300;//导视通知跳转屏保
static final int TYPE_HINT_PASSWORD = 3;//隐藏密码输入框
static final int TYPE_START_SERVER = 4;//重新启动web服务
static String HtmlUrl = "http://127.0.0.1:8080/index.html";//webServer服务地址 http://192.168.1.218:5173/
//static String HtmlUrl = "http://192.168.0.109:5173/";
int time = 0;
private VideoView currentVideo; //当前
private VideoView proVideo; //上一个视频
private boolean isChatMan=false; //是否是数字人项目
private SoundPool soundPool;
private int soundId;
// 语音听写对象
private AICloudASREngine mEngine;
private AICloudASRIntent aiCloudASRIntent;
private TTSUtil ttsUtil;
private String oldString="";
private Map<String, VideoView> videoMap = new HashMap<>();
private String videoAfter="";
Handler handler = new Handler() {
@SuppressLint("HandlerLeak")
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what){
case TYPE_REFURBISH_WEBVIEW://刷新webview
try {
binding.web.clearCache(true);
binding.web.loadUrl(HtmlUrl);
Constant.isCoreService=true;
}catch (Exception e){
}
break;
case TYPE_GO_SAVESCREEN://导视通知跳转屏保
try {
initFirstTime();
if (!ScreenSaverData.isProgramPlay()) return;
if (AppData.getFrontApp().equals(DeviceUtil.getPackageName())) { //信发处于系统前端时 显示屏保页面
EventBus.getDefault().post(new MessageEvent(Constant.ACTION_SHOW_SPLASH));
} else { //重新启动信发软件并打开屏保页面
ARouter.getInstance().build(Constant.ROUTE_SCREEN_SAVER).navigation();
}
} catch (Throwable t) {
LoggerUtil.e("WebViewActivity()", "导视通知跳转报错:"+StringUtil.getThrowableStr(t));
}
break;
case TYPE_HINT_PASSWORD:
sendEmptyMessageDelayed(TYPE_HINT_PASSWORD,1000);
if(time>=30){
binding.layoutPass.setVisibility(View.GONE);
removeMessages(TYPE_HINT_PASSWORD);
}
time++;
break;
case TYPE_START_SERVER:
removeMessages(TYPE_REFURBISH_WEBVIEW);
sendEmptyMessageDelayed(TYPE_REFURBISH_WEBVIEW,2000);
startService(new Intent(WebViewActivity.this, CoreService.class));
LoggerUtil.e("WebViewActivity","CoreService重启");
break;
}
}
};
@Override
protected void initView() {
DeviceUtil.screenType(this);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
binding = DataBindingUtil.setContentView(this, R.layout.activity_webview);
String jsonString = FileUtil.readLocalJsonForStorage(this, StringUtil.strSplice(Constant.CACHE_PATH3,"/JSON/getChatManVideo.json"));
if(!StringUtil.isEmpty(jsonString)){ //是AI
// 设置背景透明度
binding.web.setBackgroundColor(Color.TRANSPARENT);
isChatMan = true;
try {
JSONObject jsonObject = new JSONObject(jsonString);
JSONArray dataArray = jsonObject.getJSONArray("data");
for (int i = 0; i < dataArray.length(); i++) {
JSONObject videoObj = dataArray.getJSONObject(i).getJSONObject("content");
String vType = videoObj.getString("type");
Uri videoUri = Uri.parse(StringUtil.strSplice(Constant.CACHE_PATH3,videoObj.getJSONArray("url").getString(0)));
VideoView video = new VideoView(this);
video.setId(View.generateViewId());
FrameLayout.LayoutParams videoParams = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, // 宽度匹配父布局
ViewGroup.LayoutParams.MATCH_PARENT // 高度匹配父布局
);
video.setLayoutParams(videoParams);
if("bg".equals(vType)){
currentVideo = video;
proVideo = video;
video.setVisibility(View.VISIBLE);
}else{
video.setVisibility(View.GONE);
}
binding.videoLayout.addView(video);
video.setVideoURI(videoUri);
if("chatback".equals(vType) || "chatto".equals(vType)){
video.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
video.start();
}
});
video.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
return true; // 返回true表示已处理,不会弹出系统默认提示
}
});
video.setOnCompletionListener( mp -> changeVideo("bg"));
}else{
video.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.setLooping(true); // 可选:设置循环播
video.start();
}
});
video.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
return true;
}
});
}
videoMap.put(vType, video);
}
}catch (JSONException e){
e.printStackTrace();
}
}
//设置密码
initPass();
initASR();
ttsUtil = new TTSUtil();
ttsUtil.initTts();
}
// private void playMusic(){
// soundId = soundPool.load(this, R.raw.musice, 1);
// soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
// @Override
// public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
// if (status == 0) {
// soundPool.play(sampleId, 0.2f, 0.2f, 1, -1, 1.0f);
// }
// }
// });
// }
// private void stopMusic(){
// soundPool.stop(soundId);
// soundPool.unload(soundId);
// }
//切换视频状态
private void changeVideoAfter(){
if("".equals(videoAfter)){ //新状态正常
changeVideo("back");
}else{ //新状态彩蛋
changeVideo("to");
}
}
//切换视频
public void changeVideo(String type){
LoggerUtil.e("切换视频", type.trim()+" isChatMan: "+String.valueOf(isChatMan));
if(!isChatMan){
return;
}
VideoView nextVideo;
currentVideo.clearAnimation();
proVideo.clearAnimation();
switch(type.trim()){
case "back" :
nextVideo = videoMap.get("chatback");
break;
case "to" :
nextVideo = videoMap.get("chatto");
break;
case "bg" :
nextVideo = "".equals(videoAfter) ? videoMap.get("bg") : videoMap.get("bg1");
break;
case "answer" :
nextVideo = "".equals(videoAfter) ? videoMap.get("speek") : videoMap.get("speek1");
break;
case "hello" :
nextVideo = "".equals(videoAfter) ? videoMap.get("hello") : videoMap.get("hello1");
break;
default:
nextVideo = "".equals(videoAfter) ? videoMap.get("bg") : videoMap.get("bg1");
}
// 检查是否是重复切换
if (nextVideo == currentVideo) {
return;
}
proVideo = currentVideo;
proVideo.pause();
proVideo.stopPlayback();
// 开始淡出动画
proVideo.animate()
.alpha(0.5f)
.setDuration(240)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
proVideo.setVisibility(View.GONE);
proVideo.setAlpha(1.0f);
}
@Override
public void onAnimationCancel(Animator animation) {
super.onAnimationCancel(animation);
proVideo.setVisibility(View.GONE);
proVideo.setAlpha(1.0f);
}
})
.start();
nextVideo.setAlpha(0.3f);
nextVideo.setVisibility(View.VISIBLE);
nextVideo.start();
currentVideo = nextVideo;
// 开始淡入动画
currentVideo.animate()
.alpha(1.0f)
.setDuration(300)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
currentVideo.seekTo(0);
currentVideo.start();
currentVideo.setAlpha(1.0f);
}
@Override
public void onAnimationCancel(Animator animation) {
super.onAnimationCancel(animation);
currentVideo.seekTo(0);
currentVideo.start();
currentVideo.setAlpha(1.0f);
}
})
.start();
}
@Override
protected void setData() {
Log.e("WebViewActivity", "setData");
WebSettings webSettings = binding.web.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setSupportZoom(false);
webSettings.setBuiltInZoomControls(false);
webSettings.setDisplayZoomControls(false);
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
webSettings.setAllowFileAccess(true);
webSettings.setLoadsImagesAutomatically(true);
webSettings.setDefaultTextEncodingName("utf-8");
webSettings.setUserAgentString("");
webSettings.setMediaPlaybackRequiresUserGesture(false); // 允许自动播放
// 适配HTTPS/HTTP混合内容
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
}
//加载web
currRoute = Constant.ROUTE_WEB_VIEW;
loadH5Url(getIntent().getBooleanExtra(Constant.KEY_LOAD_H5_URL, false));
}
@Override
protected void setListener() {
binding.web.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
binding.web.setOnLongClickListener((View v) -> {
LoggerUtil.e("OnLongClick", "用户长按了页面");
return false;
});
binding.setting.setOnClickListener((view) -> {
if (!MyApplication.addClickTimes()) return;
binding.layoutPass.setVisibility(View.VISIBLE);
time = 0;
handler.removeMessages(TYPE_HINT_PASSWORD);
handler.sendEmptyMessage(TYPE_HINT_PASSWORD);
binding.tvPass.setText("");
// ARouter.getInstance().build(Constant.ROUTE_DEVICE_INFO).withBoolean(Constant.INPUT_PASSWORD, true).navigation();
});
}
//密码输入框
public void initPass(){
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 5);
KeyAdapter keyAdapter = new KeyAdapter(this);
binding.recycKey.setLayoutManager(gridLayoutManager);
binding.recycKey.setAdapter(keyAdapter);
keyAdapter.setOnitemClickLintener(new KeyAdapter.OnitemClick() {
@Override
public void onItemClick(String position) {
time = 0;
if(position.equals("清空")){
binding.tvPass.setText("");
}else if(position.equals("删除")){
String s = binding.tvPass.getText().toString();
if(s.length()>0){
binding.tvPass.setText( s.substring(0,s.length()-1));
}else {
binding.tvPass.setText("");
}
}else if(position.equals("取消")){
binding.layoutPass.setVisibility(View.GONE);
}else if(position.equals("确定")){
SimpleDateFormat format = new SimpleDateFormat("ddMM");
String pwd = format.format(System.currentTimeMillis());//当前日期当前月份
StringBuilder sb = new StringBuilder(pwd);
String whatDay4 = CalendarUtils.getWhatDay4(System.currentTimeMillis());
pwd = sb.insert(2, whatDay4).toString();//密码为日星期月6位数
String inputPWD = binding.tvPass.getText().toString().trim();//输入的密码
if (!pwd.equals(inputPWD)) {
ToastUtils.showToast("密码错误");
return;
}
binding.layoutPass.setVisibility(View.GONE);
ARouter.getInstance().build(Constant.ROUTE_DEVICE_INFO).withBoolean(Constant.INPUT_PASSWORD, false).navigation();
finish();
}else {
binding.tvPass.setText(binding.tvPass.getText().toString()+position);
}
}
});
}
@Override
protected void onResume() {
super.onResume();
leaveScreenSave();
binding.layoutPass.setVisibility(View.GONE);
//判断web服务是否正常
if(!Constant.isCoreService || !DeviceUtil.isServiceRunning( MyApplication.getInstance(),"CoreService")){
LoggerUtil.e("WebViewActivity","CoreService被关闭");
//开启本地web服务器
stopService(new Intent(WebViewActivity.this, CoreService.class));
handler.removeMessages(TYPE_START_SERVER);
handler.sendEmptyMessageDelayed(TYPE_START_SERVER,1000);
return;
}
}
@Override
protected void onPause() {
super.onPause();
KeyboardUtil.hideKeyboard(binding.getRoot());
}
@Override
protected void onStop() {
super.onStop();
if(handler!=null){
handler.removeMessages(TYPE_HINT_PASSWORD);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
LoggerUtil.e(TAG, "onDestroy()");
}
private void loadH5Url(boolean loadUrl) {
if (!loadUrl) return;
String Url;
if(H5Data.getH5Url().isEmpty()){
Url = HtmlUrl;
}else {
Url = H5Data.getH5Url();
}
binding.web.clearCache(true);
binding.web.loadUrl(Url);
binding.web.setWebChromeClient(new WebChromeClient() {
public boolean onConsoleMessage(ConsoleMessage cm) {
if(!cm.message().contains("THREE.WebGLRenderer:") && !cm.message().contains("Uncaught (in promise) AbortError")){
LoggerUtil.e("WebView日志",cm.message());
}
return super.onConsoleMessage(cm);
}
});
binding.web.addJavascriptInterface(new AndroidtoJs(), "android");
}
// JS 调用 android
public class AndroidtoJs extends Object {
// 回到屏保页面
@JavascriptInterface
public void goScreenSave() {
LoggerUtil.e(TAG,"JS调用了Android的方法:goScreenSave()");
if(handler!=null){
handler.removeMessages(TYPE_GO_SAVESCREEN);
handler.sendEmptyMessage(TYPE_GO_SAVESCREEN);
}
}
// 获取是否有屏保数据
@JavascriptInterface
public boolean hasProgram() {
boolean programPlay = ScreenSaverData.isProgramPlay();
LoggerUtil.e(TAG,"JS调用了Android的方法:hasProgram():"+programPlay);
return programPlay;
}
// 获取后台地址
@JavascriptInterface
public String getBaseAddress() {
LoggerUtil.e(TAG,"JS调用了Android的方法:getBaseAddress()");
return Constant.getBaseAddress();
}
// h5调用android:重启webView
@JavascriptInterface
public void restartWebView() {
LoggerUtil.e(TAG,"JS调用了Android的方法:restartWebView()");
handler.removeMessages(TYPE_REFURBISH_WEBVIEW);
handler.sendEmptyMessageDelayed(TYPE_REFURBISH_WEBVIEW,3000);
}
// h5调用android:彩蛋
@JavascriptInterface
public void changeVideoState(String txt) {
LoggerUtil.e(TAG,"JS调用了Android的方法:changeVideoState()");
videoAfter = txt;
runOnUiThread(new Runnable() {
@Override
public void run() {
changeVideoAfter();
}
});
}
// h5调用android:开始识别语音
@JavascriptInterface
public void startRecord() {
LoggerUtil.e(TAG,"JS调用了Android的方法:startRecord()");
ttsUtil.stopTTs();
stopAsr();
if(mEngine == null){
LoggerUtil.d(TAG, "未初始化");
initASR();
}
mEngine.start(aiCloudASRIntent);
runOnUiThread(new Runnable() {
@Override
public void run() {
changeVideo("bg");
}
});
}
// h5调用android:停止识别语音
@JavascriptInterface
public void stopRecord() {
LoggerUtil.e(TAG,"JS调用了Android的方法:stopRecord()");
stopAsr();
}
// h5调用android:开始合成语音
@JavascriptInterface
public void startTTS(String txt) {
LoggerUtil.e(TAG,"JS调用了Android的方法:startTTS()");
ttsUtil.startTTs(txt.toLowerCase(Locale.ENGLISH));
}
// h5调用android:停止合成语音
@JavascriptInterface
public void stopTTS() {
LoggerUtil.e(TAG,"JS调用了Android的方法:stopTTS()");
ttsUtil.stopTTs();
runOnUiThread(new Runnable() {
@Override
public void run() {
changeVideo("bg");
}
});
}
@JavascriptInterface
public void stopTTS(String str) {
LoggerUtil.e(TAG,"JS调用了Android的方法:stopTTS()");
ttsUtil.stopTTs();
if("change".equals(str)){
runOnUiThread(new Runnable() {
@Override
public void run() {
changeVideo("bg");
}
});
}
}
// h5调用android:播放指定视频
@JavascriptInterface
public void playAudio(String str) {
LoggerUtil.e("JS调用了Android的方法:playAudio", str);
runOnUiThread(new Runnable() {
@Override
public void run() {
changeVideo(str);
}
});
}
@JavascriptInterface
public void jxbData(String data) {
LoggerUtil.e(TAG,"JS调用了Android的方法:jxbData()");
DeviceData.saveDeviceInfo(DeviceData.JXB_DATA,data);
}
}
/**
* 安卓调用h5方法通知进入导视
* */
public void leaveScreenSave(){
if(binding.web!=null){
binding.web.loadUrl(StringUtil.strSplice("javascript:leaveScreenSave();"));
}
}
@Override
public void onMessageEvent(MessageEvent message) {
super.onMessageEvent(message);
switch (message.getCode()) {
case Constant.ACTION_UPDATE_WEBVIEW://刷新webView
String Url;
if(H5Data.getH5Url().isEmpty()){
Url = HtmlUrl;
}else {
Url = H5Data.getH5Url();
}
binding.web.clearCache(true);
binding.web.loadUrl(Url);
ToastUtils.showToast("应用更新成功");
break;
case Constant.ACTION_RESTART_CORESERVICE://重启导视服务
try {
LoggerUtil.e(TAG,"重启导视服务");
stopService(new Intent(WebViewActivity.this, CoreService.class));
handler.removeMessages(TYPE_START_SERVER);
handler.sendEmptyMessageDelayed(TYPE_START_SERVER,1000);
}catch (Exception e){
}
break;
case Constant.VOID_STOP:
changeVideo("bg");
binding.web.loadUrl(StringUtil.strSplice("javascript:ttsPlayOver();"));
break;
case Constant.ACTION_UPDATE_PROG2://后台下发节目通知,重置导视倒计时。
LoggerUtil.e(TAG,"重启导视倒计时");
leaveScreenSave();
break;
}
}
//--------
private void initASR(){
if(mEngine == null && MyApplication.getInstance().duiliteConfig){
AICloudASRConfig config = new AICloudASRConfig();
config.setLocalVadEnable(true);
config.setVadResource("vad_aihome_v0.11.bin");
mEngine = AICloudASREngine.createInstance();
aiCloudASRIntent = new AICloudASRIntent();
aiCloudASRIntent.setEnablePunctuation(true);
aiCloudASRIntent.setRealback(true);//打开实时反馈功能
aiCloudASRIntent.setResourceType(Constant.asrModel);
aiCloudASRIntent.setEnableNumberConvert(true);//设置启用识别结果汉字数字转阿拉伯数字功能
aiCloudASRIntent.setWaitingTimeout(30000); //设置等待识别结果超时时长,默认5000ms
aiCloudASRIntent.setNoSpeechTimeOut(10000);
aiCloudASRIntent.setPauseTime(2000);
mEngine.init(config, new AIASRListenerImpl());
}
}
private class AIASRListenerImpl implements AIASRListener {
public void onError(AIError error) {
LoggerUtil.e("ASRInit: ","onError "+error.getMessage());
// 在非主线程中需要调用 WebView 方法时
runOnUiThread(new Runnable() {
@Override
public void run() {
binding.web.evaluateJavascript("javascript: window.youAskOver('');", null);
}
});
stopAsr();
}
public void onResults(AIResult results) {
LoggerUtil.e("ASRInit: ", "onResults "+String.valueOf(results.isLast()));
if (results.getResultType() == AIConstant.AIENGINE_MESSAGE_TYPE_JSON) {
JSONResultParser parser = new JSONResultParser((String) results.getResultObject());
if("".equals(parser.getVar()) && !"".equals(parser.getText())){
oldString = StringUtil.strSplice(oldString,parser.getText());
}
if(!"".equals(parser.getVar())){
voiceContent( StringUtil.strSplice(oldString,parser.getVar()));
}
}
}
@Override
public void onInit(int status) {
if (status == AIConstant.OPT_SUCCESS) {
LoggerUtil.e("ASRInit: ","初始化成功!");
} else {
LoggerUtil.e("ASRInit: ","初始化失败!code:" + status);
}
}
@Override
public void onBeginningOfSpeech() {
//本地vad打开时,才会执行
oldString="";
LoggerUtil.e("ASRInit: ","onBeginningOfSpeech");
}
@Override
public void onNotOneShot() {
//do nothing
LoggerUtil.e("ASRInit: ","onNotOneShot");
}
@Override
public void onEndOfSpeech() {
//本地vad打开时,才会执行
stopAsr();
runOnUiThread(new Runnable() {
@Override
public void run() {
binding.web.evaluateJavascript("javascript: window.youAskOver('');", null);
}
});
LoggerUtil.e("ASRInit: ","onEndOfSpeech");
}
@Override
public void onReadyForSpeech() {
oldString="";
LoggerUtil.e("ASRInit: ","onReadyForSpeech");
}
@Override
public void onResultDataReceived(byte[] buffer, int size, int wakeupType) {
LoggerUtil.e("ASRInit: ","onResultDataReceived "+String.valueOf(size));
}
@Override
public void onRmsChanged(float rmsdB) {
LoggerUtil.e("ASRInit: ", "onRmsChanged " + rmsdB);
}
@Override
public void onResultDataReceived(byte[] buffer, int size) {
//do nothing
}
@Override
public void onRawDataReceived(byte[] buffer, int size) {
//do nothing
LoggerUtil.e("ASRInit: ","onRawDataReceived "+String.valueOf(size));
}
}
/**
* android调用js传送识别语音内容
*/
public void voiceContent(String msg) {
if (binding.web != null) {
LoggerUtil.e(TAG, "android调用js方法:giveAskText(),语音内容:" + msg);
runOnUiThread(new Runnable() {
@Override
public void run() {
binding.web.loadUrl(StringUtil.strSplice("javascript:window.giveAskText('" + msg + "');"));
}
});
}
}
private void stopAsr(){
if(mEngine != null){
mEngine.cancel();
mEngine.stop();
}
}
}

6
app/src/main/java/qianmu/container/app/Constant.java

@ -22,15 +22,15 @@ public class Constant {
public static String screenType = "HDMI"; // 欣威视通3399设备为假关机 HDMI连接:可以用来判断是否为关机状态 LVDS连接:只能用定时关机时间来判断 public static String screenType = "HDMI"; // 欣威视通3399设备为假关机 HDMI连接:可以用来判断是否为关机状态 LVDS连接:只能用定时关机时间来判断
public static boolean newGuide = false; // 指路机类型,true:新版指路机 false:老板指路机(流花) public static boolean newGuide = false; // 指路机类型,true:新版指路机 false:老板指路机(流花)
public static String mqttState = ""; // 屏幕连接方式 public static String mqttState = ""; // 屏幕连接方式
public static String TTSHome=""; // sbc-思必驰 kdxf-科大讯飞 (有语音的项目需要配置)
public static String TTSHome="sbc"; // sbc-思必驰 kdxf-科大讯飞 (有语音的项目需要配置)
//public static String androidBoardType = ""; //设备板子型号 无固定版 //public static String androidBoardType = ""; //设备板子型号 无固定版
// public static String androidBoardType = "ys"; // 设备板子型号 ys(亿晟) 北京颐堤港定制touch
public static String androidBoardType = "ys"; // 设备板子型号 ys(亿晟) 北京颐堤港定制touch
// public static String androidBoardType = "xwst"; //设备板子型号 xwst(欣威视通3399) // public static String androidBoardType = "xwst"; //设备板子型号 xwst(欣威视通3399)
// public static String androidBoardType = "xwst2"; //设备板子型号 xwst2(欣威视通3588、T982、3576) // public static String androidBoardType = "xwst2"; //设备板子型号 xwst2(欣威视通3588、T982、3576)
// public static String androidBoardType = "zc"; //设备板子型号 zc(卓策主板——王府井喜悦、杨浦中心医院) // public static String androidBoardType = "zc"; //设备板子型号 zc(卓策主板——王府井喜悦、杨浦中心医院)
// public static String androidBoardType = "sx"; //设备板子型号 sx(视想) // public static String androidBoardType = "sx"; //设备板子型号 sx(视想)
// public static String androidBoardType = "nova"; //设备板子型号 诺瓦盒子 华贸LED // public static String androidBoardType = "nova"; //设备板子型号 诺瓦盒子 华贸LED
public static String androidBoardType = "huidu"; //设备板子型号 huidu(灰度主板) 罗湖寻车机
// public static String androidBoardType = "huidu"; //设备板子型号 huidu(灰度主板) 罗湖寻车机
// public static String androidBoardType = "bv"; //设备板子型号 Bv-3588M // public static String androidBoardType = "bv"; //设备板子型号 Bv-3588M
// public static String androidBoardType = "smt"; //设备板子型号 视美泰 // public static String androidBoardType = "smt"; //设备板子型号 视美泰

1
app/src/main/java/qianmu/container/app/MyApplication.java

@ -65,6 +65,7 @@ public class MyApplication extends Application {
public static long lastClickTime = 0;// 最后点击时间 public static long lastClickTime = 0;// 最后点击时间
public static int clickTimes = 0;// 累计点击次数 public static int clickTimes = 0;// 累计点击次数
private Lztek lztek = null; private Lztek lztek = null;
public boolean duiliteConfig=false;
private SmdtManagerNew smdt = null; private SmdtManagerNew smdt = null;
public SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

9
app/src/main/java/qianmu/container/data/DeviceData.java

@ -80,7 +80,6 @@ public class DeviceData extends BaseData {
public static final String HINT_DEVICE_IP = "hint_device_ip"; public static final String HINT_DEVICE_IP = "hint_device_ip";
public static final String HINT_DEVICE_MAC = "hint_device_mac"; public static final String HINT_DEVICE_MAC = "hint_device_mac";
public static final String HINT_DEVICE_TYPE = "hint_device_type"; public static final String HINT_DEVICE_TYPE = "hint_device_type";
public static final String VOICE_CODE = "voice_code"; //语音code
public static final String VOICE_CONFIG = "voice_config"; // 语音配置 public static final String VOICE_CONFIG = "voice_config"; // 语音配置
public static final String HINT_DEVICE_TOUCH = "hint_device_touch";//触摸属性 // 0触摸 1非触摸 public static final String HINT_DEVICE_TOUCH = "hint_device_touch";//触摸属性 // 0触摸 1非触摸
public static final String HINT_SYNC_TEST = "hint_sync_test"; public static final String HINT_SYNC_TEST = "hint_sync_test";
@ -249,13 +248,13 @@ public class DeviceData extends BaseData {
JsonObject jsonObject = new JsonParser().parse(dataJson).getAsJsonObject(); JsonObject jsonObject = new JsonParser().parse(dataJson).getAsJsonObject();
String typeName = jsonObject.get("machineTypeName").getAsString(); String typeName = jsonObject.get("machineTypeName").getAsString();
DeviceData.saveDeviceInfo(DeviceData.HINT_DEVICE_TYPE, typeName); //设备类型 DeviceData.saveDeviceInfo(DeviceData.HINT_DEVICE_TYPE, typeName); //设备类型
if(jsonObject.get("voiceActivationCode") != null){
String voiceActivationCode = jsonObject.get("voiceActivationCode").getAsString();
DeviceData.saveDeviceInfo(DeviceData.VOICE_CODE, voiceActivationCode); //设备语音激活码
if(jsonObject.get("voiceActivationSourceConfig") != null){
//String voiceActivationCode = jsonObject.get("voiceActivationCode").getAsString();
//DeviceData.saveDeviceInfo(DeviceData.VOICE_CODE, voiceActivationCode); //设备语音激活码
String voiceActivationSourceConfig = jsonObject.get("voiceActivationSourceConfig").getAsString(); String voiceActivationSourceConfig = jsonObject.get("voiceActivationSourceConfig").getAsString();
DeviceData.saveDeviceInfo(DeviceData.VOICE_CONFIG, voiceActivationSourceConfig); //设备语音激活码 DeviceData.saveDeviceInfo(DeviceData.VOICE_CONFIG, voiceActivationSourceConfig); //设备语音激活码
}else{ }else{
DeviceData.saveDeviceInfo(DeviceData.VOICE_CODE, "");
DeviceData.saveDeviceInfo(DeviceData.VOICE_CONFIG, "");
} }
LoggerUtil.e("getMachine()", typeName); LoggerUtil.e("getMachine()", typeName);
} }

27
app/src/main/java/qianmu/container/util/FileUtil.java

@ -1,8 +1,11 @@
package qianmu.container.util; package qianmu.container.util;
import android.content.Context; import android.content.Context;
import android.os.Build;
import android.util.Log; import android.util.Log;
import androidx.annotation.RequiresApi;
import com.lzy.okgo.OkGo; import com.lzy.okgo.OkGo;
import com.lzy.okgo.model.Response; import com.lzy.okgo.model.Response;
@ -179,15 +182,22 @@ public class FileUtil {
try { try {
String fileTotalLength = response.headers().get("Content-Range"); String fileTotalLength = response.headers().get("Content-Range");
File tempFile = new File(localPath);
if( StringUtil.isEmpty(fileTotalLength)){ if( StringUtil.isEmpty(fileTotalLength)){
File tempFile = new File(localPath);
String targetPath = localPath.substring(0, localPath.lastIndexOf("."));
File targetFile = new File(targetPath);
tempFile.renameTo(targetFile);
if(tempFile.length() > 10){
String targetPath = localPath.substring(0, localPath.lastIndexOf("."));
if(targetPath.contains("?")){
String[] split = targetPath.split("[?]");
targetPath=split[0];
}
File targetFile = new File(targetPath);
tempFile.renameTo(targetFile);
}else{
tempFile.delete();
}
}else{ }else{
//获取请求数据的总大小 //获取请求数据的总大小
fileTotalLength = fileTotalLength.substring(fileTotalLength.lastIndexOf("/") + 1); fileTotalLength = fileTotalLength.substring(fileTotalLength.lastIndexOf("/") + 1);
File tempFile = new File(localPath);
//读取本地保存文件大小 //读取本地保存文件大小
String tempFileLength = String.valueOf(tempFile.length()); String tempFileLength = String.valueOf(tempFile.length());
//二者大小一致时 修改文件后缀名 //二者大小一致时 修改文件后缀名
@ -328,6 +338,7 @@ public class FileUtil {
} }
@RequiresApi(api = Build.VERSION_CODES.N)
public static boolean upZipFile(String filePath, String folderPath) { public static boolean upZipFile(String filePath, String folderPath) {
try { try {
ZipFile zipFile = new ZipFile(new File(filePath), Charset.forName("GBK")); ZipFile zipFile = new ZipFile(new File(filePath), Charset.forName("GBK"));
@ -571,19 +582,15 @@ public class FileUtil {
String resultString=""; String resultString="";
try { try {
File file = new File(fileName); File file = new File(fileName);
InputStream inputStream=new FileInputStream(file); InputStream inputStream=new FileInputStream(file);
byte[] buffer=new byte[inputStream.available()]; byte[] buffer=new byte[inputStream.available()];
inputStream.read(buffer); inputStream.read(buffer);
resultString=new String(buffer,"GB2312"); resultString=new String(buffer,"GB2312");
inputStream.close();
} catch (Exception e) { } catch (Exception e) {
// TODO: handle exception // TODO: handle exception
} }
return resultString; return resultString;
} }

137
app/src/main/java/qianmu/container/util/TTSUtil.java

@ -15,6 +15,7 @@ import org.greenrobot.eventbus.EventBus;
import org.json.JSONArray; import org.json.JSONArray;
import qianmu.container.app.Constant; import qianmu.container.app.Constant;
import qianmu.container.app.MyApplication;
import qianmu.container.entity.MessageEvent; import qianmu.container.entity.MessageEvent;
public class TTSUtil { public class TTSUtil {
@ -25,74 +26,76 @@ public class TTSUtil {
public void initTts(){ public void initTts(){
mEngine = AICloudTTSEngine.createInstance();
AICloudTTSConfig config = new AICloudTTSConfig();
config.setUseCache(false);
mEngine.init(config, new AITTSListener() {
@Override
public void onInit(int status) {
Log.d(TAG, "onInit()");
if (status == AIConstant.OPT_SUCCESS) {
Log.i(TAG, "初始化成功!");
} else {
Log.i(TAG, "初始化失败!");
if(MyApplication.getInstance().duiliteConfig) {
mEngine = AICloudTTSEngine.createInstance();
AICloudTTSConfig config = new AICloudTTSConfig();
config.setUseCache(false);
mEngine.init(config, new AITTSListener() {
@Override
public void onInit(int status) {
Log.d(TAG, "onInit()");
if (status == AIConstant.OPT_SUCCESS) {
Log.i(TAG, "初始化成功!");
} else {
Log.i(TAG, "初始化失败!");
}
} }
}
@Override
public void onError(String utteranceId, AIError error) {
Log.e(TAG, "onError: " + utteranceId + "," + error.toString());
EventBus.getDefault().post(new MessageEvent(Constant.VOID_STOP));
}
@Override
public void onReady(String utteranceId) {
Log.e(TAG, "onReady: " + utteranceId);
}
@Override
public void onCompletion(String utteranceId) {
LoggerUtil.e(TAG, "onCompletion: " + utteranceId);
EventBus.getDefault().post(new MessageEvent(Constant.VOID_STOP));
}
@Override
public void onProgress(int currentTime, int totalTime, boolean isRefTextTTSFinished) {
}
@Override
public void onSynthesizeStart(String utteranceId) {
}
@Override
public void onSynthesizeDataArrived(String utteranceId, byte[] audioData) {
}
@Override
public void onSynthesizeFinish(String utteranceId) {
}
@Override
public void onTimestampReceived(byte[] bytes, int i) {
}
@Override
public void onPhonemesDataArrived(String s, String s1) {
}
@Override
public void onHighInfoReceived(JSONArray textArray, int curIndex, int curDuration, int curStart) {
Log.d("onHighInfoReceived", "textArray = " + textArray + ", curText="+textArray.optString(curIndex)+",duration = " + curDuration + ", curStart = " + curStart);
}
});
intent = new AICloudTTSIntent();
intent.setSpeaker("qianranfv5"); // qianranfv5 yyqiafv6
intent.setVolume("100");
intent.setSpeed("0.8");
intent.setTextType("text");
intent.setSpeakingStyle("happy");
intent.setHighLightInfo(false);
@Override
public void onError(String utteranceId, AIError error) {
Log.e(TAG, "onError: " + utteranceId + "," + error.toString());
EventBus.getDefault().post(new MessageEvent(Constant.VOID_STOP));
}
@Override
public void onReady(String utteranceId) {
Log.e(TAG, "onReady: " + utteranceId);
}
@Override
public void onCompletion(String utteranceId) {
LoggerUtil.e(TAG, "onCompletion: " + utteranceId);
EventBus.getDefault().post(new MessageEvent(Constant.VOID_STOP));
}
@Override
public void onProgress(int currentTime, int totalTime, boolean isRefTextTTSFinished) {
}
@Override
public void onSynthesizeStart(String utteranceId) {
}
@Override
public void onSynthesizeDataArrived(String utteranceId, byte[] audioData) {
}
@Override
public void onSynthesizeFinish(String utteranceId) {
}
@Override
public void onTimestampReceived(byte[] bytes, int i) {
}
@Override
public void onPhonemesDataArrived(String s, String s1) {
}
@Override
public void onHighInfoReceived(JSONArray textArray, int curIndex, int curDuration, int curStart) {
Log.d("onHighInfoReceived", "textArray = " + textArray + ", curText=" + textArray.optString(curIndex) + ",duration = " + curDuration + ", curStart = " + curStart);
}
});
intent = new AICloudTTSIntent();
intent.setSpeaker("qianranfv5"); // qianranfv5 yyqiafv6
intent.setVolume("100");
intent.setSpeed("0.8");
intent.setTextType("text");
intent.setSpeakingStyle("happy");
intent.setHighLightInfo(false);
}
} }
//开始听写 //开始听写

5
app/src/main/res/layout/activity_webview.xml

@ -6,6 +6,11 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<RelativeLayout android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/videoLayout">
</RelativeLayout>
<WebView <WebView
android:id="@+id/web" android:id="@+id/web"

Loading…
Cancel
Save