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; } }