android 异常打印
        【摘要】   Log.e注意问题: 
"find bar"字符串中间有空格,所有搜索不到,但是用下划线连接起来,过滤日志时就能搜到。 
Log.e("find bar",points[0].toString()); 
  
package com.lbstock;  import java.io.File;  import java.io.FileNotFoundEx...
    
    
    
    Log.e注意问题:
"find bar"字符串中间有空格,所有搜索不到,但是用下划线连接起来,过滤日志时就能搜到。
Log.e("find bar",points[0].toString());
 
  
   - 
    
     
    
    
     
      package com.lbstock;
     
    
- 
    
     
    
    
       
     
    
- 
    
     
    
    
     
      import java.io.File;  
     
    
- 
    
     
    
    
     
      import java.io.FileNotFoundException;  
     
    
- 
    
     
    
    
     
      import java.io.FileOutputStream;  
     
    
- 
    
     
    
    
     
      import java.io.IOException;  
     
    
- 
    
     
    
    
     
      import java.io.PrintWriter;  
     
    
- 
    
     
    
    
     
      import java.io.StringWriter;  
     
    
- 
    
     
    
    
     
      import java.io.Writer;  
     
    
- 
    
     
    
    
     
      import java.lang.Thread.UncaughtExceptionHandler;  
     
    
- 
    
     
    
    
     
      import java.lang.reflect.Field;  
     
    
- 
    
     
    
    
     
      import java.text.SimpleDateFormat;  
     
    
- 
    
     
    
    
     
      import java.util.Date;  
     
    
- 
    
     
    
    
     
      import java.util.HashMap;  
     
    
- 
    
     
    
    
     
      import java.util.Map;  
     
    
- 
    
     
    
    
       
     
    
- 
    
     
    
    
     
      import android.content.Context;  
     
    
- 
    
     
    
    
     
      import android.content.pm.PackageInfo;  
     
    
- 
    
     
    
    
     
      import android.content.pm.PackageManager;  
     
    
- 
    
     
    
    
     
      import android.content.pm.PackageManager.NameNotFoundException;  
     
    
- 
    
     
    
    
     
      import android.os.Build;  
     
    
- 
    
     
    
    
     
      import android.os.Environment;  
     
    
- 
    
     
    
    
     
      import android.os.Looper;  
     
    
- 
    
     
    
    
     
      import android.util.Log;  
     
    
- 
    
     
    
    
     
      import android.widget.Toast;  
     
    
- 
    
     
    
    
       
     
    
- 
    
     
    
    
     
      /** 
     
    
- 
    
     
    
    
     
       * UncaughtException处理类,当程序发生Uncaught异常的时候,由该类来接管程序,并记录发送错误报告.
     
    
- 
    
     
    
    
     
       * @author way
     
    
- 
    
     
    
    
     
       */  
     
    
