1、新建一个类UEHandler实现java.lang.Thread.UncaughtExceptionHandler接口。
2、重写public void uncaughtException(Thread thread, Throwable ex)方法,其中ex对象即捕获到的全局异常。可以在此将错误信息打印至SD卡文件中。
3、在Manifast.xml文件中定义的application类中配置UEHandler:UEHandler ueHandler = new UEHandler(this); Thread.setDefaultUncaughtExceptionHandler(ueHandler);
具体关键代码如下:
UEHandler.java
@Override public void uncaughtException(Thread thread, Throwable ex) { String info = null; ByteArrayOutputStream baos = null; PrintStream printStream = null; try { baos = new ByteArrayOutputStream(); printStream = new PrintStream(baos); ex.printStackTrace(printStream); byte[] data = baos.toByteArray(); info = new String(data); data = null; LogUtil.addLog(info); // 可以跳转至错误提示页面 android.os.Process.killProcess(android.os.Process.myPid()); } catch (Exception e) { Log.e("UEHandler", e.getMessage(), e); } finally { try { if (printStream != null) { printStream.close(); } if (baos != null) { baos.close(); } } catch (Exception e) { e.printStackTrace(); } } }
LogUtil.java类
package com.fsti.android.util; import java.io.File; import java.io.FileOutputStream; import java.util.Date; import android.os.Environment; import android.util.Log; public class LogUtil { private static final String fileDir = "/sdcard/3glife/"; private static String fileName = "log.txt"; public static boolean addLog(String log) { if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) return false; try { log = "\r\n" + DateUtil.formatDateDefault(new Date()) + "==>" + log; fileName = "log-" + DateUtil.formatDate(new Date(), "yyyy-MM-dd") + ".txt"; File dir = new File(fileDir); File file = new File(fileDir + fileName); if(!dir.exists()) { dir.mkdir(); } if(!file.exists()) { file.createNewFile(); } FileOutputStream fos = new FileOutputStream(file); fos.write(log.getBytes()); fos.close(); } catch (Exception e) { Log.e("LogUtil", e.getMessage()); return false; } return true; } }