| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- package com.nova.brain.glass.common;
- import android.content.Context;
- import android.os.Environment;
- import android.os.SystemClock;
- import android.util.Log;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.io.StringWriter;
- import java.io.Writer;
- import java.text.DateFormat;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.Locale;
- /*************************************************************************************************
- * <pre>
- * @包路径: cn.org.bjca.wcert.ywq.utils.crash
- *
- * @类描述:
- * @版本: V1.5.1
- * @作者 daizhenhong
- * @创建时间 2017/12/13 下午4:22
- *
- * @修改记录:
- -----------------------------------------------------------------------------------------------
- ----------- 时间 | 修改人 | 修改的方法 | 修改描述 ---------------
- -----------------------------------------------------------------------------------------------
- </pre>
- ************************************************************************************************/
- public class CrashHandler implements Thread.UncaughtExceptionHandler {
- private static String TAG = "CrashHandler";
- // 系统默认的UncaughtException处理类
- private Thread.UncaughtExceptionHandler mDefaultHandler;
- // 用于格式化日期,作为日志文件名的一部分
- private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
- private static CrashHandler mCrashHandler;
- private Context mContext;
- private CrashHandler() {
- }
- public static CrashHandler getInstance() {
- if (mCrashHandler == null) {
- synchronized (CrashHandler.class) {
- if (mCrashHandler == null) {
- mCrashHandler = new CrashHandler();
- }
- }
- }
- return mCrashHandler;
- }
- public void init(Context context) {
- mContext = context;
- mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
- Thread.setDefaultUncaughtExceptionHandler(this);
- }
- @Override
- public void uncaughtException(Thread thread, Throwable throwable) {
- if (!handleException(throwable) && mDefaultHandler != null) {
- // 如果用户没有处理则让系统默认的异常处理器来处理
- mDefaultHandler.uncaughtException(thread, throwable);
- } else {
- SystemClock.sleep(2000);
- // 退出程序
- android.os.Process.killProcess(android.os.Process.myPid());
- System.exit(1);
- }
- }
- private boolean handleException(Throwable ex) {
- if (ex == null) {
- return false;
- }
- try {
- saveCrashInfoFile(ex);
- SystemClock.sleep(2000);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return true;
- }
- private String saveCrashInfoFile(Throwable ex) {
- StringBuffer sb = new StringBuffer();
- if (hasSdcard())
- try {
- SimpleDateFormat sDateFormat = new SimpleDateFormat(
- "yyyy-MM-dd HH:mm:ss", Locale.CHINA);
- String date = sDateFormat.format(new Date());
- sb.append("\r\n" + date + "\n");
- Writer writer = new StringWriter();
- PrintWriter printWriter = new PrintWriter(writer);
- ex.printStackTrace(printWriter);
- Throwable cause = ex.getCause();
- while (cause != null) {
- cause.printStackTrace(printWriter);
- cause = cause.getCause();
- }
- printWriter.flush();
- printWriter.close();
- String result = writer.toString();
- sb.append(result);
- String fileName = writeFile(sb.toString());
- return fileName;
- } catch (Exception e) {
- Log.e(TAG, "an error occured while writing file...", e);
- sb.append("an error occured while writing file...\r\n");
- writeFile(sb.toString());
- }
- return null;
- }
- private String writeFile(String text) {
- Log.e("writeFile", text);
- String time = formatter.format(new Date());
- String fileName = "crash-demo-" + time + ".log";
- String path = getGlobalpath();
- File dir = new File(path);
- if (!dir.exists()) {
- dir.mkdir();
- }
- try (FileOutputStream fos = new FileOutputStream(path + fileName, true)) {
- fos.write(text.getBytes());
- fos.flush();
- } catch (IOException e) {
- Log.e(TAG, "写入崩溃日志失败: " + fileName, e);
- }
- return fileName;
- }
- public String getGlobalpath() {
- return Environment.getExternalStorageDirectory().getAbsolutePath()
- + File.separator + "crash" + File.separator;
- }
- public boolean hasSdcard(){
- return Environment.getExternalStorageState()
- .equals(Environment.MEDIA_MOUNTED);
- }
- }
|