CrashHandler.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package com.nova.brain.glass.common;
  2. import android.content.Context;
  3. import android.os.Environment;
  4. import android.os.SystemClock;
  5. import android.util.Log;
  6. import java.io.File;
  7. import java.io.FileOutputStream;
  8. import java.io.IOException;
  9. import java.io.PrintWriter;
  10. import java.io.StringWriter;
  11. import java.io.Writer;
  12. import java.text.DateFormat;
  13. import java.text.SimpleDateFormat;
  14. import java.util.Date;
  15. import java.util.Locale;
  16. /*************************************************************************************************
  17. * <pre>
  18. * @包路径: cn.org.bjca.wcert.ywq.utils.crash
  19. *
  20. * @类描述:
  21. * @版本: V1.5.1
  22. * @作者 daizhenhong
  23. * @创建时间 2017/12/13 下午4:22
  24. *
  25. * @修改记录:
  26. -----------------------------------------------------------------------------------------------
  27. ----------- 时间 | 修改人 | 修改的方法 | 修改描述 ---------------
  28. -----------------------------------------------------------------------------------------------
  29. </pre>
  30. ************************************************************************************************/
  31. public class CrashHandler implements Thread.UncaughtExceptionHandler {
  32. private static String TAG = "CrashHandler";
  33. // 系统默认的UncaughtException处理类
  34. private Thread.UncaughtExceptionHandler mDefaultHandler;
  35. // 用于格式化日期,作为日志文件名的一部分
  36. private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
  37. private static CrashHandler mCrashHandler;
  38. private Context mContext;
  39. private CrashHandler() {
  40. }
  41. public static CrashHandler getInstance() {
  42. if (mCrashHandler == null) {
  43. synchronized (CrashHandler.class) {
  44. if (mCrashHandler == null) {
  45. mCrashHandler = new CrashHandler();
  46. }
  47. }
  48. }
  49. return mCrashHandler;
  50. }
  51. public void init(Context context) {
  52. mContext = context;
  53. mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
  54. Thread.setDefaultUncaughtExceptionHandler(this);
  55. }
  56. @Override
  57. public void uncaughtException(Thread thread, Throwable throwable) {
  58. if (!handleException(throwable) && mDefaultHandler != null) {
  59. // 如果用户没有处理则让系统默认的异常处理器来处理
  60. mDefaultHandler.uncaughtException(thread, throwable);
  61. } else {
  62. SystemClock.sleep(2000);
  63. // 退出程序
  64. android.os.Process.killProcess(android.os.Process.myPid());
  65. System.exit(1);
  66. }
  67. }
  68. private boolean handleException(Throwable ex) {
  69. if (ex == null) {
  70. return false;
  71. }
  72. try {
  73. saveCrashInfoFile(ex);
  74. SystemClock.sleep(2000);
  75. } catch (Exception e) {
  76. e.printStackTrace();
  77. }
  78. return true;
  79. }
  80. private String saveCrashInfoFile(Throwable ex) {
  81. StringBuffer sb = new StringBuffer();
  82. if (hasSdcard())
  83. try {
  84. SimpleDateFormat sDateFormat = new SimpleDateFormat(
  85. "yyyy-MM-dd HH:mm:ss", Locale.CHINA);
  86. String date = sDateFormat.format(new Date());
  87. sb.append("\r\n" + date + "\n");
  88. Writer writer = new StringWriter();
  89. PrintWriter printWriter = new PrintWriter(writer);
  90. ex.printStackTrace(printWriter);
  91. Throwable cause = ex.getCause();
  92. while (cause != null) {
  93. cause.printStackTrace(printWriter);
  94. cause = cause.getCause();
  95. }
  96. printWriter.flush();
  97. printWriter.close();
  98. String result = writer.toString();
  99. sb.append(result);
  100. String fileName = writeFile(sb.toString());
  101. return fileName;
  102. } catch (Exception e) {
  103. Log.e(TAG, "an error occured while writing file...", e);
  104. sb.append("an error occured while writing file...\r\n");
  105. writeFile(sb.toString());
  106. }
  107. return null;
  108. }
  109. private String writeFile(String text) {
  110. Log.e("writeFile", text);
  111. String time = formatter.format(new Date());
  112. String fileName = "crash-demo-" + time + ".log";
  113. String path = getGlobalpath();
  114. File dir = new File(path);
  115. if (!dir.exists()) {
  116. dir.mkdir();
  117. }
  118. try (FileOutputStream fos = new FileOutputStream(path + fileName, true)) {
  119. fos.write(text.getBytes());
  120. fos.flush();
  121. } catch (IOException e) {
  122. Log.e(TAG, "写入崩溃日志失败: " + fileName, e);
  123. }
  124. return fileName;
  125. }
  126. public String getGlobalpath() {
  127. return Environment.getExternalStorageDirectory().getAbsolutePath()
  128. + File.separator + "crash" + File.separator;
  129. }
  130. public boolean hasSdcard(){
  131. return Environment.getExternalStorageState()
  132. .equals(Environment.MEDIA_MOUNTED);
  133. }
  134. }