diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d3f6b665f..f178f1635 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -148,6 +148,9 @@ + reference : activities) { - if(reference.get()==activity){ + if (reference.get() == activity) { activities.remove(reference); return; } @@ -297,7 +297,7 @@ public class AppContext extends CommonAppContext { e.printStackTrace(); //闪退后finish所有Activity并且杀死进程 for (WeakReference activity : activities) { - if (activity != null) { + if (activity != null && activity.get() != null) { activity.get().finish(); } } diff --git a/app/src/main/java/com/shayu/phonelive/NeverCrashUtils.java b/app/src/main/java/com/shayu/phonelive/NeverCrashUtils.java index fa761d83c..c5f677c5f 100644 --- a/app/src/main/java/com/shayu/phonelive/NeverCrashUtils.java +++ b/app/src/main/java/com/shayu/phonelive/NeverCrashUtils.java @@ -6,6 +6,8 @@ import android.os.Looper; import android.util.Log; import android.widget.Toast; import com.yunbao.common.utils.FileUtil; +import com.yunbao.common.utils.SpUtil; + import java.io.File; import java.io.PrintWriter; import java.io.StringWriter; @@ -94,7 +96,7 @@ public class NeverCrashUtils { } e.printStackTrace(); Toast.makeText(application, "发生闪退", Toast.LENGTH_SHORT).show(); - // FileUtil.saveStringToFile(new File(application.getDir("files", Context.MODE_PRIVATE).getAbsolutePath()),throwableToString(e),"error.log"); + FileUtil.saveStringToFile(new File(application.getDir("files", Context.MODE_PRIVATE).getAbsolutePath()),throwableToString(e),"error.log"); getMainCrashHandler().mainException(Looper.getMainLooper().getThread(), e); } @@ -124,8 +126,13 @@ public class NeverCrashUtils { } private static String throwableToString(Throwable e) { StringWriter writer=new StringWriter(); + writer.write(SpUtil.getInstance().getStringValue(SpUtil.USER_INFO)); + writer.write("\n"); + writer.write("time="+System.currentTimeMillis()); + writer.write("\n"); + writer.write("[ERROR]"); PrintWriter printWriter=new PrintWriter(writer); e.printStackTrace(printWriter); - return "[ERROR]"+writer.toString(); + return writer.toString(); } } \ No newline at end of file diff --git a/app/src/main/java/com/shayu/phonelive/activity/LauncherActivity.java b/app/src/main/java/com/shayu/phonelive/activity/LauncherActivity.java index 963dab50f..b67bb3bb4 100644 --- a/app/src/main/java/com/shayu/phonelive/activity/LauncherActivity.java +++ b/app/src/main/java/com/shayu/phonelive/activity/LauncherActivity.java @@ -27,6 +27,7 @@ import com.adjust.sdk.AdjustEvent; import com.alibaba.android.arouter.facade.annotation.Route; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.shayu.phonelive.AppContext; import com.tencent.rtmp.ITXLivePlayListener; import com.tencent.rtmp.TXLiveBase; import com.tencent.rtmp.TXLiveConstants; @@ -48,6 +49,7 @@ import com.yunbao.common.manager.IMLoginManager; import com.yunbao.common.manager.imrongcloud.RongcloudIMManager; import com.yunbao.common.utils.DownloadUtil; import com.yunbao.common.utils.L; +import com.yunbao.common.utils.LogUtil; import com.yunbao.common.utils.MD5Util; import com.yunbao.common.utils.RouteUtil; import com.yunbao.common.utils.SpUtil; @@ -137,6 +139,7 @@ public class LauncherActivity extends AppCompatActivity implements View.OnClickL } }; mHandler.sendEmptyMessageDelayed(WHAT_GET_CONFIG, 1000); + LogUtil.pushError(AppContext.sInstance); } diff --git a/common/src/main/java/com/yunbao/common/CommonAppConfig.java b/common/src/main/java/com/yunbao/common/CommonAppConfig.java index edbe22569..f514fc808 100644 --- a/common/src/main/java/com/yunbao/common/CommonAppConfig.java +++ b/common/src/main/java/com/yunbao/common/CommonAppConfig.java @@ -33,6 +33,8 @@ public class CommonAppConfig { public static final String HOST = getMetaDataString("SERVER_HOST"); //是否使用谷歌支付 public static final boolean IS_GOOGLE_PLAY = getMetaDataBoolean("IS_GOOGLE_PLAY"); + //是否开启上报错误日志功能 + public static final boolean IS_UPLOAD_ERROR_LOG = getMetaDataBoolean("IS_UPLOAD_ERROR_LOG"); //外部sd卡 public static final String DCMI_PATH = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath(); diff --git a/common/src/main/java/com/yunbao/common/utils/FileUtil.java b/common/src/main/java/com/yunbao/common/utils/FileUtil.java index 7e18855b0..6563406fc 100644 --- a/common/src/main/java/com/yunbao/common/utils/FileUtil.java +++ b/common/src/main/java/com/yunbao/common/utils/FileUtil.java @@ -2,9 +2,11 @@ package com.yunbao.common.utils; import android.media.MediaMetadataRetriever; +import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.FileReader; import java.io.PrintWriter; /** @@ -32,6 +34,26 @@ public class FileUtil { } } + /** + * 从文件读取字符串 + */ + public static String loadStringToFile(File file){ + if(file.exists()){ + try { + BufferedReader reader=new BufferedReader(new FileReader(file)); + StringBuilder builder=new StringBuilder(); + String tmp; + while ((tmp=reader.readLine())!=null){ + builder.append(tmp).append("\n"); + } + return builder.toString(); + } catch (Exception e) { + e.printStackTrace(); + } + } + return ""; + } + /** * 获取 视频 或 音频 时长 * @param path 视频 或 音频 文件路径 diff --git a/common/src/main/java/com/yunbao/common/utils/LogUtil.java b/common/src/main/java/com/yunbao/common/utils/LogUtil.java index 61d49238f..8c52d9a82 100644 --- a/common/src/main/java/com/yunbao/common/utils/LogUtil.java +++ b/common/src/main/java/com/yunbao/common/utils/LogUtil.java @@ -1,9 +1,24 @@ package com.yunbao.common.utils; +import android.content.Context; import android.text.TextUtils; +import android.util.Log; + +import com.lzy.okgo.OkGo; +import com.lzy.okgo.callback.StringCallback; +import com.lzy.okgo.model.Progress; +import com.lzy.okgo.model.Response; +import com.lzy.okgo.request.PostRequest; +import com.lzy.okserver.OkUpload; +import com.lzy.okserver.upload.UploadListener; +import com.lzy.okserver.upload.UploadTask; +import com.yunbao.common.CommonAppConfig; import java.io.File; import java.io.FileWriter; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; /** * Created by cxf on 2019/6/20. @@ -31,4 +46,59 @@ public class LogUtil { } } } + public static void pushError(Context context){ + if(!CommonAppConfig.IS_UPLOAD_ERROR_LOG){ + return; + } + File file = new File(context.getDir("files", Context.MODE_PRIVATE).getAbsolutePath()+File.separator+"error.log"); + if(file.exists()){ + Log.i("异常上传", "pushError: 准备上传文件"); + String err = FileUtil.loadStringToFile(file); + PostRequest request = OkGo.post("https://newht.yaoulive.com/index.php/api/error_log/report") + .params("log", err) + .params("uid", CommonAppConfig.getInstance().getUid()) + .params("time", new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss", Locale.CHINA).format(new Date())) + .params("isGoogle",CommonAppConfig.IS_GOOGLE_PLAY) + .params("appVersion",CommonAppConfig.getInstance().getVersion()) + .tag("errorLog") + .converter(new StringCallback() { + String TAG = "异常上传"; + + @Override + public void onSuccess(Response response) { + Log.i(TAG, "onSuccess: " + response.message()); + file.delete(); + } + }); + UploadTask task = OkUpload.request("errorLog", request) + .save() + .register(new UploadListener("errorLog") { + + @Override + public void onStart(Progress progress) { + + } + + @Override + public void onProgress(Progress progress) { + + } + + @Override + public void onError(Progress progress) { + } + + @Override + public void onFinish(String s, Progress progress) { + file.delete(); + } + + @Override + public void onRemove(Progress progress) { + + } + }); + task.start(); + } + } } diff --git a/config.gradle b/config.gradle index f0557bc1e..9e347c98c 100644 --- a/config.gradle +++ b/config.gradle @@ -25,6 +25,8 @@ ext { baiduAppSecretKey: "nEVSgmuGpU0pjPr6VleEGGAl0hzGW52S", // true表示谷歌支付 false - isGooglePlay : false + isGooglePlay : false, + //是否上报异常日志 + isUploadLog : false ] } \ No newline at end of file