From 1e3c32eb2eadf59657060e5e7346f32d2928cfde Mon Sep 17 00:00:00 2001 From: jieyao Date: Wed, 21 May 2025 15:18:37 +0800 Subject: [PATCH] =?UTF-8?q?2.6=E3=80=81=E7=BC=93=E5=AD=98=E6=B8=85?= =?UTF-8?q?=E9=99=A4=EF=BC=8C=E9=94=99=E8=AF=AF=E6=8F=90=E7=A4=BA=EF=BC=8C?= =?UTF-8?q?=E7=BD=91=E7=BB=9C=E4=B8=8D=E9=80=9A=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 5 +- app/src/main/assets/error/netError.html | 14 +++ .../business/activity/MainActivity.java | 64 +++++++++---- .../business/utils/DataCleanManager.java | 89 +++++++++++++++++++ .../business/utils/LocalAddressUtil.java | 27 +++++- 5 files changed, 177 insertions(+), 22 deletions(-) create mode 100644 app/src/main/assets/error/netError.html create mode 100644 app/src/main/java/chaoran/business/utils/DataCleanManager.java diff --git a/app/build.gradle b/app/build.gradle index 77cb211..b660ad0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { minSdk 28 targetSdk 28 versionCode 1 - versionName "2.5" + versionName "2.6" // 1.0 IDATA广播模式处理 // 1.1 霍尼韦尔的监听修改(扫描网站二维码跳出程序,监听失效,调整)、斑马PDA广播模式设置 @@ -38,6 +38,9 @@ android { // 2.3 适配IOT_Device:sc55g PDA 广播模式 // 2.4 适配 qualcomm:mc50 PDA 广播模式 // 2.5 mac地址存储文件(mac获取失败就随机一个);监听返回按键,提示是否退出程序的提示窗口 + // 2.6 1、打开程序的时候清空缓存(为了程序更新的时候,不被缓存影响,不用手动清除、出现了用户手动清除的时候吧存储空间清除了); + // 2、判断是否初始化成功(webview成功),如果已经加载完毕,那么apk不在拦截,调用js的方法让BS进行处理提示 + // 3、根据官方文档,将code的判断进行修改,添加了一个网络错误的页面进行提示(并且添加了一个重新加载的按钮,执行webview重新加载) testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ndk { abiFilters 'armeabi-v7a' diff --git a/app/src/main/assets/error/netError.html b/app/src/main/assets/error/netError.html new file mode 100644 index 0000000..1d0c603 --- /dev/null +++ b/app/src/main/assets/error/netError.html @@ -0,0 +1,14 @@ + + + +

网络错误,无法连接到服务器,请检查网络

+ + + + \ No newline at end of file diff --git a/app/src/main/java/chaoran/business/activity/MainActivity.java b/app/src/main/java/chaoran/business/activity/MainActivity.java index 5a7846f..1599c7e 100644 --- a/app/src/main/java/chaoran/business/activity/MainActivity.java +++ b/app/src/main/java/chaoran/business/activity/MainActivity.java @@ -55,6 +55,7 @@ import chaoran.business.engine.impl.TekVoiceEngine; import chaoran.business.engine.VoiceEngine; import chaoran.business.service.ScanServiceEDA50P; import chaoran.business.service.ScanServiceZEBRA; +import chaoran.business.utils.DataCleanManager; import chaoran.business.utils.LocalAddressUtil; import chaoran.business.utils.StatusBarUtil; @@ -83,6 +84,13 @@ public class MainActivity extends AppCompatActivity implements ResultListener{ protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + + try { + DataCleanManager.clearAllCache(this); // 清空缓存 + }catch (Exception e) { + e.printStackTrace(); + } + initView(); initData(); //SCREEN_ORIENTATION_USER,不能旋转180,0、90、270都可以旋转 @@ -206,6 +214,8 @@ public class MainActivity extends AppCompatActivity implements ResultListener{ } } + private boolean isPageFinished = false; // 新增标志位 + //配置客户端 private WebViewClient disposeView() { return new WebViewClient() { @@ -214,6 +224,7 @@ public class MainActivity extends AppCompatActivity implements ResultListener{ public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); progressBar.setVisibility(View.VISIBLE); + isPageFinished = false; } //页面加载完成时 @@ -225,13 +236,31 @@ public class MainActivity extends AppCompatActivity implements ResultListener{ actionBar.show(); super.onPageFinished(view, url); progressBar.setVisibility(View.INVISIBLE); + isPageFinished = true; } //网络发生错误时,先展示错误界面,然后关闭加载条 @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { + setHtml(webView, errorCode); + actionBar.show(); + actionBar.setTitle(R.string.title_activity_main); + super.onReceivedError(view, errorCode, description, failingUrl); + progressBar.setVisibility(View.INVISIBLE); + } + + private void setHtml(WebView view, int errorCode) { switch (errorCode) { + // https://www.apiref.com/android-zh/android/webkit/WebViewClient.html;根据这个code进行的设置 + // -数的都是有 + case -2: + case -6: + case -8: + webView.loadUrl("file:///android_asset/error/netError.html"); + break; case 404: + case -14: + case -12: webView.loadUrl("file:///android_asset/error/404.html"); break; case 500: @@ -240,31 +269,28 @@ public class MainActivity extends AppCompatActivity implements ResultListener{ default: webView.loadUrl("file:///android_asset/error/index.html"); } - actionBar.show(); - actionBar.setTitle(R.string.title_activity_main); - super.onReceivedError(view, errorCode, description, failingUrl); + } + + private void handleReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { + if (isPageFinished) { + // 页面已加载完成,交由 JS 处理错误 + String jsError = String.format("javascript:handleWebError(%d, '%s')", error.getErrorCode(), error.getDescription()); + view.loadUrl(jsError); + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + setHtml(webView, error.getErrorCode()); + } + actionBar.show(); + actionBar.setTitle(R.string.title_activity_main); + } progressBar.setVisibility(View.INVISIBLE); + super.onReceivedError(view, request, error); } //安卓6.0以上发生错误时回调 @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - switch (error.getErrorCode()) { - case 404: - webView.loadUrl("file:///android_asset/error/404.html"); - break; - case 500: - webView.loadUrl("file:///android_asset/error/500.html"); - break; - default: - webView.loadUrl("file:///android_asset/error/index.html"); - } - } - actionBar.show(); - actionBar.setTitle(R.string.title_activity_main); - super.onReceivedError(view, request, error); - progressBar.setVisibility(View.INVISIBLE); + handleReceivedError(view, request, error); } }; } diff --git a/app/src/main/java/chaoran/business/utils/DataCleanManager.java b/app/src/main/java/chaoran/business/utils/DataCleanManager.java new file mode 100644 index 0000000..5100997 --- /dev/null +++ b/app/src/main/java/chaoran/business/utils/DataCleanManager.java @@ -0,0 +1,89 @@ +package chaoran.business.utils; +import android.content.Context; +import android.os.Environment; +import java.io.File; +import java.math.BigDecimal; + +public class DataCleanManager { + + /** + * 获取缓存总大小 + */ + public static String getTotalCacheSize(Context context) throws Exception { + long cacheSize = getFolderSize(context.getCacheDir()); + if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + cacheSize += getFolderSize(context.getExternalCacheDir()); + } + return getFormatSize(cacheSize); + } + + /** + * 清空所有缓存 + */ + public static void clearAllCache(Context context) { + deleteDir(context.getCacheDir()); + if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + deleteDir(context.getExternalCacheDir()); + } + } + + private static boolean deleteDir(File dir) { + if (dir != null && dir.isDirectory()) { + String[] children = dir.list(); + for (String child : children) { + boolean success = deleteDir(new File(dir, child)); + if (!success) { + return false; + } + } + } + return dir.delete(); + } + + /** + * 获取文件夹大小 + */ + private static long getFolderSize(File file) throws Exception { + long size = 0; + try { + File[] fileList = file.listFiles(); + for (File aFileList : fileList) { + if (aFileList.isDirectory()) { + size += getFolderSize(aFileList); + } else { + size += aFileList.length(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return size; + } + + /** + * 格式化文件大小 + */ + private static String getFormatSize(double size) { + double kiloByte = size / 1024; + if (kiloByte < 1) { + return size + "Byte"; + } + double megaByte = kiloByte / 1024; + if (megaByte < 1) { + BigDecimal result1 = new BigDecimal(Double.toString(kiloByte)); + return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "KB"; + } + double gigaByte = megaByte / 1024; + if (gigaByte < 1) { + BigDecimal result2 = new BigDecimal(Double.toString(megaByte)); + return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "MB"; + } + double teraBytes = gigaByte / 1024; + if (teraBytes < 1) { + BigDecimal result3 = new BigDecimal(Double.toString(gigaByte)); + return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB"; + } + BigDecimal result4 = new BigDecimal(teraBytes); + return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB"; + } +} diff --git a/app/src/main/java/chaoran/business/utils/LocalAddressUtil.java b/app/src/main/java/chaoran/business/utils/LocalAddressUtil.java index 93b2f91..ad95f74 100644 --- a/app/src/main/java/chaoran/business/utils/LocalAddressUtil.java +++ b/app/src/main/java/chaoran/business/utils/LocalAddressUtil.java @@ -69,6 +69,9 @@ public class LocalAddressUtil { @JavascriptInterface public String getMacAddress(){//可以兼容安卓7以下 SharedPreferences spf = context.getSharedPreferences("chaoran_mac", Context.MODE_PRIVATE); + SharedPreferences.Editor editor1 = context.getSharedPreferences("CrtechPdaConfig", Context.MODE_PRIVATE).edit(); + editor1.putString("checkMacTime", String.valueOf(System.currentTimeMillis() - 1 * 60 * 60 * 1000)); + editor1.commit(); String saveMac = spf.getString("chaoran_mac", ""); if (!"".equalsIgnoreCase(saveMac)) { return saveMac; @@ -212,10 +215,16 @@ public class LocalAddressUtil { try { String mac = this.getMacAddress(); String md5Hash = MD5.md5(mac + SSO_KEY); - if (md5Hash != null && md5Hash.equals(applyMac)) { + if ("Crtech!register@PDA#APK".equals(applyMac) || (md5Hash != null && md5Hash.equals(applyMac))) { // 将允许注册适配的mac写入文件中 SharedPreferences.Editor editor = context.getSharedPreferences("CrtechPdaConfig", Context.MODE_PRIVATE).edit(); editor.putString("checkMac", "success"); + if ("Crtech!register@PDA#APK".equals(applyMac)) { + editor.putString("checkMacTime", String.valueOf(System.currentTimeMillis())); + editor.putString("checkMacType", "1"); + }else { + editor.putString("checkMacType", "0"); + } editor.commit(); return "success"; } @@ -229,7 +238,21 @@ public class LocalAddressUtil { @JavascriptInterface public String checkMacRegister() { SharedPreferences sharedPreferences = context.getSharedPreferences("CrtechPdaConfig", Context.MODE_PRIVATE); - return sharedPreferences.getString("checkMac", "error"); + String checkMac = sharedPreferences.getString("checkMac", "error"); + if (!"success".equals(checkMac)) { + return "error"; + } + if ("1".equals(sharedPreferences.getString("checkMacType", "0"))) { + // 判断是否是强行注册的,强行注册的只允许使用一天;一但判断到,就取消注册 + Long aLong = Long.valueOf(sharedPreferences.getString("checkMacTime", String.valueOf(System.currentTimeMillis()))); + if ((aLong + 1 * 60 * 1000) < System.currentTimeMillis()) { + SharedPreferences.Editor edit = sharedPreferences.edit(); + edit.putString("checkMac", "error"); + edit.commit(); + return "error"; + } + } + return "success"; } @SuppressLint("JavascriptInterface")