今天测试遇到崩溃,而我又没办法查看,于是老司机教了我一招。

下面是CrashHandler类:

package com.bbk.bfcupload.bfcuploadtestdemo.util;import android.annotation.SuppressLint;
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 com.eebbk.bfc.uploadsdk.uploadmanage.LogUtils;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;/*** UncaughtException处理类,当程序发生Uncaught异常的时候,由该类来接管程序,并记录发送错误报告.** @author way*/
public class CrashHandler implements UncaughtExceptionHandler {private Context mContext;private UncaughtExceptionHandler mDefaultHandler;            // 系统默认的UncaughtException处理类private static CrashHandler INSTANCE = new CrashHandler();            // CrashHandler实例private Map<String, String> info = new HashMap<String, String>();    // 用来存储设备信息和异常信息/*** 保证只有一个CrashHandler实例*/private CrashHandler() {}/*** 获取CrashHandler实例 ,单例模式*/public static CrashHandler getInstance() {return INSTANCE;}/*** 初始化** @param context*/public void init(Context context) {mContext = context.getApplicationContext();mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();// 获取系统默认的UncaughtException处理器Thread.setDefaultUncaughtExceptionHandler(this);// 设置该CrashHandler为程序的默认处理器}/*** 当UncaughtException发生时会转入该重写的方法来处理*/@Overridepublic void uncaughtException(Thread thread, Throwable ex) {if (mDefaultHandler != null) {handleException(ex);// 如果自定义的没有处理则让系统默认的异常处理器来处理mDefaultHandler.uncaughtException(thread, ex);// 退出程序android.os.Process.killProcess(android.os.Process.myPid());}}/*** 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.** @param ex 异常信息 <a*           href="\"http://www.eoeandroid.com/home.php?mod=space&uid=7300\""*           target="\"_blank\"">@return</a> true 如果处理了该异常信息;否则返回false.*/public boolean handleException(final Throwable ex) {if (ex == null) return false;LogUtils.e(ex, " uncaught exception !");// 收集设备参数信息collectDeviceInfo(mContext);// 保存日志文件final String exString = getCrashInfoString(ex);saveCrashInfo2File(exString, mContext);return true;}/*** 收集设备参数信息** @param context*/public void collectDeviceInfo(Context context) {try {PackageManager pm = context.getPackageManager();// 获得包管理器PackageInfo pi = pm.getPackageInfo(context.getPackageName(), PackageManager.GET_ACTIVITIES);// 得到该应用的信息,即主Activityif (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) {LogUtils.e("Error: " + e);}Field[] fields = Build.class.getDeclaredFields();// 反射机制for (Field field : fields) {try {field.setAccessible(true);info.put(field.getName(), field.get("").toString());} catch (IllegalArgumentException e) {LogUtils.e("Error: " + e);} catch (IllegalAccessException e) {LogUtils.e("Error: " + e);}}}private String getCrashInfoString(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).append("=").append(value).append("\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);return sb.toString();}@SuppressLint("SimpleDateFormat")public static String saveCrashInfo2File(String exString, Context context) {long timetamp = System.currentTimeMillis();String time = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date());String fileName = "-crash-" + time + "-" + timetamp + ".log";if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {try {//File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "SynChinese");File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + ".crash" + File.separator + context.getPackageName());if (!dir.exists()) {dir.mkdirs();}File outfile = new File(dir, fileName);FileOutputStream fos = new FileOutputStream(outfile);fos.write(exString.getBytes());fos.close();return outfile.getAbsolutePath();} catch (FileNotFoundException e) {LogUtils.e("Error: " + e);} catch (IOException e) {LogUtils.e("Error: " + e);}}return null;}
}

使用方法:

在application里面调用:

CrashHandler.getInstance().init(this);
则遇到崩溃时会自动创建.crash文件,不过文件不可见的需要用文件管理器才可以
												

