Android 自动记录异常信息至SD卡
public class MyCrashHandler implements UncaughtExceptionHandler { @SuppressWarnings("unused") private Context context; private static MyCrashHandler crashHandler = new MyCrashHandler(); UncaughtExceptionHandler defaultExceptionHandler; private MyCrashHandler() { } public static MyCrashHandler getInstanceMyCrashHandler() { return crashHandler; } /** * 初始化方法 * @param context 上下文对象 */ public void init(Context context) { this.context = context; defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(this); } /** * 异常处理方法 * @Params Thread对象 * @param Throwable对象 */ @Override public void uncaughtException(Thread thread, Throwable ex) { if (!handleException(thread, ex) && defaultExceptionHandler != null) { defaultExceptionHandler.uncaughtException(thread, ex); } } // 程序异常处理方法 private boolean handleException(Thread thread, Throwable ex) { StringBuilder sb = new StringBuilder(); long startTimer = System.currentTimeMillis(); SimpleDateFormat formatter = new SimpleDateFormat( "yyyy年MM月dd日 HH:mm:ss "); Date firstDate = new Date(System.currentTimeMillis()); // 第一次创建文件,也就是开始日期 String str = formatter.format(firstDate); sb.append(startTimer); //sb.append("\n"); sb.append(str); // 把当前的日期写入到字符串中 Writer writer = new StringWriter(); PrintWriter pw = new PrintWriter(writer); ex.printStackTrace(pw); String errorresult = writer.toString(); sb.append(errorresult); sb.append("\n"); try { File fileDir = new File("/data/data/com.ebank/Ebank/"); //File fileDir = new File("/sdcard/com.ebank/EBank/"); if (!fileDir.exists()) { fileDir.mkdirs(); } File files = new File(fileDir, "ebank.log"); if (!files.exists()) { files.createNewFile(); } FileOutputStream fileOutputStream = new FileOutputStream(files, true); fileOutputStream.write(sb.toString().getBytes()); fileOutputStream.close(); // 文件大小限制在1M,超过1M自动删除 FileInputStream fileInputStream = new FileInputStream(files); int sizeK = fileInputStream.available() / 1024; // 单位是KB int totalSize = 1 * 1024; if (sizeK > totalSize) { boolean b = files.delete(); if (b) { // 删除成功,重新创建一个文件 @SuppressWarnings("unused") File filesTwo = new File(fileDir, "ebank.log"); if (!files.exists()) { files.createNewFile(); } } else { // 删除失败 FileOutputStream fileOutputStream2 = new FileOutputStream( files); fileOutputStream2.write(" ".getBytes()); // 写入一个空格进去 } } // 文件保存7天,过了7天自动删除 FileReader fileReader = new FileReader(files); BufferedReader bufferedReader = new BufferedReader(fileReader); String firstLine = bufferedReader.readLine(); long startTimerFile = Long.valueOf(firstLine.trim()); // 类型转换 long endTimer = System.currentTimeMillis(); long totalDay = 24 * 60 * 60 * 1000 * 7; final File f = files; TimerTask timerTask = new TimerTask() { @Override public void run() { try { boolean n = f.delete(); if(n){ File fileDirs = new File("/data/data/com.ebank/Ebank/"); if (!fileDirs.exists()) { fileDirs.mkdirs(); } File filess = new File(fileDirs, "ebank.log"); if (!filess.exists()) { filess.createNewFile(); } }else{ // 删除失败 FileOutputStream fileOutputStream2 = new FileOutputStream(f); fileOutputStream2.write(" ".getBytes()); // 写入一个空格进去 } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }; //定时器类的对象 Timer timer = new Timer(); if ((endTimer - startTimerFile) >= totalDay) { timer.schedule(timerTask, 1); // 7天后执行 } } catch (Exception e) { e.printStackTrace(); } defaultExceptionHandler.uncaughtException(thread, ex); return true; } }