package me.wcy.music.application; import android.os.Build; import android.util.Log; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import me.wcy.music.BuildConfig; import me.wcy.music.utils.FileUtils; /** * 异常捕获 * Created by hzwangchenyan on 2016/1/25. */ public class CrashHandler implements Thread.UncaughtExceptionHandler { private static SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS", Locale.getDefault()); private Thread.UncaughtExceptionHandler mDefaultHandler; public static CrashHandler getInstance() { return SingletonHolder.instance; } private static class SingletonHolder { private static CrashHandler instance = new CrashHandler(); } public void init() { mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(this); } @Override public void uncaughtException(Thread thread, Throwable ex) { saveCrashInfo(ex); mDefaultHandler.uncaughtException(thread, ex); } private void saveCrashInfo(Throwable ex) { String stackTrace = Log.getStackTraceString(ex); String filePath = FileUtils.getLogDir() + "crash.log"; try { BufferedWriter bw = new BufferedWriter(new FileWriter(filePath, true)); bw.write("*** crash ***\n"); bw.write(getInfo()); bw.write(stackTrace); bw.newLine(); bw.newLine(); bw.flush(); bw.close(); } catch (IOException e) { e.printStackTrace(); } } private String getInfo() { String time = TIME_FORMAT.format(new Date()); String version = BuildConfig.VERSION_NAME + "/" + BuildConfig.VERSION_CODE; String device = Build.MANUFACTURER + "/" + Build.MODEL + "/" + Build.VERSION.RELEASE; StringBuilder sb = new StringBuilder(); sb.append("*** time: ").append(time).append(" ***").append("\n"); sb.append("*** version: ").append(version).append(" ***").append("\n"); sb.append("*** device: ").append(device).append(" ***").append("\n"); return sb.toString(); } }