android 异常打印

举报
风吹稻花香 发表于 2021/06/04 23:17:35 2021/06/04
【摘要】  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());
 

 


  
  1. package com.lbstock;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.PrintWriter;
  7. import java.io.StringWriter;
  8. import java.io.Writer;
  9. import java.lang.Thread.UncaughtExceptionHandler;
  10. import java.lang.reflect.Field;
  11. import java.text.SimpleDateFormat;
  12. import java.util.Date;
  13. import java.util.HashMap;
  14. import java.util.Map;
  15. import android.content.Context;
  16. import android.content.pm.PackageInfo;
  17. import android.content.pm.PackageManager;
  18. import android.content.pm.PackageManager.NameNotFoundException;
  19. import android.os.Build;
  20. import android.os.Environment;
  21. import android.os.Looper;
  22. import android.util.Log;
  23. import android.widget.Toast;
  24. /**
  25. * UncaughtException处理类,当程序发生Uncaught异常的时候,由该类来接管程序,并记录发送错误报告.
  26. * @author way
  27. */
  28. public class CrashHandler implements UncaughtExceptionHandler {
  29. private static final String TAG = "CrashHandler";
  30. private Thread.UncaughtExceptionHandler mDefaultHandler;// 系统默认的UncaughtException处理类
  31. private static CrashHandler INSTANCE = new CrashHandler();// CrashHandler实例
  32. private Context mContext;// 程序的Context对象
  33. private Map<String, String> info = new HashMap<String, String>();// 用来存储设备信息和异常信息
  34. private SimpleDateFormat format = new SimpleDateFormat(
  35. "yyyy-MM-dd-HH-mm-ss");// 用于格式化日期,作为日志文件名的一部分
  36. /** 保证只有一个CrashHandler实例 */
  37. private CrashHandler() {
  38. }
  39. /** 获取CrashHandler实例 ,单例模式 */
  40. public static CrashHandler getInstance() {
  41. return INSTANCE;
  42. }
  43. public void init(Context context) {
  44. mContext = context;
  45. mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();// 获取系统默认的UncaughtException处理器
  46. Thread.setDefaultUncaughtExceptionHandler(this);// 设置该CrashHandler为程序的默认处理器
  47. }
  48. /**
  49. * 当UncaughtException发生时会转入该重写的方法来处理
  50. */
  51. public void uncaughtException(Thread thread, Throwable ex) {
  52. if (!handleException(ex) && mDefaultHandler != null) {
  53. // 如果自定义的没有处理则让系统默认的异常处理器来处理
  54. mDefaultHandler.uncaughtException(thread, ex);
  55. } else {
  56. try {
  57. Thread.sleep(3000);// 如果处理了,让程序继续运行3秒再退出,保证文件保存并上传到服务器
  58. } catch (InterruptedException e) {
  59. e.printStackTrace();
  60. }
  61. // 退出程序
  62. android.os.Process.killProcess(android.os.Process.myPid());
  63. System.exit(1);
  64. }
  65. }
  66. /**
  67. * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
  68. * @param ex 异常信息
  69. * @return true 如果处理了该异常信息;否则返回false.
  70. */
  71. public boolean handleException(Throwable ex) {
  72. if (ex == null)
  73. return false;
  74. new Thread() {
  75. public void run() {
  76. Looper.prepare();
  77. Log.e("lbsotck",String.valueOf(ex.getMessage()));
  78. Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出", Toast.LENGTH_LONG).show();
  79. Looper.loop();
  80. }
  81. }.start();
  82. // 收集设备参数信息
  83. collectDeviceInfo(mContext);
  84. // 保存日志文件
  85. saveCrashInfo2File(ex);
  86. return true;
  87. }
  88. /**
  89. * 收集设备参数信息
  90. * @param context
  91. */
  92. public void collectDeviceInfo(Context context) {
  93. try {
  94. PackageManager pm = context.getPackageManager();// 获得包管理器
  95. PackageInfo pi = pm.getPackageInfo(context.getPackageName(),
  96. PackageManager.GET_ACTIVITIES);// 得到该应用的信息,即主Activity
  97. if (pi != null) {
  98. String versionName = pi.versionName == null ? "null"
  99. : pi.versionName;
  100. String versionCode = pi.versionCode + "";
  101. info.put("versionName", versionName);
  102. info.put("versionCode", versionCode);
  103. }
  104. } catch (NameNotFoundException e) {
  105. e.printStackTrace();
  106. }
  107. Field[] fields = Build.class.getDeclaredFields();// 反射机制
  108. for (Field field : fields) {
  109. try {
  110. field.setAccessible(true);
  111. info.put(field.getName(), field.get("").toString());
  112. Log.d(TAG, field.getName() + ":" + field.get(""));
  113. } catch (IllegalArgumentException e) {
  114. e.printStackTrace();
  115. } catch (IllegalAccessException e) {
  116. e.printStackTrace();
  117. }
  118. }
  119. }
  120. private String saveCrashInfo2File(Throwable ex) {
  121. StringBuffer sb = new StringBuffer();
  122. for (Map.Entry<String, String> entry : info.entrySet()) {
  123. String key = entry.getKey();
  124. String value = entry.getValue();
  125. sb.append(key + "=" + value + "\r\n");
  126. }
  127. Writer writer = new StringWriter();
  128. PrintWriter pw = new PrintWriter(writer);
  129. ex.printStackTrace(pw);
  130. Throwable cause = ex.getCause();
  131. // 循环着把所有的异常信息写入writer中
  132. while (cause != null) {
  133. cause.printStackTrace(pw);
  134. cause = cause.getCause();
  135. }
  136. pw.close();// 记得关闭
  137. String result = writer.toString();
  138. sb.append(result);
  139. // 保存文件
  140. long timetamp = System.currentTimeMillis();
  141. String time = format.format(new Date());
  142. // String fileName = "crash-" + time + "-" + timetamp + ".log";
  143. String fileName = "crash-" + time + ".log";
  144. if (Environment.getExternalStorageState().equals(
  145. Environment.MEDIA_MOUNTED)) {
  146. try {
  147. File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "1lbg");
  148. Log.i("CrashHandler", dir.toString());
  149. if (!dir.exists())
  150. dir.mkdir();
  151. FileOutputStream fos = new FileOutputStream(new File(dir,
  152. fileName));
  153. fos.write(sb.toString().getBytes());
  154. fos.close();
  155. return fileName;
  156. } catch (FileNotFoundException e) {
  157. e.printStackTrace();
  158. } catch (IOException e) {
  159. e.printStackTrace();
  160. }
  161. }
  162. return null;
  163. }
  164. }

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/55684163

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。