package com.yuyh.library;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.os.Looper;
import com.yuyh.library.utils.log.LogUtils;
import com.yuyh.library.utils.PackageUtils;
import java.lang.Thread.UncaughtExceptionHandler;
/**
* 全局异常捕获
*
* @author yuyh.
* @date 16/4/10.
*/
public class CrashHandler implements UncaughtExceptionHandler {
private UncaughtExceptionHandler mDefaultHandler;// 系统默认的UncaughtException处理类
private static CrashHandler INSTANCE;
private Context mContext;
private CrashHandler() {
throw new AssertionError();
}
public static CrashHandler getInstance() {
if (INSTANCE == null)
INSTANCE = new CrashHandler();
return INSTANCE;
}
public void init(Context context) { // 在Application中初始化
mContext = context;
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();// 获取系统默认的UncaughtException处理器
Thread.setDefaultUncaughtExceptionHandler(this);// 设置该CrashHandler为程序的默认处理器
}
/**
* 当UncaughtException发生时会转入该重写的方法来处理
*/
@Override
public void uncaughtException(Thread thread, Throwable ex) {
if (!handleException(ex) && mDefaultHandler != null) {
// 如果自定义的没有处理则让系统默认的异常处理器来处理
mDefaultHandler.uncaughtException(thread, ex);
}
}
/**
* 自定义错误处理、收集错误信息、发送错误报告
*
* @param ex 异常信息
* @return true 如果处理了该异常信息;否则返回false.
*/
public boolean handleException(Throwable ex) {
if (ex == null || mContext == null)
return false;
final String crashReport = getCrashReport(mContext, ex);
new Thread() {
public void run() {
Looper.prepare();
LogUtils.e("CrashHandler", crashReport); // 打印异常信息,也可保存至文件 方便远程调试
Looper.loop();
}
}.start();
return true;
}
/**
* 获取APP崩溃异常报告
*
* @param ex
* @return
*/
private String getCrashReport(Context context, Throwable ex) {
PackageInfo pinfo = PackageUtils.getPackageInfo(context);
StringBuffer exceptionStr = new StringBuffer();
exceptionStr.append("Version: " + pinfo.versionName + "(" + pinfo.versionCode + ")\n");
exceptionStr.append("Android: " + android.os.Build.VERSION.RELEASE + "(" + android.os.Build.MODEL + ")\n");
exceptionStr.append("Exception: " + ex.getMessage() + "\n");
StackTraceElement[] elements = ex.getStackTrace();
for (int i = 0; i < elements.length; i++) {
exceptionStr.append(elements[i].toString() + "\n");
}
return exceptionStr.toString();
}
}