package com.jasonchen.microlang.utils; import android.os.Environment; import android.text.format.DateFormat; import android.util.Log; import com.jasonchen.microlang.R; import com.jasonchen.microlang.activitys.SettingActivity; import com.jasonchen.microlang.debug.AppLogger; import com.jasonchen.microlang.utils.file.FileManager; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; /** * jasonchen * 15/06/03 */ public class MythouCrashHandler implements Thread.UncaughtExceptionHandler { private static final String TAG = "MythouCrashHandler---->"; private Thread.UncaughtExceptionHandler defaultUEH; //构造函数,获取默认的处理方法 public MythouCrashHandler() { this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler(); } //这个接口必须重写,用来处理我们的异常信息 @Override public void uncaughtException(Thread thread, Throwable ex) { final Writer result = new StringWriter(); final PrintWriter printWriter = new PrintWriter(result); //获取跟踪的栈信息,除了系统栈信息,还把手机型号、系统版本、编译版本的唯一标示 StackTraceElement[] trace = ex.getStackTrace(); StackTraceElement[] trace2 = new StackTraceElement[trace.length+3]; System.arraycopy(trace, 0, trace2, 0, trace.length); trace2[trace.length+0] = new StackTraceElement("Android", "MODEL", android.os.Build.MODEL, -1); trace2[trace.length+1] = new StackTraceElement("Android", "VERSION", android.os.Build.VERSION.RELEASE, -1); trace2[trace.length+2] = new StackTraceElement("Android", "FINGERPRINT", android.os.Build.FINGERPRINT, -1); ex.setStackTrace(trace2); ex.printStackTrace(printWriter); String stacktrace = result.toString(); printWriter.close(); AppLogger.e(stacktrace); if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { String sdcardPath = FileManager.getLogDir(); writeLog(stacktrace, sdcardPath); } defaultUEH.uncaughtException(thread, ex); } //写入Log信息的方法,写入到SD卡里面 private void writeLog(String log, String name) { CharSequence timestamp = DateFormat.format("yyyyMMdd_kkmmss", System.currentTimeMillis()); String filename = name + File.separator + timestamp + ".log"; try { FileOutputStream stream = new FileOutputStream(filename); OutputStreamWriter output = new OutputStreamWriter(stream); BufferedWriter bw = new BufferedWriter(output); //写入相关Log到文件 bw.write(log); bw.newLine(); bw.close(); output.close(); } catch (IOException e) { e.printStackTrace(); } } private void buildLogSummary() { File cachedDir = GlobalContext.getInstance().getExternalCacheDir(); } }