Android抓取崩溃日志

Android应用会经常发生Crash崩溃问题,我们可以在本地抓到错误日志,并保存到内存卡中,然后可以将崩溃日志传到后台服务器,根据日志进行查看,并解决出现的问题。
使用方法如下:
1.新建如下CrashHandler 类
/**
 * UncaughtException处理类,当程序发生Uncaught异常的时候,有该类 来接管程序,并记录错误报告.
 * 
 */
public class CrashHandler implements UncaughtExceptionHandler {
   private static CrashHandler myCrashHandler;

   private CrashHandler() {
   };

   private Context context;
   public final static String LOGPATH =Environment.getExternalStorageDirectory() + "/usershopping/crash.txt" ;
   private UncaughtExceptionHandler defaultExceptionHandler;
   public synchronized static CrashHandler getInstance() {
      if (myCrashHandler == null) {
         myCrashHandler = new CrashHandler();
      }
      return myCrashHandler;

   }

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

   public void uncaughtException(Thread thread, Throwable ex) {
      if(!sdCardIsAvailable()){
         ex.printStackTrace();
         new Thread() {

            @Override
            public void run() {
               Looper.prepare();
               Toast.makeText(context, "异常退出", Toast.LENGTH_LONG).show();
               Looper.loop();
            }

         }.start();

         new Thread() {

            @Override
            public void run() {
               try {
                  Thread.sleep(4000);
               } catch (InterruptedException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
               }
               android.os.Process.killProcess(android.os.Process.myPid());
            }

         }.start();

          return;
      }
      try {
//       Writer info2 = new StringWriter();   
//         PrintWriter printWriter = new PrintWriter(info2);   
//         ex.printStackTrace(printWriter);   
//         Throwable cause = ex.getCause();   
//         while (cause != null) {   
//             cause.printStackTrace(printWriter);   
//             cause = cause.getCause();   
//         }   
//         result = info2.toString(); 
         // 在throwable的参数里面保存的有程序的异常信息
         StringBuffer sb = new StringBuffer();
         // 1.得到手机的版本信息 硬件信息
         Field[] fields = Build.class.getDeclaredFields();
         for (Field filed : fields) {
            filed.setAccessible(true); // 暴力反射
            String name = filed.getName();
            String value = filed.get(null).toString();
            sb.append(name);
            sb.append("=");
            sb.append(value);
            sb.append("\n");
         }

         // 2.得到当前程序的版本号
         PackageInfo info = context.getPackageManager().getPackageInfo(
               context.getPackageName(), 0);
         sb.append(info.versionName);
         sb.append("\n");
         // 3.得到当前程序的异常信息
         Writer writer = new StringWriter();
         PrintWriter printwriter = new PrintWriter(writer);

         ex.printStackTrace(printwriter);
         printwriter.flush();
         printwriter.close();

         sb.append(writer.toString());

         File ff = new File(LOGPATH);
         ff.createNewFile(); 
         FileWriter fw = new FileWriter(new File(LOGPATH));
         fw.write(sb.toString());
//       System.out.println(sb);
         fw.close();

      } catch (Exception e1) {
         e1.printStackTrace();
      }

      new Thread() {

         @Override
         public void run() {
            Looper.prepare();

            Toast.makeText(context, "异常退出", Toast.LENGTH_LONG).show();
            Looper.loop();

         }

      }.start();

      new Thread() {

         @Override
         public void run() {
            try {
               Thread.sleep(4000);
            } catch (InterruptedException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
            }
            android.os.Process.killProcess(android.os.Process.myPid());
         }

      }.start();

   }

   /**
    * 检测sdcard是否可用
    *
    * @return true为可用,否则为不可用
    */
   public static boolean sdCardIsAvailable() {
      String status = Environment.getExternalStorageState();
      if (!status.equals(Environment.MEDIA_MOUNTED))
         return false;
      return true;
   }
}
2.新建一个app继承Application,然后在onCreate方法中调用如下方法:
//抓错误日志
new Thread(){
   @Override
   public void run() {
      //把异常处理的handler设置到主线程里面
      CrashHandler ch = CrashHandler.getInstance();
      ch.init(getApplicationContext());
   }
}.start();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值