Browse Source

fix: ci

master
高志龙 1 week ago
parent
commit
6ef94a1fee
  1. 11
      app/build.gradle
  2. 150
      app/src/main/java/qianmu/container/activity/H5/WebViewActivity.java
  3. 3994
      app/src/main/java/qianmu/container/activity/program/ViewScreenSaver.java
  4. 15
      app/src/main/java/qianmu/container/mqtt/MQTTService.java
  5. 25
      app/src/main/java/qianmu/container/util/TTSUtil.java
  6. 42
      app/src/main/res/layout/view_screen_saver.xml

11
app/build.gradle

@ -12,17 +12,10 @@ android {
minSdkVersion 24
targetSdkVersion 30
versionCode 6
versionName "V2.0.8.28"
// 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
//V2.0.8.20 SDK的mac获取和APP更新
versionName "V2.0.8.30"
//V2.0.8.22 ai背景视频切换代码
//V2.0.8.23
//V2.0.8.30 4
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles 'consumer-rules.pro'

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

@ -120,19 +120,20 @@ public class WebViewActivity extends BaseActivity {
//static String HtmlUrl = "http://192.168.0.106:5173/";//webServer服务地址
//static String HtmlUrl = "https://iot.1000my.com/api/application-unzip-path/v1/static/77b853bf-a43a-47ba-bc0c-0160229b6ca2/index.html?projectCode=project-ce-k6xi8vq_deqrszdepga&code=Sn9tXh8jMLd4GjfiVdInl#/";
int time = 0;
String interfaceRequestData="";
// 已废弃:结果现在通过 Message.obj 传递,不再使用共享字段
// String interfaceRequestData="";
private long resumeTimeMs = 0;
private static final long GO_SCREEN_SAVE_MIN_INTERVAL = 10000; // 页面加载后至少10秒才允许进入屏保
private boolean webViewAlreadyDestroyed = false;
// 语音听写对象
private AICloudASREngine mEngine;
private AICloudASRIntent aiCloudASRIntent;
private volatile AICloudASREngine mEngine;
private volatile AICloudASRIntent aiCloudASRIntent;
private TTSUtil ttsUtil;
private String oldString="";
// 语音听写对象
private ASR mAsr;
private boolean isrun = false; // 是否正在听写
private volatile boolean isrun = false; // 是否正在听写
private KDXFUtil kxdfttsUtil;
private final InnerHandler handler = new InnerHandler(this);
@ -196,8 +197,11 @@ public class WebViewActivity extends BaseActivity {
break;
case TYPE_SHENG_HTML_MAG:
activity.getHandWriting(activity.interfaceRequestData);
activity.interfaceRequestData = "";
// 结果通过 msg.obj 传入,避免多次并发请求覆盖共享字段
String handWritingData = (String) msg.obj;
if (handWritingData != null) {
activity.getHandWriting(handWritingData);
}
DeviceData.saveInterfaceRequest("");
break;
}
@ -282,47 +286,28 @@ public class WebViewActivity extends BaseActivity {
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
wv.setWebViewClient(new WebViewClient() {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail) {
LoggerUtil.e("WebViewCrash", "WebView 渲染进程崩溃,OOM被杀: " + !detail.didCrash());
webViewAlreadyDestroyed = true;
try {
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) parent.removeView(view);
view.stopLoading();
view.loadUrl("about:blank");
view.clearHistory();
view.clearCache(true);
view.removeAllViews();
view.destroy();
}
} catch (Exception e) {
LoggerUtil.e("WebViewCrash", e.toString());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
wv.setWebViewClient(new CrashAwareWebViewClient());
} else {
wv.setWebViewClient(new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
return super.shouldInterceptRequest(view, request);
}
ProcessPhoenix.triggerRebirth(WebViewActivity.this);
return true;
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
return super.shouldInterceptRequest(view, request);
}
@Override
@TargetApi(Build.VERSION_CODES.N)
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return false;
}
@Override
@TargetApi(Build.VERSION_CODES.N)
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return false;
}
@Override
@SuppressWarnings("deprecation")
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
@Override
@SuppressWarnings("deprecation")
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
}
wv.setWebChromeClient(new WebChromeClient() {
public boolean onConsoleMessage(ConsoleMessage cm) {
@ -576,6 +561,7 @@ public class WebViewActivity extends BaseActivity {
@JavascriptInterface
public void startTTS(String content) {
LoggerUtil.e(TAG,"JS调用了Android的方法:startTTS()");
if (content == null || content.isEmpty()) return;
if("sbc".equals(Constant.TTSHome)){
if (ttsUtil == null) return;
ttsUtil.startTTs(content.toLowerCase(Locale.ENGLISH));
@ -614,9 +600,11 @@ public class WebViewActivity extends BaseActivity {
DeviceData.queryOfflineDataByInterfaceToPost(WebViewActivity.this, url, map, new QueryFinishListener() {
@Override
public void onFinish() {
if(state){
interfaceRequestData = DeviceData.getInterfaceRequestData();
handler.sendEmptyMessage(TYPE_SHENG_HTML_MAG);
if (state) {
// 结果随 Message 传递,避免并发请求覆盖同一个共享字段
Message msg = handler.obtainMessage(TYPE_SHENG_HTML_MAG);
msg.obj = DeviceData.getInterfaceRequestData();
handler.sendMessage(msg);
}
}
});
@ -625,17 +613,16 @@ public class WebViewActivity extends BaseActivity {
// h5调用android:接口请求get
@JavascriptInterface
public void interfaceRequest(String url , boolean state) {
DeviceData.queryOfflineDataByInterfaceToGet(WebViewActivity.this, url, new QueryFinishListener() {
@Override
public void onFinish() {
if(state){
interfaceRequestData = DeviceData.getInterfaceRequestData();
handler.sendEmptyMessage(TYPE_SHENG_HTML_MAG);
if (state) {
Message msg = handler.obtainMessage(TYPE_SHENG_HTML_MAG);
msg.obj = DeviceData.getInterfaceRequestData();
handler.sendMessage(msg);
}
}
});
// LoggerUtil.e(TAG,"JS调用了Android的方法:interfaceRequest2():"+url);
}
@ -673,14 +660,15 @@ public class WebViewActivity extends BaseActivity {
* android调用js传送识别语音内容
* */
public void voiceContent(String msg) {
if (webView != null) {
LoggerUtil.e(TAG, "android调用js方法:giveAskText(),语音内容:" + msg);
runOnUiThread(() -> {
if (webView != null) {
webView.loadUrl(StringUtil.strSplice("javascript:window.giveAskText('" + msg + "');"));
}
});
}
if (webView == null) return;
LoggerUtil.e(TAG, "android调用js方法:giveAskText(),语音内容:" + msg);
// evaluateJavascript + JSONObject.quote 避免 msg 含单引号/反斜杠时 JS 语法崩溃
String jsArg = org.json.JSONObject.quote(msg != null ? msg : "");
runOnUiThread(() -> {
if (webView != null) {
webView.evaluateJavascript("window.giveAskText(" + jsArg + ");", null);
}
});
}
/**
@ -940,4 +928,46 @@ public class WebViewActivity extends BaseActivity {
});
}
};
@RequiresApi(api = Build.VERSION_CODES.O)
private class CrashAwareWebViewClient extends WebViewClient {
@Override
public boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail) {
LoggerUtil.e("WebViewCrash", "WebView 渲染进程崩溃,OOM被杀: " + !detail.didCrash());
webViewAlreadyDestroyed = true;
try {
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) parent.removeView(view);
view.stopLoading();
view.loadUrl("about:blank");
view.clearHistory();
view.clearCache(true);
view.removeAllViews();
view.destroy();
}
} catch (Exception e) {
LoggerUtil.e("WebViewCrash", e.toString());
}
ProcessPhoenix.triggerRebirth(WebViewActivity.this);
return true;
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
return super.shouldInterceptRequest(view, request);
}
@Override
@TargetApi(Build.VERSION_CODES.N)
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return false;
}
@Override
@SuppressWarnings("deprecation")
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
}
}

3994
app/src/main/java/qianmu/container/activity/program/ViewScreenSaver.java

File diff suppressed because it is too large

15
app/src/main/java/qianmu/container/mqtt/MQTTService.java

@ -261,14 +261,15 @@ public class MQTTService extends Service {
EventBus.getDefault().post(new MessageEvent(Constant.ACTION_RESTART_MQTT));
return;
}
if (!isConnected) {
LoggerUtil.e(TAG,"MQTT尝试重连");
client.connect(conOpt, null, iMqttActionListener);
}
} catch (MqttException e) {
e.printStackTrace();
if (!isConnected) {
LoggerUtil.e(TAG,"MQTT尝试重连");
client.connect(conOpt, null, iMqttActionListener);
}
} catch (Exception e) {
// BackgroundServiceStartNotAllowedException (Android 12+) 等非 MqttException 也需要捕获
// 否则异常传播至 onCreate() 导致服务创建失败引发 APP 崩溃重启
LoggerUtil.e(TAG, "MQTT连接异常: " + e.getMessage());
}
}
// MQTT是否连接成功

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

@ -14,15 +14,19 @@ import com.aispeech.export.listeners.AITTSListener;
import org.greenrobot.eventbus.EventBus;
import org.json.JSONArray;
import java.util.concurrent.atomic.AtomicInteger;
import qianmu.container.app.Constant;
import qianmu.container.app.MyApplication;
import qianmu.container.entity.MessageEvent;
public class TTSUtil {
private static String TAG = "TTS: ";
// 语音合成对象
private AICloudTTSEngine mEngine;
private AICloudTTSIntent intent;
// 语音合成对象:主线程写(initTts),JS/回调线程读,必须 volatile
private volatile AICloudTTSEngine mEngine;
private volatile AICloudTTSIntent intent;
private final AtomicInteger utteranceCounter = new AtomicInteger(0);
private volatile int expectedUtteranceId = -1;
public void initTts(){
@ -55,7 +59,14 @@ public class TTSUtil {
@Override
public void onCompletion(String utteranceId) {
LoggerUtil.e(TAG, "onCompletion: " + utteranceId);
EventBus.getDefault().post(new MessageEvent(Constant.VOID_STOP));
try {
// 只有最新一次 speak 完成才通知,忽略被 stopTTs() 作废的旧请求
if (Integer.parseInt(utteranceId) == expectedUtteranceId) {
EventBus.getDefault().post(new MessageEvent(Constant.VOID_STOP));
}
} catch (NumberFormatException e) {
EventBus.getDefault().post(new MessageEvent(Constant.VOID_STOP));
}
}
@Override
@ -105,13 +116,17 @@ public class TTSUtil {
initTts();
}
if (null == mEngine || null == intent) return;
mEngine.speak(intent, texts, "1024");
mEngine.stop(); // 先停止当前播放,避免上一条 speak 音频叠加
int id = utteranceCounter.incrementAndGet();
expectedUtteranceId = id;
mEngine.speak(intent, texts, String.valueOf(id));
}
//停止听写
public void stopTTs(){
LoggerUtil.d(TAG, "手动暂停播放");
if (null == mEngine) return;
expectedUtteranceId = -1; // 作废当前期望,onCompletion 不再触发事件
mEngine.stop();
}

42
app/src/main/res/layout/view_screen_saver.xml

@ -60,6 +60,48 @@
android:id="@+id/videoImg1"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="@dimen/dimens_1"
android:layout_height="@dimen/dimens_1"
android:id="@+id/layout_video2"
android:gravity="center"
android:visibility="gone">
<qianmu.container.view.CustomerVideoView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/videoView2"
/>
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:visibility="gone"
android:id="@+id/videoImg2"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="@dimen/dimens_1"
android:layout_height="@dimen/dimens_1"
android:id="@+id/layout_video3"
android:gravity="center"
android:visibility="gone">
<qianmu.container.view.CustomerVideoView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/videoView3"
/>
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:visibility="gone"
android:id="@+id/videoImg3"/>
</RelativeLayout>
<RelativeLayout

Loading…
Cancel
Save