自定义CrashHandler轻轻松松让你查看程序崩溃相关推荐

  1. ubuntu中打开出现闪退_Ubuntu查看程序崩溃、系统闪退日志

    前言 本文旨在简单介绍如何查找Ubuntu的程序崩溃.系统闪退日志. MOTIVATION 最近自己的Ubuntu电脑总是在我打字写博客(使用的搜狗输入法)的时候突然整个屏幕就卡住了,鼠标能动,但是用 ...

  2. linux 进程崩溃log,linux调试:dmesg 查看程序崩溃原因分析方法之一

    在Linux下写C/C++程序的程序员,时常与Core Dump相见.在内存越界访问,收到不能处理的信号,除零等错误出现时,我们精心或不精心写就的程序就直接一命呜呼了,Core Dump是Linux仁 ...

  3. 服务器上出现应用程序错误。此应用程序的当前自定义错误设置禁止远程查看应用程序错误的详细信息(出于安全原因)。未能加载文件或程序集“XXXXXX”或它的某一个依赖项。拒绝访问。

    前景:服务器在本地的VS编辑器运行起来正常,但是部署上就会报错. 我开发的这个项目,是因为后台要对客户端前台上传的Excel表进行操作,所以才会出现以下问题,在这之前, IIS服务器会要求把项目网站对 ...

  4. android程序崩溃后重启

    有时候由于测试不充分或者程序潜在的问题而导致程序异常崩溃,这个是令人无法接受的,在android中怎样捕获程序的异常崩溃,然后进行一些必要的处理或重新启动 应用这个问题困恼了我很久,今天终于解决了该问 ...

  5. android查找邮件程序,Android 程序崩溃日志邮件获取

    版权声明:本文为博主原创文章,未经博主允许不得转载. 在我们开发Android应用程序的时候,BUG的出现是难以避免的,时不时还会出现崩溃的情况,这个时候,我们急需知道造成问题的原因是什么,但是,在没 ...

  6. java 崩溃日志_Android收集程序崩溃日志的方法

    安卓Android如何手机程序崩溃日志并上传到服务器呢?直接会用到Thread线程里面的UncaughtExceptionHandler接口方法,我们可以自定义一个类CrashHandler,代码如下 ...

  7. android 程序崩溃处理,Android应用崩溃的应急处理

    在我们开发Android应用程序的时候总是难免遇到程序崩溃的问题:(很抱歉,"××"已停止运行.) 每次看到这个问题心都是哇凉哇凉的 一般遇到这样问题,有两种可能: 1.自己的代码 ...

  8. Linux C/C++程序崩溃bug调试方法

    C,C++程序最常见的崩溃问题就是内存问题,内存越界,访问空指针,野指针等都会造成程序崩溃.Linux系统中当程序运行过程中出现非法操作,系统会先发送对应的错误信号,每种错误信号都有默认的处理方式,比 ...

  9. Linux内存耗尽宕机6,转载:Linux服务器Cache占用过多内存导致系统内存不足最终java应用程序崩溃解决方案...

    原文链接: https://blog.csdn.net/u014740338/article/details/66975550 问题描述 Linux内存使用量超过阈值,使得Java应用程序无可用内存, ...

最新文章

  1. 什么是拉电流和灌电流?
  2. Android WebView 支持H5的定位Js
  3. ECS控制台使用小贴士
  4. DHCP中继代理;DHCP突破vlan限制
  5. redis 同步化操作
  6. CentOS 初体验二十一:redis常用命令:String
  7. miniui 加载文件时会做的一些事情
  8. 无法定位程序输入点 _ZdaPvj 于动态链接库 libstdc++-6.dll
  9. [Erlang危机](5.1.1)内存
  10. 从网络营销辞职转行软件测试,100天的心酸拿到9K,过程都是自己在苦撑,只因我...
  11. Java程序设计基础笔记 • 【第1章 初识Java】
  12. java模拟器野人岛2,生存战争野人岛2最终版
  13. java导出excel 边框不全_java POI导出excel,合并单元格边框消失
  14. photoshop设置A4纸张大小
  15. 中国现代文学专题形考2022
  16. 打地鼠小游戏(Laya.box)
  17. Lipschitz连续,一致连续
  18. TOTP 介绍及基于C#的简单实现
  19. 河南省申请测绘资质保密人员要求
  20. 2021Java面经:java封装的概念

热门文章

  1. ps转手绘课程嘴巴绘制+之前回顾--day05学习笔记
  2. c语言5v电源电路工作原理,TCL王牌PWL4201C电源板工作原理介绍
  3. React 的受控组件和非受控组件有什么不同
  4. 通过setsockopt设置SO_SNDBUF、SO_RCVBUF这连个默认缓冲区的值,再用getsockopt获取设置的值,发现返回值是设置值的两倍。
  5. 超强使用干货!教你如何吃透一个Java项目
  6. CSP认证题解第二题
  7. Stripes 初学
  8. 知乎万赞回答:如何在一周内快速摸清一个行业?
  9. 故障排除 OpenShift Operator (OLM) (非集群默认的 Operator)
  10. H5自定义video播放控件,播放暂停使用图标