Browse Source

add: 给蓝牙连接添加日志

huwanxiao 1 year ago
parent
commit
c700a684ee

+ 114 - 2
app/src/main/java/com/naz/sdkdemo/BaseApplication.java

@@ -2,13 +2,18 @@ package com.naz.sdkdemo;
 
 import android.app.Application;
 import android.content.Context;
+import android.content.Intent;
+import android.os.Environment;
 import android.util.Log;
 
 import com.clj.fastble.BleManager;
 import com.lzy.okgo.OkGo;
 import com.lzy.okgo.interceptor.HttpLoggingInterceptor;
 import com.lzy.okgo.model.HttpHeaders;
+import com.naz.sdkdemo.comm.Constants;
 import com.naz.sdkdemo.utils.ContextUtil;
+import com.naz.sdkdemo.utils.SPUtils;
+import com.naz.sdkdemo.weight.UserCache;
 import com.naz.sdkdemo.weight.XToast;
 import com.scwang.smartrefresh.layout.SmartRefreshLayout;
 import com.scwang.smartrefresh.layout.api.DefaultRefreshFooterCreator;
@@ -25,10 +30,20 @@ import net.posprinter.IConnectListener;
 import net.posprinter.IDeviceConnection;
 import net.posprinter.POSConnect;
 
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Calendar;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 import java.util.logging.Level;
 
+import androidx.annotation.NonNull;
 import androidx.multidex.MultiDex;
 import okhttp3.OkHttpClient;
 