- 
    
     
    
    
     
      public class CrashHandler implements UncaughtExceptionHandler {  
     
    
- 
    
     
    
    
      private static final String TAG = "CrashHandler";  
     
    
- 
    
     
    
    
      private Thread.UncaughtExceptionHandler mDefaultHandler;// 系统默认的UncaughtException处理类 
     
    
- 
    
     
    
    
      private static CrashHandler INSTANCE = new CrashHandler();// CrashHandler实例 
     
    
- 
    
     
    
    
      private Context mContext;// 程序的Context对象 
     
    
- 
    
     
    
    
      private Map<String, String> info = new HashMap<String, String>();// 用来存储设备信息和异常信息 
     
    
- 
    
     
    
    
      private SimpleDateFormat format = new SimpleDateFormat(  
     
    
- 
    
     
    
    
      "yyyy-MM-dd-HH-mm-ss");// 用于格式化日期,作为日志文件名的一部分 
     
    
- 
    
     
    
    
       
     
    
- 
    
     
    
    
      /** 保证只有一个CrashHandler实例 */  
     
    
- 
    
     
    
    
      private CrashHandler() {  
     
    
- 
    
     
    
    
       
     
    
- 
    
     
    
    
     
       }  
     
    
- 
    
     
    
    
       
     
    
- 
    
     
    
    
      /** 获取CrashHandler实例 ,单例模式 */  
     
    
- 
    
     
    
    
      public static CrashHandler getInstance() {  
     
    
- 
    
     
    
    
      return INSTANCE;  
     
    
- 
    
     
    
    
     
       }  
     
    
- 
    
     
    
    
      public void init(Context context) {
     
    
- 
    
     
    
    
     
       mContext = context;  
     
    
- 
    
     
    
    
     
       mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();// 获取系统默认的UncaughtException处理器 
     
    
- 
    
     
    
    
     
       Thread.setDefaultUncaughtExceptionHandler(this);// 设置该CrashHandler为程序的默认处理器 
     
    
- 
    
     
    
    
     
       }  
     
    
- 
    
     
    
    
       
     
    
- 
    
     
    
    
      /** 
     
    
- 
    
     
    
    
     
       * 当UncaughtException发生时会转入该重写的方法来处理 
     
    
- 
    
     
    
    
     
       */  
     
    
- 
    
     
    
    
      public void uncaughtException(Thread thread, Throwable ex) {  
     
    
- 
    
     
    
    
      if (!handleException(ex) && mDefaultHandler != null) {  
     
    
- 
    
     
    
    
      // 如果自定义的没有处理则让系统默认的异常处理器来处理 
     
    
- 
    
     
    
    
     
       mDefaultHandler.uncaughtException(thread, ex);  
     
    
- 
    
     
    
    
     
       } else {  
     
    
- 
    
     
    
    
      try {  
     
    
- 
    
     
    
    
     
       Thread.sleep(3000);// 如果处理了,让程序继续运行3秒再退出,保证文件保存并上传到服务器 
     
    
- 
    
     
    
    
     
       } catch (InterruptedException e) {  
     
    
- 
    
     
    
    
     
       e.printStackTrace();  
     
    
- 
    
     
    
    
     
       }  
     
    
- 
    
     
    
    
      // 退出程序 
     
    
- 
    
     
    
    
     
       android.os.Process.killProcess(android.os.Process.myPid());  
     
    
- 
    
     
    
    
     
       System.exit(1);  
     
    
- 
    
     
    
    
     
       }  
     
    
- 
    
     
    
    
     
       }  
     
    
- 
    
     
    
    
       
     
    
- 
    
     
    
    
      /** 
     
    
- 
    
     
    
    
     
       * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
     
    
- 
    
     
    
    
     
       * @param ex 异常信息
     
    
- 
    
     
    
    
     
       * @return true 如果处理了该异常信息;否则返回false. 
     
    
- 
    
     
    
    
     
       */  
     
    
- 
    
     
    
    
      public boolean handleException(Throwable ex) {  
     
    
- 
    
     
    
    
      if (ex == null)  
     
    
- 
    
     
    
    
      return false;  
     
    
- 
    
     
    
    
      new Thread() {  
     
    
- 
    
     
    
    
      public void run() {  
     
    
- 
    
     
    
    
     
       Looper.prepare();
     
    
- 
    
     
    
    
     
       Log.e("lbsotck",String.valueOf(ex.getMessage()));
     
    
- 
    
     
    
    
     
       Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出", Toast.LENGTH_LONG).show();
     
    
- 
    
     
    
    
     
       Looper.loop();  
     
    
- 
    
     
    
    
     
       }  
     
    
- 
    
     
    
    
     
       }.start();  
     
    
- 
    
     
    
    
      // 收集设备参数信息 
     
    
- 
    
     
    
    
     
       collectDeviceInfo(mContext);  
     
    
- 
    
     
    
    
      // 保存日志文件 
     
    
- 
    
     
    
    
     
       saveCrashInfo2File(ex);  
     
    
- 
    
     
    
    
      return true;  
     
    
- 
    
     
    
    
     
       }  
     
    
- 
    
     
    
    
       
     
    
- 
    
     
    
    
      /** 
     
    
- 
    
     
    
    
     
       * 收集设备参数信息
     
    
- 
    
     
    
    
     
       * @param context 
     
    
- 
    
     
    
    
     
       */  
     
    
- 
    
     
    
    
      public void collectDeviceInfo(Context context) {  
     
    
- 
    
     
    
    
      try {  
     
    
- 
    
     
    
    
     
       PackageManager pm = context.getPackageManager();// 获得包管理器 
     
    
- 
    
     
    
    
     
       PackageInfo pi = pm.getPackageInfo(context.getPackageName(),  
     
    
- 
    
     
    
    
     
       PackageManager.GET_ACTIVITIES);// 得到该应用的信息,即主Activity 
     
    
- 
    
     
    
    
      if (pi != null) {  
     
    
- 
    
     
    
    
     
       String versionName = pi.versionName == null ? "null"  
     
    
- 
    
     
    
    
     
       : pi.versionName;  
     
    
- 
    
     
    
    
     
       String versionCode = pi.versionCode + "";  
     
    
- 
    
     
    
    
     
       info.put("versionName", versionName);  
     
    
- 
    
     
    
    
     
       info.put("versionCode", versionCode);  
     
    
- 
    
     
    
    
     
       }  
     
    
- 
    
     
    
    
     
       } catch (NameNotFoundException e) {  
     
    
- 
    
     
    
    
     
       e.printStackTrace();  
     
    
- 
    
     
    
    
     
       }  
     
    
- 
    
     
    
    
       
     
    
- 
    
     
    
    
     
       Field[] fields = Build.class.getDeclaredFields();// 反射机制  
     
    
- 
    
     
    
    
      for (Field field : fields) {  
     
    
- 
    
     
    
    
      try {  
     
    
- 
    
     
    
    
     
       field.setAccessible(true);  
     
    
- 
    
     
    
    
     
       info.put(field.getName(), field.get("").toString());  
     
    
- 
    
     
    
    
     
       Log.d(TAG, field.getName() + ":" + field.get(""));  
     
    
- 
    
     
    
    
     
       } catch (IllegalArgumentException e) {  
     
    
- 
    
     
    
    
     
       e.printStackTrace();  
     
    
- 
    
     
    
    
     
       } catch (IllegalAccessException e) {  
     
    
- 
    
     
    
    
     
       e.printStackTrace();  
     
    
- 
    
     
    
    
     
       }  
     
    
- 
    
     
    
    
     
       }  
     
    
- 
    
     
    
    
     
       }  
     
    
- 
    
     
    
    
       
     
    
- 
    
     
    
    
      private String saveCrashInfo2File(Throwable ex) {  
     
    
- 
    
     
    
    
     
       StringBuffer sb = new StringBuffer();  
     
    
- 
    
     
    
    
      for (Map.Entry<String, String> entry : info.entrySet()) {  
     
    
- 
    
     
    
    
     
       String key = entry.getKey();  
     
    
- 
    
     
    
    
     
       String value = entry.getValue();  
     
    
- 
    
     
    
    
     
       sb.append(key + "=" + value + "\r\n");  
     
    
- 
    
     
    
    
     
       }  
     
    
- 
    
     
    
    
     
       Writer writer = new StringWriter();  
     
    
- 
    
     
    
    
     
       PrintWriter pw = new PrintWriter(writer);  
     
    
- 
    
     
    
    
     
       ex.printStackTrace(pw);  
     
    
- 
    
     
    
    
     
       Throwable cause = ex.getCause();  
     
    
- 
    
     
    
    
      // 循环着把所有的异常信息写入writer中 
     
    
- 
    
     
    
    
      while (cause != null) {  
     
    
- 
    
     
    
    
     
       cause.printStackTrace(pw);  
     
    
- 
    
     
    
    
     
       cause = cause.getCause();  
     
    
- 
    
     
    
    
     
       }  
     
    
- 
    
     
    
    
     
       pw.close();// 记得关闭 
     
    
- 
    
     
    
    
     
       String result = writer.toString();  
     
    
- 
    
     
    
    
     
       sb.append(result);  
     
    
- 
    
     
    
    
      // 保存文件 
     
    
- 
    
     
    
    
      long timetamp = System.currentTimeMillis();  
     
    
- 
    
     
    
    
     
       String time = format.format(new Date());
     
    
- 
    
     
    
    
      // String fileName = "crash-" + time + "-" + timetamp + ".log";
     
    
- 
    
     
    
    
     
       String fileName = "crash-" + time + ".log";
     
    
- 
    
     
    
    
      if (Environment.getExternalStorageState().equals(  
     
    
- 
    
     
    
    
     
       Environment.MEDIA_MOUNTED)) {  
     
    
- 
    
     
    
    
      try {  
     
    
- 
    
     
    
    
     
       File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "1lbg");
     
    
- 
    
     
    
    
     
       Log.i("CrashHandler", dir.toString());  
     
    
- 
    
     
    
    
      if (!dir.exists())  
     
    
- 
    
     
    
    
     
       dir.mkdir();  
     
    
- 
    
     
    
    
     
       FileOutputStream fos = new FileOutputStream(new File(dir,  
     
    
- 
    
     
    
    
     
       fileName));  
     
    
- 
    
     
    
    
     
       fos.write(sb.toString().getBytes());  
     
    
- 
    
     
    
    
     
       fos.close();  
     
    
- 
    
     
    
    
      return fileName;  
     
    
- 
    
     
    
    
     
       } catch (FileNotFoundException e) {  
     
    
- 
    
     
    
    
     
       e.printStackTrace();  
     
    
- 
    
     
    
    
     
       } catch (IOException e) {  
     
    
- 
    
     
    
    
     
       e.printStackTrace();  
     
    
- 
    
     
    
    
     
       }  
     
    
- 
    
     
    
    
     
       }  
     
    
- 
    
     
    
    
      return null;  
     
    
- 
    
     
    
    
     
       }  
     
    
- 
    
     
    
    
     
      } 
     
    
 文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/jacke121/article/details/55684163
        【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
            cloudbbs@huaweicloud.com
        
        
        
        
        
        
        - 点赞
- 收藏
- 关注作者
 
             
           
评论(0)