package com.codeest.geeknews.component;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import com.codeest.geeknews.app.App;
import com.codeest.geeknews.util.LogUtil;
import com.codeest.geeknews.util.ToastUtil;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
/**
* Created by codeest on 2016/8/3.
*/
public class CrashHandler implements Thread.UncaughtExceptionHandler {
private static Thread.UncaughtExceptionHandler defaultHandler = null;
private Context context = null;
private final String TAG = CrashHandler.class.getSimpleName();
public CrashHandler(Context context) {
this.context = context;
}
/**
* 初始化,设置该CrashHandler为程序的默认处理器
*/
public static void init(CrashHandler crashHandler) {
defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(crashHandler);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
System.out.println(ex.toString());
LogUtil.e(TAG, ex.toString());
LogUtil.e(TAG, collectCrashDeviceInfo());
LogUtil.e(TAG, getCrashInfo(ex));
// 调用系统错误机制
defaultHandler.uncaughtException(thread, ex);
ToastUtil.shortShow("抱歉,程序发生异常即将退出");
App.getInstance().exitApp();
}
/**
* 得到程序崩溃的详细信息
*/
public String getCrashInfo(Throwable ex) {
Writer result = new StringWriter();
PrintWriter printWriter = new PrintWriter(result);
ex.setStackTrace(ex.getStackTrace());
ex.printStackTrace(printWriter);
return result.toString();
}
/**
* 收集程序崩溃的设备信息
*/
public String collectCrashDeviceInfo() {
try {
PackageManager pm = context.getPackageManager();
PackageInfo pi = pm.getPackageInfo(context.getPackageName(), PackageManager.GET_ACTIVITIES);
String versionName = pi.versionName;
String model = android.os.Build.MODEL;
String androidVersion = android.os.Build.VERSION.RELEASE;
String manufacturer = android.os.Build.MANUFACTURER;
return versionName + " " + model + " " + androidVersion + " " + manufacturer;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
}