工具类--CrashHandler 捕获崩溃存储手机本地

public class CrashHandler implements UncaughtExceptionHandler {

   public static final String TAG = "CrashHandler";
   private static CrashHandler INSTANCE = new CrashHandler();
   private Context mContext;
   private Thread.UncaughtExceptionHandler mDefaultHandler;
   private Map<String, String> infos = new HashMap<String, String>();
   private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
   //String path = "/sdcard/lesongcrash/";
   String path=new FileUtils().createSDDir("pandacrash").getAbsolutePath()+"/";

   private CrashHandler() {
   }

   public static CrashHandler getInstance() {
      return INSTANCE;
   }

   public void init(Context context) {
      mContext = context;
      Thread.getDefaultUncaughtExceptionHandler();
      Thread.setDefaultUncaughtExceptionHandler(this);
   }

   public void uncaughtException(Thread thread, Throwable ex) {
      if (!handleException(ex) && mDefaultHandler != null) {
         mDefaultHandler.uncaughtException(thread, ex);
      } else {
         try {
            Thread.sleep(3000);
         } catch (InterruptedException e) {
            //Log.e(TAG, "error : ", e);
         }
         android.os.Process.killProcess(android.os.Process.myPid());
         System.exit(1);
      }
   }

   private boolean handleException(Throwable ex) {
      if (ex == null) {
         return false;
      }
      new Thread() {
         @Override
         public void run() {
            Looper.prepare();
            Looper.loop();
         }
      }.start();
      collectDeviceInfo(mContext);
      saveCrashInfo2File(ex);
      return true;
   }

   public void collectDeviceInfo(Context ctx) {
      try {
         PackageManager pm = ctx.getPackageManager();
         PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(),
               PackageManager.GET_ACTIVITIES);

         if (pi != null) {
            String versionName = pi.versionName == null ? "null"
                  : pi.versionName;
            String versionCode = pi.versionCode + "";
            infos.put("versionName", versionName);
            infos.put("versionCode", versionCode);
         }
      } catch (NameNotFoundException e) {
         //Log.e(TAG, "an error occured when collect package info", e);
      }

      Field[] fields = Build.class.getDeclaredFields();
      for (Field field : fields) {
         try {
            field.setAccessible(true);
            infos.put(field.getName(), field.get(null).toString());
            Log.d(TAG, field.getName() + " : " + field.get(null));
         } catch (Exception e) {
            //Log.e(TAG, "an error occured when collect crash info", e);
         }
      }
   }

   private String saveCrashInfo2File(Throwable ex) {
      StringBuffer sb = new StringBuffer();
      for (Map.Entry<String, String> entry : infos.entrySet()) {
         String key = entry.getKey();
         String value = entry.getValue();
         sb.append(key + "=" + value + "\n");
      }

      Writer writer = new StringWriter();
      PrintWriter printWriter = new PrintWriter(writer);
      ex.printStackTrace(printWriter);
      Throwable cause = ex.getCause();
      while (cause != null) {
         cause.printStackTrace(printWriter);
         cause = cause.getCause();
      }
      printWriter.close();

      String result = writer.toString();  
      sb.append(result);
      try {
         long timestamp = System.currentTimeMillis();
         String time = formatter.format(new Date());
         String fileName = "crash-" + time + "-" + timestamp + ".txt";

         if (Environment.getExternalStorageState().equals(
               Environment.MEDIA_MOUNTED)) {

            File dir = new File(path);
            if (!dir.exists()) {
               dir.mkdirs();
            }
            FileOutputStream fos = new FileOutputStream(path + fileName);
            fos.write(sb.toString().getBytes());
            fos.close();
         }
         return fileName;
      } catch (Exception e) {
         //Log.e(TAG, "an error occured while writing file...", e);
      }

      return null;
   }
}
发布了58 篇原创文章 · 获赞 4 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/jackron2014/article/details/52276368