diff --git a/app/build.gradle b/app/build.gradle index dc6b42b..865656f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,13 +12,14 @@ android { minSdkVersion 22 targetSdkVersion 30 versionCode 6 - versionName "V2.0.8.14" + versionName "V2.0.8.15" // 2.0.8.2 修改网络连接证书设置、定时开关机设置 // 2.0.8.3 获取mac修改 // V2.0.8.5 同屏优化 // 2.0.8.6 视频播放器切换 // 2.0.8.12 固件更新 //V2.0.8.14 和义大道开机5分钟后重启应用 + //V2.0.8.15 增加数字人视频模型 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles 'consumer-rules.pro' diff --git a/app/src/main/java/qianmu/container/activity/H5/UpdateFileActivity.java b/app/src/main/java/qianmu/container/activity/H5/UpdateFileActivity.java index a0346fd..52cea18 100644 --- a/app/src/main/java/qianmu/container/activity/H5/UpdateFileActivity.java +++ b/app/src/main/java/qianmu/container/activity/H5/UpdateFileActivity.java @@ -420,10 +420,8 @@ public class UpdateFileActivity extends BaseActivity { // 思必驰授权 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(); String productId = jsonObject.get("productId").getAsString(); String apiKey = jsonObject.get("apiKey").getAsString(); @@ -436,12 +434,12 @@ public class UpdateFileActivity extends BaseActivity { .setProductKey(productKey) .setProductSecret(productSecret) .create(); - //config.setExtraParameter("DEVICE_NAME", code); DUILiteSDK.init(getApplicationContext()); // SDK 授权 DUILiteSDK.doAuth(getApplicationContext(), config, new DUILiteSDK.InitListener() { @Override public void success() { + MyApplication.getInstance().duiliteConfig = true; LoggerUtil.d("DUILiteSDKInit: ", "授权成功! "); } @Override @@ -453,7 +451,7 @@ public class UpdateFileActivity extends BaseActivity { LoggerUtil.e("initSDK: ","语音授权码获取失败"); } }else{ - LoggerUtil.e("initSDK: ","语音激活码获取失败"); + LoggerUtil.e("initSDK: ","语音授权码获取失败"); } } diff --git a/app/src/main/java/qianmu/container/activity/H5/WebViewActivity.java b/app/src/main/java/qianmu/container/activity/H5/WebViewActivity.java index 61b1a28..d15ae6d 100644 --- a/app/src/main/java/qianmu/container/activity/H5/WebViewActivity.java +++ b/app/src/main/java/qianmu/container/activity/H5/WebViewActivity.java @@ -1,10 +1,14 @@ package qianmu.container.activity.H5; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.ActivityManager; import android.content.Context; import android.content.Intent; +import android.graphics.Color; +import android.media.MediaPlayer; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -15,6 +19,7 @@ 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.webkit.ConsoleMessage; import android.webkit.CookieManager; @@ -25,6 +30,8 @@ import android.webkit.WebResourceResponse; 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.databinding.DataBindingUtil; @@ -47,13 +54,18 @@ import com.shockman.sm.vendor.SmUtils; import com.shockman.sm.vendor.TargetVo; import org.greenrobot.eventbus.EventBus; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; +import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Scanner; import java.util.concurrent.Executors; 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"; int time = 0; String interfaceRequestData=""; + private VideoView currentVideo; //当前 + private VideoView proVideo; //上一个视频 + private boolean isChatMan=false; //是否是数字人项目 // 语音听写对象 private AICloudASREngine mEngine; private AICloudASRIntent aiCloudASRIntent; private TTSUtil ttsUtil; private String oldString=""; - private String resultString = ""; + private Map videoMap = new HashMap<>(); + private String videoAfter=""; // 语音听写对象 private ASR mAsr; @@ -175,6 +191,74 @@ public class WebViewActivity extends BaseActivity { 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 + 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(); try{ @@ -191,6 +275,86 @@ public class WebViewActivity extends BaseActivity { 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 protected void setData() { @@ -410,7 +574,18 @@ public class WebViewActivity extends BaseActivity { 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() { @@ -459,11 +634,40 @@ public class WebViewActivity extends BaseActivity { LoggerUtil.e(TAG,"JS调用了Android的方法:stopTTS()"); if("sbc".equals(Constant.TTSHome)){ ttsUtil.stopTTs(); + runOnUiThread(new Runnable() { + @Override + public void run() { + changeVideo("bg"); + } + }); }else if("kdxf".equals(Constant.TTSHome)){ 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:新版指路机传入的数据 @JavascriptInterface public void jxbData(String data) { @@ -541,7 +745,8 @@ public class WebViewActivity extends BaseActivity { runOnUiThread(new Runnable() { @Override 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; case Constant.VOID_STOP: + changeVideo("bg"); // TTS播放完成 runOnUiThread(new Runnable() { @Override @@ -642,7 +848,7 @@ public class WebViewActivity extends BaseActivity { //-------- private void initASR(){ - if(mEngine == null){ + if(mEngine == null && MyApplication.getInstance().duiliteConfig){ AICloudASRConfig config = new AICloudASRConfig(); config.setLocalVadEnable(true); config.setVadResource("vad_aihome_v0.11.bin"); @@ -667,7 +873,8 @@ public class WebViewActivity extends BaseActivity { runOnUiThread(new Runnable() { @Override 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(); @@ -681,8 +888,7 @@ public class WebViewActivity extends BaseActivity { oldString = StringUtil.strSplice(oldString,parser.getText()); } 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) { LoggerUtil.e("ASRInit: ","初始化成功!"); } 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() { //本地vad打开时,才会执行 oldString=""; - resultString=""; LoggerUtil.e("ASRInit: ","onBeginningOfSpeech"); } @@ -716,7 +922,8 @@ public class WebViewActivity extends BaseActivity { runOnUiThread(new Runnable() { @Override 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"); @@ -725,7 +932,6 @@ public class WebViewActivity extends BaseActivity { @Override public void onReadyForSpeech() { oldString=""; - resultString=""; LoggerUtil.e("ASRInit: ","onReadyForSpeech"); } diff --git a/app/src/main/java/qianmu/container/activity/H5/WebViewActivity11.java b/app/src/main/java/qianmu/container/activity/H5/WebViewActivity11.java new file mode 100644 index 0000000..2c3d6b9 --- /dev/null +++ b/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 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(); + } + } + +} diff --git a/app/src/main/java/qianmu/container/app/Constant.java b/app/src/main/java/qianmu/container/app/Constant.java index 9fff6e2..7ad05e5 100644 --- a/app/src/main/java/qianmu/container/app/Constant.java +++ b/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 boolean newGuide = false; // 指路机类型,true:新版指路机 false:老板指路机(流花) 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 = "ys"; // 设备板子型号 ys(亿晟) 北京颐堤港定制touch + public static String androidBoardType = "ys"; // 设备板子型号 ys(亿晟) 北京颐堤港定制touch // public static String androidBoardType = "xwst"; //设备板子型号 xwst(欣威视通3399) // public static String androidBoardType = "xwst2"; //设备板子型号 xwst2(欣威视通3588、T982、3576) // public static String androidBoardType = "zc"; //设备板子型号 zc(卓策主板——王府井喜悦、杨浦中心医院) // public static String androidBoardType = "sx"; //设备板子型号 sx(视想) // 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 = "smt"; //设备板子型号 视美泰 diff --git a/app/src/main/java/qianmu/container/app/MyApplication.java b/app/src/main/java/qianmu/container/app/MyApplication.java index 27e4460..ed1ef8c 100644 --- a/app/src/main/java/qianmu/container/app/MyApplication.java +++ b/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 int clickTimes = 0;// 累计点击次数 private Lztek lztek = null; + public boolean duiliteConfig=false; private SmdtManagerNew smdt = null; public SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); diff --git a/app/src/main/java/qianmu/container/data/DeviceData.java b/app/src/main/java/qianmu/container/data/DeviceData.java index 47b09f4..ca3f224 100644 --- a/app/src/main/java/qianmu/container/data/DeviceData.java +++ b/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_MAC = "hint_device_mac"; 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 HINT_DEVICE_TOUCH = "hint_device_touch";//触摸属性 // 0触摸 1非触摸 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(); String typeName = jsonObject.get("machineTypeName").getAsString(); 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(); DeviceData.saveDeviceInfo(DeviceData.VOICE_CONFIG, voiceActivationSourceConfig); //设备语音激活码 }else{ - DeviceData.saveDeviceInfo(DeviceData.VOICE_CODE, ""); + DeviceData.saveDeviceInfo(DeviceData.VOICE_CONFIG, ""); } LoggerUtil.e("getMachine()", typeName); } diff --git a/app/src/main/java/qianmu/container/util/FileUtil.java b/app/src/main/java/qianmu/container/util/FileUtil.java index 7f5581d..ada1f08 100644 --- a/app/src/main/java/qianmu/container/util/FileUtil.java +++ b/app/src/main/java/qianmu/container/util/FileUtil.java @@ -1,8 +1,11 @@ package qianmu.container.util; import android.content.Context; +import android.os.Build; import android.util.Log; +import androidx.annotation.RequiresApi; + import com.lzy.okgo.OkGo; import com.lzy.okgo.model.Response; @@ -179,15 +182,22 @@ public class FileUtil { try { String fileTotalLength = response.headers().get("Content-Range"); + File tempFile = new File(localPath); 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{ //获取请求数据的总大小 fileTotalLength = fileTotalLength.substring(fileTotalLength.lastIndexOf("/") + 1); - File tempFile = new File(localPath); //读取本地保存文件大小 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) { try { ZipFile zipFile = new ZipFile(new File(filePath), Charset.forName("GBK")); @@ -571,19 +582,15 @@ public class FileUtil { String resultString=""; try { - File file = new File(fileName); InputStream inputStream=new FileInputStream(file); byte[] buffer=new byte[inputStream.available()]; inputStream.read(buffer); resultString=new String(buffer,"GB2312"); - + inputStream.close(); } catch (Exception e) { - // TODO: handle exception - } - return resultString; } diff --git a/app/src/main/java/qianmu/container/util/TTSUtil.java b/app/src/main/java/qianmu/container/util/TTSUtil.java index 7f5110e..900b550 100644 --- a/app/src/main/java/qianmu/container/util/TTSUtil.java +++ b/app/src/main/java/qianmu/container/util/TTSUtil.java @@ -15,6 +15,7 @@ import org.greenrobot.eventbus.EventBus; import org.json.JSONArray; import qianmu.container.app.Constant; +import qianmu.container.app.MyApplication; import qianmu.container.entity.MessageEvent; public class TTSUtil { @@ -25,74 +26,76 @@ public class TTSUtil { 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); + } } //开始听写 diff --git a/app/src/main/res/layout/activity_webview.xml b/app/src/main/res/layout/activity_webview.xml index c8eb5e5..3e26327 100644 --- a/app/src/main/res/layout/activity_webview.xml +++ b/app/src/main/res/layout/activity_webview.xml @@ -6,6 +6,11 @@ + + +