@@ -39,6 +54,7 @@ import okhttp3.OkHttpClient;
  */
 public class BaseApplication extends Application {
     private static BaseApplication application;
+    private String TAG = "BaseApplication";
 
     static {
         //设置全局的Header构建器
@@ -74,12 +90,108 @@ public class BaseApplication extends Application {
         BleManager.getInstance().init(getApplication());
         BleManager.getInstance()
                 .enableLog(true)
-                .setReConnectCount(1, 5000)
                 .setSplitWriteNum(20)
-                .setConnectOverTime(10000)
+                .setConnectOverTime(15000)
                 .setOperateTimeout(5000);
+//        Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
     }
 
+//    private class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
+//
+//        @Override
+//        public void uncaughtException(@NonNull Thread t, @NonNull Throwable e) {
+//            // 捕获异常后的处理逻辑
+//            // 例如,可以将异常信息保存到SD卡或者发送到服务器
+//            String data = UserCache.getDeviceId() + "------>>" + Arrays.toString(e.getStackTrace()) + "------>>" + e.getMessage();
+//            String s = appendDataToLogFile(data, Constants.EXCEPTION_LOG_FILE_NAME);
+//            SPUtils.setString(Constants.IS_EXCEPTION_UNREAD, s);
+//            try {
+//                Thread.sleep(1000); // 等待1秒
+//            } catch (InterruptedException ie) {
+//                Log.e(TAG, "Interrupted while waiting for network request to complete", ie);
+//            }
+//            // Log.i(TAG, "uncaughtException: " + data);
+//            continueApplication(getApplication());
+//        }
+//    }
+
+    public static String appendDataToLogFile(String data, String fileNm) {
+        // 获取当前时间
+        Calendar calendar = Calendar.getInstance();
+        // 创建SimpleDateFormat对象
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
+        // 格式化时间
+        String formattedTime = sdf.format(calendar.getTime());
+        String formattedTime2 = sdf2.format(calendar.getTime());
+        // 保存日志
+        String fileName = formattedTime2 + fileNm;  // path: /storage/emulated/0/Documents/2024-06-03_log.txt
+        File logFile = null;
+        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
+            logFile = new File(Environment.getExternalStorageDirectory(), fileName);
+        }
+        //如果文件不存在则创建
+        if (!logFile.exists()) {
+            try {
+                logFile.createNewFile();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        try (BufferedWriter writer = new BufferedWriter(new FileWriter(logFile.getAbsoluteFile(), true))) {
+            // 使用true作为FileWriter构造函数的第二个参数,以启用追加模式
+            writer.write(formattedTime + " " + data);
+            writer.newLine();  // 如果你想在数据后添加换行符
+            Log.e("--------->>>", "--------->>>数据已成功追加到文件中");
+        } catch (IOException e) {
+            Log.e("--------->>>", "--------->>>追加日志发生错误");
+        }
+
+        return formattedTime + " " + data;
+    }
+
+    public static String readDataFromLogFile() {
+        StringBuilder str = new StringBuilder();
+        // 获取当前时间
+        Calendar calendar = Calendar.getInstance();
+        // 创建SimpleDateFormat对象
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
+        // 格式化时间
+        String formattedTime = sdf.format(calendar.getTime());
+        String formattedTime2 = sdf2.format(calendar.getTime());
+        // 保存日志
+        String fileName = formattedTime2 + "_dawangye_exception_log.txt";  // path: /storage/emulated/0/Documents/2024-06-03_log.txt
+        File logFile = null;
+        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
+            logFile = new File(Environment.getExternalStorageDirectory(), fileName);
+        }
+        //如果文件不存在则创建
+        if (!logFile.exists()) {
+            return str.toString();
+        }
+
+        try (BufferedReader reader = new BufferedReader(new FileReader(logFile))) {
+            String line;
+            while ((line = reader.readLine()) != null) {
+                // 处理读取到的每一行
+                str.append(line);
+            }
+        } catch (IOException e) {
+            // 处理异常
+            e.printStackTrace();
+        }
+        return str.toString();
+    }
+
+//    private void continueApplication(BaseApplication app) {
+//        Intent intent = new Intent(app, SplashActivity.class);
+//        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
+//        app.startActivity(intent);
+//        android.os.Process.killProcess(android.os.Process.myPid()); // 结束当前进程
+//    }
+
     private void initWebview() {
         QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
             @Override

+ 90 - 19
app/src/main/java/com/naz/sdkdemo/MainActivity.java

@@ -42,15 +42,18 @@ import com.clj.fastble.utils.HexUtil;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
+import com.naz.sdkdemo.activity.ApplyTrademarkCompleteActivity;
 import com.naz.sdkdemo.activity.ble.comm.ObserverManager;
 import com.naz.sdkdemo.base.BaseActivity;
 import com.naz.sdkdemo.bean.PrintModule;
 import com.naz.sdkdemo.bean.PrintModule2;
 import com.naz.sdkdemo.bean.PrintModule3;
+import com.naz.sdkdemo.comm.Constants;
 import com.naz.sdkdemo.helper.SerialPortManager;
 import com.naz.sdkdemo.http.ApiHelper;
 import com.naz.sdkdemo.utils.FastClickUtil;
 import com.naz.sdkdemo.utils.MyTools;
+import com.naz.sdkdemo.utils.SPUtils;
 import com.naz.sdkdemo.weight.UserCache;
 import com.naz.sdkdemo.weight.XToast;
 //import com.tencent.smtt.export.external.interfaces.WebResourceError;
@@ -72,6 +75,7 @@ import java.lang.reflect.Method;
 import java.lang.reflect.Type;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -137,6 +141,7 @@ public class MainActivity extends BaseActivity {
 
     // 相机现在是否正在打开, 用于处理用户在照相机预览页面点击返回按钮的情况
     private boolean cameraIsOpening = false;
+    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
 
     @Override
     protected int getLayoutResId() {
@@ -145,7 +150,6 @@ public class MainActivity extends BaseActivity {
 
     @Override
     protected void initView() {
-
         ll_nonet = findViewById(R.id.ll_nonet);
         ll_web = findViewById(R.id.ll_web);
         mWebView = findViewById(R.id.webview);
@@ -167,9 +171,9 @@ public class MainActivity extends BaseActivity {
         // 保存表单数据
         ws.setSaveFormData(true);
         // 是否应该支持使用其屏幕缩放控件和手势缩放
-        ws.setSupportZoom(true);
-        ws.setBuiltInZoomControls(true);
-        ws.setDisplayZoomControls(false);
+//        ws.setSupportZoom(true);
+//        ws.setBuiltInZoomControls(true);
+//        ws.setDisplayZoomControls(false);
         // 启动应用缓存
         ws.setAppCacheEnabled(true);
         // 设置缓存模式
@@ -179,7 +183,11 @@ public class MainActivity extends BaseActivity {
         ws.setUseWideViewPort(true);
         // 不缩放
         mWebView.setInitialScale(100);
-        mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+        } else {
+            mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+        }
         // 告诉WebView启用JavaScript执行。默认的是false。
         ws.setJavaScriptEnabled(true);
         //  页面加载好以后,再放开图片
@@ -473,13 +481,33 @@ public class MainActivity extends BaseActivity {
 
         @JavascriptInterface
         public void startScan(String name) {
-            Log.e(TAG2, "startScan name"+name);
+            String msg = "startScan name: " + name;
+            Log.e(TAG2, msg);
+            uploadLogMessage(msg, "ble");
+
+            if (bluetoothAdapter != null) {
+                // 设备不支持蓝牙
+                boolean enabled = bluetoothAdapter.isEnabled();
+                if (enabled) {
+                    String msg2 = "系统蓝牙已打开";
+                    Log.e(TAG2, msg2);
+                    uploadLogMessage(msg2, "ble");
+                } else {
+                    String msg2 = "系统蓝牙未打开";
+                    Log.e(TAG2, msg2);
+                    uploadLogMessage(msg2, "ble");
+                }
+            }
+
             checkPermissions(name);
         }
 
         @JavascriptInterface
         public void closeScan() {
-            Log.e(TAG2, "closeScan");
+            String msg = "closeScan";
+            Log.e(TAG2, msg);
+            uploadLogMessage(msg, "ble");
+
             toCloseScan();
         }
 
@@ -1414,16 +1442,25 @@ public class MainActivity extends BaseActivity {
 //        Toast.makeText(MainActivity.this, "开始连接", Toast.LENGTH_SHORT).show();
         if(mBleDevice == null) {
             // 蓝牙未连接过 或 连接的蓝牙不存在
-            Log.i(TAG2, "startScan: " + name + "未连接过");
+            String msg = "startScan: " + name + "未连接过";
+            Log.i(TAG2, msg);
+            uploadLogMessage(msg, "ble");
+
             doStartScan(name);
         } else if (!mBleDevice.getDevice().getName().contains(name)){
             // 要连接的蓝牙名字和之前的蓝牙设备不一致
             // 关闭先前的蓝牙, 再扫描新的蓝牙
-            Log.i(TAG2, "startScan: " + name + "与之前连接的蓝牙" + mBleDevice.getDevice().getName() + "不同");
+            String msg = "startScan: " + name + "与之前连接的蓝牙" + mBleDevice.getDevice().getName() + "不同";
+            Log.i(TAG2, msg);
+            uploadLogMessage(msg, "ble");
+
             toCloseScan();
             doStartScan(name);
         } else {
-            Log.i(TAG2, "startScan: " + "连接了相同的蓝牙" + name);
+            String msg = "startScan: " + "连接了相同的蓝牙" + name;
+            Log.i(TAG2, msg);
+            uploadLogMessage(msg, "ble");
+
             runOnUiThread(() -> {
                 mWebView.loadUrl("javascript:responseCode('6')");
             });
@@ -1445,7 +1482,10 @@ public class MainActivity extends BaseActivity {
             @Override
             public void onScanning(BleDevice bleDevice) {
                 if ((name+"BLE").equals(bleDevice.getName())){
-                    Log.i(TAG2, "onScanning: 找到了蓝牙" + bleDevice.getName());
+                    String msg = "onScanning: 找到了蓝牙" + bleDevice.getName();
+                    Log.i(TAG2, msg);
+                    uploadLogMessage(msg, "ble");
+
 //                    Toast.makeText(MainActivity.this, "名字匹配去链接", Toast.LENGTH_SHORT).show();
                     if (!BleManager.getInstance().isConnected(bleDevice)) {
                         BleManager.getInstance().cancelScan();
@@ -1468,12 +1508,18 @@ public class MainActivity extends BaseActivity {
 //                Toast.makeText(MainActivity.this, "扫描完成,是否成功="+isScanSuccess, Toast.LENGTH_SHORT).show();
                 if (isScanSuccess){
                     // 找到了匹配的蓝牙
-                    Log.i(TAG2, "onScanFinished: 找到了匹配的蓝牙");
+                    String msg = "onScanFinished: 找到了匹配的蓝牙";
+                    Log.i(TAG2, msg);
+                    uploadLogMessage(msg, "ble");
+
                     mWebView.loadUrl("javascript:responseCode('1')");
                 }else{
                     // 没找到匹配的蓝牙
                     // 返回不等于6的code
-                    Log.i(TAG2, "onScanFinished: 没找到匹配的蓝牙");
+                    String msg = "onScanFinished: 没找到匹配的蓝牙";
+                    Log.i(TAG2, msg);
+                    uploadLogMessage(msg, "ble");
+
                     mWebView.loadUrl("javascript:responseCode('2')");
                     XToast.showToast("未找到匹配蓝牙,请等待15秒后重试");
                     mBleDevice = null;
@@ -1491,7 +1537,10 @@ public class MainActivity extends BaseActivity {
 
             @Override
             public void onConnectFail(BleDevice bleDevice, BleException exception) {
-                Log.e(TAG2,"------>连接失败");
+                String msg = "------>连接失败";
+                Log.e(TAG2, msg);
+                uploadLogMessage(msg, "ble");
+
                 XToast.showToast("蓝牙连接失败,请等待15秒后重试");
 //                Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show();
                 mWebView.loadUrl("javascript:responseCode('2')");
@@ -1499,7 +1548,10 @@ public class MainActivity extends BaseActivity {
 
             @Override
             public void onConnectSuccess(BleDevice bleDevice, BluetoothGatt gatt, int status) {
-                Log.e(TAG2,"------>连接成功");
+                String msg = "------>连接成功";
+                Log.e(TAG2, msg);
+                uploadLogMessage(msg, "ble");
+
 //                Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_SHORT).show();
                 mBleDevice = bleDevice;
                 mWebView.loadUrl("javascript:responseCode('3')");
@@ -1528,7 +1580,10 @@ public class MainActivity extends BaseActivity {
                                                     @Override
                                                     public void run() {
 //                                                        Toast.makeText(MainActivity.this, "打开通知成功", Toast.LENGTH_SHORT).show();
-                                                        Log.e(TAG2,"-------->打开通知成功");
+                                                        String msg = "-------->打开通知成功";
+                                                        Log.e(TAG2, msg);
+                                                        uploadLogMessage(msg, "ble");
+
                                                         mWebView.loadUrl("javascript:responseCode('6')");
                                                     }
                                                 });
@@ -1536,7 +1591,10 @@ public class MainActivity extends BaseActivity {
 
                                             @Override
                                             public void onNotifyFailure(final BleException exception) {
-                                                Log.e(TAG2,"------>打开通知失败");
+                                                String msg = "------>打开通知失败";
+                                                Log.e(TAG2, msg);
+                                                uploadLogMessage(msg, "ble");
+
                                                 runOnUiThread(new Runnable() {
                                                     @Override
                                                     public void run() {
@@ -1571,10 +1629,16 @@ public class MainActivity extends BaseActivity {
             public void onDisConnected(boolean isActiveDisConnected, BleDevice bleDevice, BluetoothGatt gatt, int status) {
                 mBleDevice = null;
                 if (isActiveDisConnected) {
-                    Log.e(TAG2,"------>断开了");
+                    String msg = "------>断开了";
+                    Log.e(TAG2, msg);
+                    uploadLogMessage(msg, "ble");
+
                     mWebView.loadUrl("javascript:responseCode('4')");
                 } else {
-                    Log.e(TAG2,"------>连接断开");
+                    String msg = "------>连接断开";
+                    Log.e(TAG2, msg);
+                    uploadLogMessage(msg, "ble");
+
                     mWebView.loadUrl("javascript:responseCode('5')");
                     ObserverManager.getInstance().notifyObserver(bleDevice);
                 }
@@ -1900,4 +1964,11 @@ public class MainActivity extends BaseActivity {
                 break;
         }
     }
+    private void uploadLogMessage(String message, String type) {
+        String da = UserCache.getDeviceId() + "------>>" + message;
+        String s = BaseApplication.appendDataToLogFile(da, Constants.BLE_LOG_FILE_NAME);
+        ApiHelper.uploadExceptionLog(MainActivity.this, s, type, (code, msg, data1) -> {
+
+        });
+    }
 }

+ 5 - 0
app/src/main/java/com/naz/sdkdemo/comm/Constants.java

@@ -11,6 +11,9 @@ public class Constants {
     public static final int SIZE20 = 20;
     public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
     public static final MediaType FILE = MediaType.parse("multipart/form-data");
+
+    public static final String IS_EXCEPTION_UNREAD = "IS_EXCEPTION_UNREAD";
+
     /**
      * 设备code
      */
@@ -52,6 +55,8 @@ public class Constants {
     public static final String PORT = "PORT";
     public static final String SERIAL_NAME = "SERIAL_NAME";
     public static final String SERIAL_RATE = "SERIAL_RATE";
+    public static final String BLE_LOG_FILE_NAME = "BLE_LOG_FILE_NAME";
+    public static final String EXCEPTION_LOG_FILE_NAME = "EXCEPTION_LOG_FILE_NAME";
 
     public static String mark_speed = "01f4";//500转十进制,高低位
     public static String mark_num = "0001";//1

+ 4 - 0
app/src/main/java/com/naz/sdkdemo/http/Api.java

@@ -246,4 +246,8 @@ public class Api {
     public static String POST_UPLOAD_PICTURE(){
         return "http://fyy_api.qingyaokeji.com/api/tbjobs1";
     }
+
+    public static String UPLOAD_EXCEPTION_LOG(){
+        return "https://clouddevice.qingyaokeji.com/api/andriodLog";
+    }
 }

+ 21 - 0
app/src/main/java/com/naz/sdkdemo/http/ApiHelper.java

@@ -1,6 +1,7 @@
 package com.naz.sdkdemo.http;
 
 import android.app.Activity;
+import android.content.Context;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -593,6 +594,26 @@ public class ApiHelper {
                 });
     }
 
+    public static void uploadExceptionLog(Context context, String content, String type, Callback callback) {
+        JSONObject raw = new JSONObject();
+        try {
+            raw.put("type", type);   // type: door-开关门日志, exception-异常日志, login-登录日志
+            raw.put("content", content);
+        } catch (JSONException e) {
+
+        }
+        OkGo.<BaseResponse2<List<String>>>post(Api.UPLOAD_EXCEPTION_LOG())
+            .upString(raw.toString())
+            .execute(new DialogCallback<BaseResponse2<List<String>>>(context, false) {
+                @Override
+                public void onSuccess(Response<BaseResponse2<List<String>>> response) {
+                    if ("200".equals(response.body().status)){
+                        callback.onSuccess(Callback.SUCCESS, null, response.body().data);
+                    }
+                }
+            });
+    }
+
     public static void getBrandRecover(String no, List<ScanRecycleInfo> mData, Activity activity, Callback callback) {
         JSONObject body = new JSONObject();
         try {