public class CrashHandler implements Thread.UncaughtExceptionHandler{
private static CrashHandler sInstance = null;
// private Thread.UncaughtExceptionHandler mDefaultHandler;
private Context mContext;
// 保存手机信息和异常信息
// private Map<String, String> mMessage = new HashMap<>();
//构造方法私有化
private CrashHandler() {
}
public void init(Context context) {
mContext = context;
// 获取默认异常处理器
// mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
// 将此类设为默认异常处理器
Thread.setDefaultUncaughtExceptionHandler(this);
}
public static CrashHandler getInstance() {
if (sInstance == null) {
synchronized (CrashHandler.class) {
if (sInstance == null) {
synchronized (CrashHandler.class) {
sInstance = new CrashHandler();
}
}
}
}
return sInstance;
}
@Override
public void uncaughtException(Thread thread, Throwable throwable) {
new Thread() {// 在主线程中弹出提示
@Override
public void run() {
Looper.prepare();
Toast.makeText(mContext, "捕获到异常", Toast.LENGTH_SHORT).show();
Looper.loop();
}
}.start();
String exceptionMessge = throwable.getMessage();
String path = Environment.getExternalStorageDirectory()+ "/" + "carshhhhhhh";
File file = new File(path);
if(!file.exists()){
file.mkdir();
}
File file1 = new File(file , "error.log");
try {
FileOutputStream outputStream = new FileOutputStream(file1);
byte[] buffer = exceptionMessge.getBytes();
outputStream.write(buffer , 0 ,buffer.length);
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
}
// if (!handleException(throwable)) {
// // 未经过人为处理,则调用系统默认处理异常,弹出系统强制关闭的对话框
// if (mDefaultHandler != null) {
// mDefaultHandler.uncaughtException(thread, throwable);
// }
// } else {
// // 已经人为处理,系统自己退出
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e1) {
// e1.printStackTrace();
// }
// System.exit(1);
// }
}
// /**
// * 是否人为捕获异常
// *
// * @param e Throwable
// * @return true:已处理 false:未处理
// */
// private boolean handleException(Throwable e) {
//
// if (e == null) {// 异常是否为空
// return false;
// }
//
// new Thread() {// 在主线程中弹出提示
// @Override
// public void run() {
// Looper.prepare();
// Toast.makeText(mContext, "捕获到异常", Toast.LENGTH_SHORT).show();
// Looper.loop();
// }
// }.start();
//
// collectErrorMessages();
// saveErrorMessages(e);
// return false;
// }
// /**
// * 1.收集错误信息
// */
// private void collectErrorMessages() {
// PackageManager pm = mContext.getPackageManager();
// try {
// PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);
// if (pi != null) {
// String versionName = TextUtils.isEmpty(pi.versionName) ? "null" : pi.versionName;
// String versionCode = "" + pi.versionCode;
// mMessage.put("versionName", versionName);
// mMessage.put("versionCode", versionCode);
// }
// // 通过反射拿到错误信息
// Field[] fields = Build.class.getFields();
// if (fields != null && fields.length > 0) {
// for (Field field : fields) {
// field.setAccessible(true);
// try {
// mMessage.put(field.getName(), field.get(null).toString());
// } catch (IllegalAccessException e) {
// e.printStackTrace();
// }
// }
// }
// } catch (PackageManager.NameNotFoundException e) {
// e.printStackTrace();
// }
// }
// /**
// * 2.保存错误信息
// *
// * @param e Throwable
// */
// private void saveErrorMessages(Throwable e) {
// StringBuilder sb = new StringBuilder();
// for (Map.Entry<String, String> entry : mMessage.entrySet()) {
// String key = entry.getKey();
// String value = entry.getValue();
// sb.append(key).append("=").append(value).append("\n");
// }
// Writer writer = new StringWriter();
// PrintWriter pw = new PrintWriter(writer);
// e.printStackTrace(pw);
// Throwable cause = e.getCause();
// // 循环取出Cause
// while (cause != null) {
// cause.printStackTrace(pw);
// cause = e.getCause();
// }
// pw.close();
// String result = writer.toString();
// sb.append(result);
// //当前时间
// String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(new Date());
//
// String fileName = "crash-" + time + "-" + System.currentTimeMillis() + ".log";
// // 有无SD卡判断
// if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
// String path = Environment.getExternalStorageDirectory().getPath() + "crash/";
// Log.e("tag" ,"path = " + path);
// File dir = new File(path);
// if (!dir.exists()) dir.mkdirs();
// FileOutputStream fos = null;
// try {
// fos = new FileOutputStream(path + fileName);
// fos.write(sb.toString().getBytes());
// } catch (Exception e1) {
// e1.printStackTrace();
// } finally {
// if (fos != null) {
// try {
// fos.close();
// } catch (IOException e1) {
// e1.printStackTrace();
// }
// }
// }
// }
// }
}