diff --git a/app/libs/zckjAPI-2.6.jar b/app/libs/zckjAPI-2.6.jar deleted file mode 100644 index 81c2d1e..0000000 Binary files a/app/libs/zckjAPI-2.6.jar and /dev/null differ diff --git a/app/src/main/java/qianmu/container/activity/H5/H5Data.java b/app/src/main/java/qianmu/container/activity/H5/H5Data.java index 6f02ff8..1dd2343 100644 --- a/app/src/main/java/qianmu/container/activity/H5/H5Data.java +++ b/app/src/main/java/qianmu/container/activity/H5/H5Data.java @@ -54,6 +54,7 @@ public class H5Data extends BaseData { public static final String NAME = "H5_app_data"; public static final String H5_APP_VERSION = "H5_version"; public static final String INTERFACE_LIST = "interface_list"; + public static final String AI_FILE_RESOURCE_LIST = "aiFileResource_list"; //AI资源文件 public static final String FILE_RESOURCE_LIST = "fileResource_list";//资源文件下载,图片,视频 public static final String MODEL_FILE_RESOURCE_LIST = "modelFileResource_list";//模型资源文件下载,图片,(水牌使用) public static final String H5_URL = "h5_url"; // 除导视外其他url @@ -105,6 +106,30 @@ public class H5Data extends BaseData { saveDataJson(NAME, MODEL_FILE_RESOURCE_LIST, dataJson); } + /** + * 保存AI文件资源列表 + * */ + public static void saveAIResourceFileList(Object data) { + String dataJson; + if (data instanceof String) dataJson = (String) data; + else dataJson = new Gson().toJson(data); + saveDataJson(NAME, AI_FILE_RESOURCE_LIST, dataJson); + } + + /** + * 获取模型文件资源列表 + * */ + public static List getAiResourceFileList() { + try { + String dataJson = getDataJson(NAME, AI_FILE_RESOURCE_LIST); + return new Gson().fromJson(dataJson, new TypeToken>() { + }.getType()); + } catch (Throwable t) { + LoggerUtil.e("getAIResourceFileList", StringUtil.getThrowableStr(t)); + } + return new ArrayList<>(); + } + /** * 获取文件资源列表 * */ @@ -292,6 +317,44 @@ public class H5Data extends BaseData { }); } + // 获取AI离线文件 + public static void queryAiServeList(QueryPreparedListener preparedListener, QueryFinishListener finishListener , Map bigFiles ) { + if (preparedListener != null) preparedListener.onPrepared(); + String mallCode = FloorData.getMallCode(); + RetrofitUtil.getBaseService().getAiFileResource(mallCode).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + if (StringUtil.respSuccess(response.body())) { + String dataJson = new Gson().toJson(response.body().getData()); + if(dataJson.contains("capacity")){ + Object data = response.body().getData(); + saveAIResourceFileList(data); + }else { + //解密 + dataJson= AesUtil.decrypt((String.valueOf(response.body().getData()))); + saveAIResourceFileList(dataJson); + } + for(ResourceFileBean fileBean:getAiResourceFileList()){ + bigFiles.put(fileBean.getUrl(), StringUtil.strSplice("dist", "/static/offline/", fileBean.getUrl())); + } + + } + } catch (Throwable t) { + LoggerUtil.e("getAiFileResource", StringUtil.getThrowableStr(t)); + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + + //GET方式获取离线数据 public static void queryOfflineDataByInterfaceToGet(String url, String jsonData, String fileName, Map bigFiles , QueryPreparedListener preparedListener, QueryFinishListener finishListener) { if (preparedListener != null) preparedListener.onPrepared(); 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 c630e51..9432086 100644 --- a/app/src/main/java/qianmu/container/activity/H5/UpdateFileActivity.java +++ b/app/src/main/java/qianmu/container/activity/H5/UpdateFileActivity.java @@ -173,8 +173,8 @@ public class UpdateFileActivity extends BaseActivity { H5Data.queryFileResources( () -> totalQueryCount++, () -> queryResponseCount++ ,bigFiles); getOfflineDataByInterface(); - } + H5Data.queryAiServeList( () -> totalQueryCount++, () -> queryResponseCount++ ,bigFiles); if("指路机".equals(deviceType)){ DeviceData.getBackgroundMusic( () -> totalQueryCount++, () -> queryResponseCount++ ,bigFiles); 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 7e180e6..ac6bc8c 100644 --- a/app/src/main/java/qianmu/container/activity/H5/WebViewActivity.java +++ b/app/src/main/java/qianmu/container/activity/H5/WebViewActivity.java @@ -15,12 +15,15 @@ import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.WindowManager; +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.VideoView; import androidx.annotation.NonNull; import androidx.databinding.DataBindingUtil; @@ -80,9 +83,7 @@ import qianmu.container.util.FileUtil; import qianmu.container.util.GsonUtil; import qianmu.container.util.KeyboardUtil; import qianmu.container.util.LoggerUtil; -import qianmu.container.util.SignWayUtil; import qianmu.container.util.StringUtil; -import qianmu.container.util.TTSUtil; import qianmu.container.util.ToastUtils; import static qianmu.container.service.ContainerService.initFirstTime; @@ -96,9 +97,9 @@ public class WebViewActivity extends BaseActivity { 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服务地址 - static String HtmlUrl = "http://192.168.1.218:5173/";//webServer服务地址 + static String HtmlUrl = "http://127.0.0.1:8080/index.html";//webServer服务地址 int time = 0; + private VideoView currentVideo; SocketClient localSocketClient; Handler handler = new Handler() { @@ -158,69 +159,97 @@ public class WebViewActivity extends BaseActivity { binding.web.setBackgroundColor(0); binding.web.getBackground().setAlpha(0); + loadingbgVideo(true); + currentVideo = binding.bgVideo; + loadingHelloVideo(); + loadingSpeekVideo(); + //设置密码 + initPass(); + connectLocalSocket(); + } + private void loadingbgVideo(Boolean isplay){ Uri videoUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.bg); binding.bgVideo.setVideoURI(videoUri); binding.bgVideo.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.setLooping(true); // 可选:设置循环播放 - binding.bgVideo.start(); // 开始播放视频 + if(isplay){ + binding.bgVideo.start(); + } } }); + } + private void loadingHelloVideo(){ Uri videoUri1 = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.hello); binding.helloVideo.setVideoURI(videoUri1); binding.helloVideo.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { - mp.setLooping(true); // 可选:设置循环播放 + mp.setLooping(true); } }); - + } + private void loadingSpeekVideo(){ Uri videoUri2 = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.speek); binding.speekVideo.setVideoURI(videoUri2); binding.speekVideo.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { - mp.setLooping(true); // 可选:设置循环播放 + mp.setLooping(true); } }); - //设置密码 - initPass(); - connectLocalSocket(); } //切换视频 public void changeVideo(String type){ - binding.helloVideo.setZOrderOnTop(false); - binding.helloVideo.setZOrderMediaOverlay(false); - binding.speekVideo.setZOrderOnTop(false); - binding.speekVideo.setZOrderMediaOverlay(false); - if("hello".equals(type)){ - binding.helloVideo.setZOrderOnTop(true); - binding.helloVideo.setZOrderMediaOverlay(true); - binding.helloVideo.setVisibility(View.VISIBLE); - binding.helloVideo.start(); - binding.speekVideo.stopPlayback(); - binding.speekVideo.setVisibility(View.GONE); - binding.bgVideo.stopPlayback(); - binding.bgVideo.setVisibility(View.GONE); - }else if("answer".equals(type)){ - binding.speekVideo.setZOrderOnTop(true); - binding.speekVideo.setZOrderMediaOverlay(true); - binding.speekVideo.setVisibility(View.VISIBLE); - binding.speekVideo.start(); - binding.helloVideo.stopPlayback(); - binding.helloVideo.setVisibility(View.GONE); - binding.bgVideo.stopPlayback(); - binding.bgVideo.setVisibility(View.GONE); + LoggerUtil.e("changeVideo", type); + VideoView nextVideo; + currentVideo.clearAnimation(); + if("bg".equals(type.trim())){ + if(currentVideo == binding.bgVideo){ + return; + } + nextVideo = binding.bgVideo; + }else if("answer".equals(type.trim())){ + if(currentVideo == binding.speekVideo){ + return; + } + nextVideo = binding.speekVideo; }else{ - binding.bgVideo.setVisibility(View.VISIBLE); - binding.bgVideo.start(); - binding.helloVideo.stopPlayback(); - binding.helloVideo.setVisibility(View.GONE); - binding.speekVideo.stopPlayback(); - binding.speekVideo.setVisibility(View.GONE); + if(currentVideo == binding.helloVideo){ + return; + } + nextVideo = binding.helloVideo; } + + // 新视频淡入动画 + AlphaAnimation fadeIn = new AlphaAnimation(0f, 1f); + fadeIn.setDuration(300); + fadeIn.setFillAfter(true); + // 旧视频淡出动画 + AlphaAnimation fadeOut = new AlphaAnimation(1f, 0f); + fadeOut.setDuration(300); + fadeOut.setFillAfter(true); + fadeOut.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) {} + + @Override + public void onAnimationEnd(Animation animation) { + currentVideo.pause(); + currentVideo.setVisibility(View.GONE); + currentVideo.clearAnimation(); + currentVideo = nextVideo; + } + @Override + public void onAnimationRepeat(Animation animation) {} + }); + // 执行切换 + nextVideo.setVisibility(View.VISIBLE); + nextVideo.startAnimation(fadeIn); + nextVideo.start(); + currentVideo.startAnimation(fadeOut); } @Override @@ -261,6 +290,7 @@ public class WebViewActivity extends BaseActivity { }); binding.setting.setOnClickListener((view) -> { + if (!MyApplication.addClickTimes()) return; binding.layoutPass.setVisibility(View.VISIBLE); time = 0; @@ -425,12 +455,23 @@ public class WebViewActivity extends BaseActivity { public void stopTTS() { LoggerUtil.e(TAG,"JS调用了Android的方法:stopTTS()"); localSocketClient.send(StringUtil.strSplice("{\"method\":\"/tts/stop\"}")); + runOnUiThread(new Runnable() { + @Override + public void run() { + changeVideo("bg"); + } + }); } // h5调用android:播放指定视频 @JavascriptInterface public void playAudio(String str) { LoggerUtil.e("JS调用了Android的方法:playAudio", str); - changeVideo(str); + runOnUiThread(new Runnable() { + @Override + public void run() { + changeVideo(str); + } + }); } } //语音交互 @@ -445,8 +486,8 @@ public class WebViewActivity extends BaseActivity { TTSMessage messageBean = new Gson().fromJson(message, TTSMessage.class); TTSMessage.Params content = messageBean.getParams(); if (content == null) return; - LoggerUtil.e("ttsSocket:", messageBean.getMethod()); - if("asr.text".equals(messageBean.getMethod())){ + String method = messageBean.getMethod(); + if("asr.text".equals(method)){ LoggerUtil.e("ttsSocket:",content.getText()); runOnUiThread(new Runnable() { @Override @@ -454,8 +495,7 @@ public class WebViewActivity extends BaseActivity { binding.web.loadUrl(StringUtil.strSplice("javascript:window.giveAskText('", content.getText(), "');")); } }); - } - if("asr.result".equals(messageBean.getMethod())){ + }else if("asr.result".equals(method)){ LoggerUtil.e("ttsSocket:",content.getText()); runOnUiThread(new Runnable() { @Override @@ -464,15 +504,16 @@ public class WebViewActivity extends BaseActivity { binding.web.loadUrl(StringUtil.strSplice("javascript:window.youAskOver('", content.getText(), "');")); } }); - } - if("tts.result".equals(messageBean.getMethod())){ - LoggerUtil.e("ttsSocket:",content.getSpeakUrl()); - runOnUiThread(new Runnable() { - @Override - public void run() { - changeVideo("bg"); - } - }); + }else if("tts.result".equals(method)){ + LoggerUtil.e("ttsSocket:", messageBean.getParams().getStatus().trim()); + if("end".equals(messageBean.getParams().getStatus().trim())) { + runOnUiThread(new Runnable() { + @Override + public void run() { + changeVideo("bg"); + } + }); + } } } catch (Throwable t) { LoggerUtil.e("setOnMessageListener", StringUtil.getThrowableStr(t)); diff --git a/app/src/main/java/qianmu/container/activity/TestActivity.java b/app/src/main/java/qianmu/container/activity/TestActivity.java deleted file mode 100644 index 080533a..0000000 --- a/app/src/main/java/qianmu/container/activity/TestActivity.java +++ /dev/null @@ -1,78 +0,0 @@ -package qianmu.container.activity; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; - -import android.Manifest; -import android.content.pm.PackageManager; -import android.os.Bundle; -import android.util.Log; -import android.view.View; - -import qianmu.container.R; -import qianmu.container.util.TTSUtil; - -public class TestActivity extends AppCompatActivity implements View.OnClickListener { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_test); - setPermission(); - addEventListener(); - TTSUtil.connectLocalSocket(); - } - private void addEventListener(){ - findViewById(R.id.button).setOnClickListener(this); - findViewById(R.id.button2).setOnClickListener(this); - findViewById(R.id.button3).setOnClickListener(this); - findViewById(R.id.button4).setOnClickListener(this); - } - /** - * 检测权限并授权 - * */ - private void setPermission(){ - - if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){ - ActivityCompat.requestPermissions(this,new String[]{ - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.ACCESS_NETWORK_STATE, - Manifest.permission.CAMERA, - Manifest.permission.RECORD_AUDIO, - Manifest.permission.RECEIVE_BOOT_COMPLETED, - Manifest.permission.SYSTEM_ALERT_WINDOW, - Manifest.permission.READ_PHONE_STATE, - Manifest.permission.ACCESS_NETWORK_STATE},998); - } - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if(requestCode==998){ - - } - } - - - @Override - public void onClick(View view) { - switch (view.getId()){ - case R.id.button : - TTSUtil.startAsr(); - break; - case R.id.button2 : - TTSUtil.stopAsr(); - break; - case R.id.button3 : - TTSUtil.startTts("天有不测风云,人有旦夕祸福。蜈蚣百足,行不及蛇;雄鸡两翼,飞不过鸦。"); - break; - case R.id.button4 : - TTSUtil.stopTts(); - break; - } - } -} \ No newline at end of file diff --git a/app/src/main/java/qianmu/container/entity/TTSMessage.java b/app/src/main/java/qianmu/container/entity/TTSMessage.java index e25eaab..7233f42 100644 --- a/app/src/main/java/qianmu/container/entity/TTSMessage.java +++ b/app/src/main/java/qianmu/container/entity/TTSMessage.java @@ -31,8 +31,33 @@ public class TTSMessage { public static class Params { String text; - String speakUrl; + String status; + String ttsId; + String sessionId; + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + public String getTtsId() { + return ttsId; + } + + public void setTtsId(String ttsId) { + this.ttsId = ttsId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } public String getText() { return text; } @@ -41,12 +66,6 @@ public class TTSMessage { this.text = text; } - public String getSpeakUrl() { - return speakUrl; - } - public void setSpeakUrl(String speakUrl) { - this.speakUrl = speakUrl; - } } } diff --git a/app/src/main/java/qianmu/container/http/retrofit/BaseService.java b/app/src/main/java/qianmu/container/http/retrofit/BaseService.java index 57f3a50..6b2662b 100644 --- a/app/src/main/java/qianmu/container/http/retrofit/BaseService.java +++ b/app/src/main/java/qianmu/container/http/retrofit/BaseService.java @@ -141,6 +141,13 @@ public interface BaseService { @GET("api/data/v1/web/getFileResource") Call getFileResourceList2(@Query("projectCode") String code); + /** + * 获取资源文件(AI服务) + * @return + */ + @GET("api/aimgr/v1/web/file-resources") + Call getAiFileResource(@Query("projectCode") String code); + /** * 获取模型资源文件列表(水牌) * diff --git a/app/src/main/java/qianmu/container/util/TTSUtil.java b/app/src/main/java/qianmu/container/util/TTSUtil.java deleted file mode 100644 index 3b32abd..0000000 --- a/app/src/main/java/qianmu/container/util/TTSUtil.java +++ /dev/null @@ -1,117 +0,0 @@ -package qianmu.container.util; - -import com.google.gson.Gson; - -import org.greenrobot.eventbus.EventBus; -import org.java_websocket.drafts.Draft_6455; -import org.java_websocket.enums.ReadyState; - -import java.net.URI; - -import qianmu.container.entity.TTSMessage; -import qianmu.container.socket.SocketClient; - -/** - * 思必驰 语音调用 - */ -public class TTSUtil { - - private static SocketClient localSocketClient; - - - private static void initLocalSocketClient() { - try { - URI localUri = new URI("ws://127.0.0.1:50002"); - LoggerUtil.e("TTSSocketUri", localUri.toString()); - localSocketClient = new SocketClient(localUri, new Draft_6455()); - setLocalSocketListener(); - } catch (Throwable t) { - LoggerUtil.e("initSocketClient", StringUtil.getThrowableStr(t)); - } - } - - public static void connectLocalSocket() { - try { - //客户端不存在时 创建客户端设置监听事件 - if (localSocketClient == null) initLocalSocketClient(); - //获取客户端当前的连接状态 - ReadyState state = localSocketClient.getReadyState(); - LoggerUtil.e("connectLocalSocket", "TTS客户端连接状态:"+ GsonUtil.getGson().toJson(state)); - boolean open = localSocketClient.isOpen(); - LoggerUtil.e("connectLocalSocket", "TTS客户端连接状态:open="+open); - if (open) return; - //获取客户端当前的连接状态 - if (localSocketClient.isOpen()) return; - //未连接状态时 连接服务器 - if (state.equals(ReadyState.NOT_YET_CONNECTED)) localSocketClient.connect(); - else if (state.equals(ReadyState.CLOSING) || state.equals(ReadyState.CLOSED)) { - //正在关闭或者关闭状态时 重新连接服务器 - localSocketClient.reconnect(); - } - } catch (Throwable t) { - LoggerUtil.e("connectLocalSocket", StringUtil.getThrowableStr(t)); - destroyLocalSocketClient(); - } - } - // 识别语音 - public static void startAsr(){ - localSocketClient.send(StringUtil.strSplice("{\"method\":\"/asr/start\"}")); - } - // 停止语音识别 - public static void stopAsr(){ - localSocketClient.send(StringUtil.strSplice("{\"method\":\"/asr/stop\"}")); - } - // 开始语音合成 - public static void startTts(String txt){ - localSocketClient.send(StringUtil.strSplice("{\"method\": \"/tts/start\",\"params\": {\"text\":\"", txt, "\", \"mode\":\"autoPlay\"}}")); - } - // 停止语音合成 - public static void stopTts(){ - localSocketClient.send(StringUtil.strSplice("{\"method\":\"/tts/stop\"}")); - AudioPlay.stopPlay(); - } - - private static void setLocalSocketListener() { - localSocketClient.setOnOpenListener((handshakeData) -> { - LoggerUtil.e("connectLocalSocket", "TTS客户端连接成功"); - localSocketClient.send(StringUtil.strSplice("{\"id\":123,\"method\":\"/asr/stop\"}")); - }); - - localSocketClient.setOnMessageListener((conn, message) -> { - try { - TTSMessage messageBean = new Gson().fromJson(message, TTSMessage.class); - TTSMessage.Params content = messageBean.getParams(); - if (content == null) return; - LoggerUtil.e("ttsSocket:", messageBean.getMethod()); - if("asr.text".equals(messageBean.getMethod())){ - LoggerUtil.e("ttsSocket:",content.getText()); - } - if("asr.result".equals(messageBean.getMethod())){ - LoggerUtil.e("ttsSocket:",content.getText()); - } - if("tts.result".equals(messageBean.getMethod())){ - LoggerUtil.e("ttsSocket:",content.getSpeakUrl()); - } - } catch (Throwable t) { - LoggerUtil.e("setOnMessageListener", StringUtil.getThrowableStr(t)); - } - }); - - localSocketClient.setOnCloseListener((code, reason, remote) -> { - LoggerUtil.e("LocSocCliManager", "onClose:code="+code); - if (localSocketClient == null){ - initLocalSocketClient(); - }else { - localSocketClient.reconnect(); - } - }); - localSocketClient.setOnErrorListener((ex) -> LoggerUtil.e("LocSocCliManager", "onError")); - } - - //销毁当前的客户端 - public static void destroyLocalSocketClient() { - if (localSocketClient == null) return; - localSocketClient.close(); - localSocketClient = null; - } -} diff --git a/app/src/main/res/drawable/bg.mp4 b/app/src/main/res/drawable/bg.mp4 deleted file mode 100644 index a428363..0000000 Binary files a/app/src/main/res/drawable/bg.mp4 and /dev/null differ diff --git a/app/src/main/res/drawable/hello.mp4 b/app/src/main/res/drawable/hello.mp4 deleted file mode 100644 index a2d0417..0000000 Binary files a/app/src/main/res/drawable/hello.mp4 and /dev/null differ diff --git a/app/src/main/res/drawable/speek.mp4 b/app/src/main/res/drawable/speek.mp4 deleted file mode 100644 index 956086b..0000000 Binary files a/app/src/main/res/drawable/speek.mp4 and /dev/null differ diff --git a/app/src/main/res/raw/bg.mp4 b/app/src/main/res/raw/bg.mp4 index a428363..9c5787b 100644 Binary files a/app/src/main/res/raw/bg.mp4 and b/app/src/main/res/raw/bg.mp4 differ diff --git a/app/src/main/res/raw/hello.mp4 b/app/src/main/res/raw/hello.mp4 index a2d0417..54b06f2 100644 Binary files a/app/src/main/res/raw/hello.mp4 and b/app/src/main/res/raw/hello.mp4 differ diff --git a/app/src/main/res/raw/speek.mp4 b/app/src/main/res/raw/speek.mp4 index 956086b..26f7f7e 100644 Binary files a/app/src/main/res/raw/speek.mp4 and b/app/src/main/res/raw/speek.mp4 differ