代码如下:

package com.example.crashhandler;import java.io.File;import java.io.IOException;import java.io.PrintWriter;import java.io.RandomAccessFile;import java.io.StringWriter;import java.io.Writer;import java.lang.Thread.UncaughtExceptionHandler;import java.lang.reflect.Field;import android.annotation.SuppressLint;import android.os.Build;import android.os.Environment;/** * 异常管理器 * @author Administrator * */public class ICrashMgr {private static ICrashMgr ins=new ICrashMgr();private ICrashMgr(){};public static ICrashMgr getInstance(){return ins;}public void init(){mDefaultHandler=Thread.getDefaultUncaughtExceptionHandler();//获取系统默认的UncaughtException处理器Thread.setDefaultUncaughtExceptionHandler(mICrashHandler);//重新设置该CrashHandler为程序的默认处理器 }private UncaughtExceptionHandler mDefaultHandler;private ICrashHandler mICrashHandler=new ICrashHandler();private static class ICrashHandler implements UncaughtExceptionHandler{private final String EX_LOG_PATH=Environment.getExternalStorageDirectory().getPath()+"/.boyaa/.push/.log/exlog_%s.txt";@Overridepublic void uncaughtException(Thread thread, Throwable ex) {boolean isHandle=handle(thread,ex);if(!isHandle&&null!=ICrashMgr.getInstance().mDefaultHandler){ICrashMgr.getInstance().mDefaultHandler.uncaughtException(thread, ex);}else{try {                  Thread.sleep(3000);              } catch (InterruptedException e) {                 e.printStackTrace();             }  android.os.Process.killProcess(android.os.Process.myPid()); }}/** * 保存Log文件,需要包括时间,地点(哪台手机),事件 * @param thread * @param ex * @return */private boolean handle(Thread thread, final Throwable ex){if(null==ex){return false;}StringBuilder sb=new StringBuilder();sb.append("time:").append(getFormatTime(System.currentTimeMillis(),"yyyy-MM-dd HH:mm:ss")).append("\r\n");//时间sb.append("phone:").append(getMobileInfo()).append("\r\n");//地点sb.append("event:").append(getCrashInfo(ex)).append("\r\n").append("\r\n");//事件write(sb.toString());return true;}/** * 获取系统时间 * @param time * @param pattern * @return */@SuppressLint("SimpleDateFormat")public String getFormatTime(long time,String pattern){java.text.SimpleDateFormat format = new java.text.SimpleDateFormat(pattern);java.util.Date date = new java.util.Date(time);return format.format(date);} /**      * 获取手机的硬件信息       * @return      */      private String getMobileInfo()     {          StringBuffer sb = new StringBuffer();          //通过反射获取系统的硬件信息           try {                Field[] fields = Build.class.getDeclaredFields();              for(Field field: fields)            {                  //暴力反射 ,获取私有的信息                   field.setAccessible(true);                  String name = field.getName();                  String value = field.get(null).toString();                  sb.append(name+"="+value);                  sb.append("&");              }          } catch (Exception e) {              e.printStackTrace();          }          return sb.toString();      }        /**      * 获取错误的信息       * @param arg1      * @return      */      private String getCrashInfo(Throwable arg1)     {          Writer writer = new StringWriter();          PrintWriter pw = new PrintWriter(writer);          arg1.printStackTrace(pw);          pw.close();          String error= writer.toString();          return error;      }        public boolean write(String log){byte[] data=log.toString().getBytes();String fileName=String.format(EX_LOG_PATH, getFormatTime(System.currentTimeMillis(),"yyyy-MM-dd"));return appendFile(fileName,data, 0, data.length);}private boolean appendFile(String filename,byte[]data,int datapos,int datalength){RandomAccessFile rf=null;try {createFile(filename);rf= new RandomAccessFile(filename, "rw");rf.seek(rf.length());rf.write(data, datapos, datalength);} catch (Exception e) {e.printStackTrace();}finally{if(rf!=null){try {rf.close();} catch (IOException e) {e.printStackTrace();}rf=null;}}return true;}private boolean createFile(String filePath){try{File file = new File(filePath);if (!file.exists()){if (!file.getParentFile().exists()){file.getParentFile().mkdirs();}return file.createNewFile();}} catch (IOException e){e.printStackTrace();}return true;}}}

邮箱:zz7zz7zz@163.com

微博:http://weibo.com/u/3209971935

更多相关文章

  1. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
  2. Android(安卓)响应键盘移动图标
  3. android 捕捉app错误信息
  4. Android(安卓)kernel printk打印级别
  5. Android获取基站坐标代码
  6. Android更新UI的五种方式
  7. android 之simpleAdapter详解
  8. Android存取txt
  9. 获取android联系人信息

随机推荐

  1. Android(安卓)帧布局(FrameLayout)的理解
  2. Android 中数据库查询方法query()中的sel
  3. Android S5PV210 fimc驱动分析 - fimc_re
  4. 获取Android的APK包签名信息
  5. Android Studio 获取数字签名信息(SHA1)
  6. Android DownloadManager 用法
  7. 淘宝(阿里百川)手机客户端开发日记第一篇
  8. android 之 菜单
  9. Android判断Intent是否存在,是否可用
  10. android.database.CursorIndexOutOfBound