异常捕获器

来源:互联网 发布:html设计软件 编辑:程序博客网 时间:2024/06/03 20:03
importjava.io.Fileimportjava.io.FileOutputStreamimportjava.io.PrintWriterimportjava.io.StringWriterimportjava.io.Writerimportjava.lang.Thread.UncaughtExceptionHandlerimportjava.lang.reflect.Fieldimportjava.text.DateFormatimportjava.text.SimpleDateFormatimportjava.util.Dateimportjava.util.HashMapimportjava.util.Map;   importandroid.app.AlarmManagerimportandroid.app.PendingIntentimportandroid.content.Contextimportandroid.content.Intentimportandroid.content.pm.PackageInfoimportandroid.content.pm.PackageManagerimportandroid.content.pm.PackageManager.NameNotFoundExceptionimportandroid.os.Buildimportandroid.os.Environmentimportandroid.os.Looperimportandroid.os.Processimportandroid.util.Logimportandroid.widget.Toast;   importcom.bwei.xme.MainActivity;   import staticandroid.content.Intent.FLAG_ACTIVITY_NEW_TASK;   /** * UncaughtException处理类,当程序发生Uncaught异常的时候,有该类来接管程序,并记录发送错误报告. * * @author user * */ publicclassCrashHandler implements UncaughtExceptionHandler {   publicstaticfinal String TAG = "CrashHandler";   //系统默认的UncaughtException处理类 privateThread.UncaughtExceptionHandler mDefaultHandler; //CrashHandler实例 privatestaticCrashHandler INSTANCE = new CrashHandler(); //程序的Context对象 privateContext mContext; //用来存储设备信息和异常信息 privateMap<String,String> infos= new HashMap<String,String>();   //用于格式化日期,作为日志文件名的一部分 privateDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");   /** 保证只有一个CrashHandler实例*/ privateCrashHandler() { }   /** 获取CrashHandler实例 ,单例模式*/ publicstaticCrashHandler getInstance() { returnINSTANCE; }   /** * 初始化 * * @param context */ publicvoidinit(Contextcontext) { mContext = context; //获取系统默认的UncaughtException处理器 mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); //设置该CrashHandler为程序的默认处理器 Thread.setDefaultUncaughtExceptionHandler(this); }   /** * 当UncaughtException发生时会转入该函数来处理 */ @Override publicvoiduncaughtException(Threadthread,Throwable ex) { if (!handleException(ex)&& mDefaultHandler!= null) { //如果用户没有处理则让系统默认的异常处理器来处理 mDefaultHandler.uncaughtException(thread, ex); } else {   //退出程序           //第一种方法 // // Intent intent = new Intent(mContext, ReportActivity.class); // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // mContext.startActivity(intent); // // Process.killProcess(Process.myPid());     //第二种方法 // Intent intent = new Intent(mContext, MainActivity.class); // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // mContext.startActivity(intent); // android.os.Process.killProcess(android.os.Process.myPid());   } }   /** * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. * * @param ex * @return true:如果处理了该异常信息;否则返回false. */ privatebooleanhandleException(Throwableex) { if (ex==null) { returnfalse; } // 使用Toast来显示异常信息 // new Thread() { // @Override // public void run() { // Looper.prepare(); // Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出.", Toast.LENGTH_LONG).show(); // Looper.loop(); // } // }.start(); //收集设备参数信息 collectDeviceInfo(mContext); //保存日志文件 saveCrashInfo2File(ex);   returntrue; }   /** * 收集设备参数信息 * @param ctx */ publicvoidcollectDeviceInfo(Contextctx) { tryPackageManager 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); } } }   /** * 保存错误信息到文件中 * * @param ex * @return 返回文件名称,便于将文件传送到服务器 */ privateStringsaveCrashInfo2File(Throwableex) {   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"); } sb.append(ex.getMessage()); System.out.println("sb ="+ sb.toString()); // // 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 + ".log"; // if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { // String path = "/sdcard/crash/"; // 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); // } returnnull; } 

}

在application类的oncreate里

CrashHandler.getInstance(). init(this);

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 有双下巴怎么办才能瘦掉 胃突然疼的厉害怎么办 手劳损痛的厉害怎么办 手臂扭到了很疼怎么办 寒湿导致肩膀痛怎么办 吃辣脖子肿了怎么办 脖子长了个肿瘤怎么办 一边背高一边低怎么办 生完孩子肩宽了怎么办 狗狗脖子上长囊肿怎么办 胸肋关节韧带疼怎么办 三岁宝宝有点驼背怎么办 20多岁有点驼背怎么办 五岁宝宝有点驼背怎么办 孕妇腰扭了很痛怎么办 怀孕了腰扭了疼怎么办 小龙芭比扭腰机开机没有声音怎么办 高中生训练数学计算的准确性怎么办 跑步累了跑不动了怎么办 一跑步就岔气了怎么办 婴儿关节折邹发红怎么办? 打了借条人跑了怎么办 吃凉的胃不舒服怎么办 跑步机带子跑偏怎么办 在跑步机上摔倒怎么办 弯道以后就是直线行驶怎么办 跑步机的声音大怎么办 科二一直考不过怎么办 考科目三太紧张怎么办 科目三太紧张了怎么办 跑步慢怎么办怎样跑快 铣床铣得不直怎么办 考试的时候检测仪响怎么办 吸入腐蚀性气体导致嗓子疼怎么办 孕妇已做c13检查怎么办 静电除尘器绝缘子箱温度低怎么办 高中三角函数计算总算不对怎么办 江苏高考物理考d怎么办 高二化学学不好怎么办 中考最后一次月考下滑怎么办 物联网卡网速慢怎么办