android 捕获应用异常并保存入日志文件中

本文参考了:http://blog.csdn.net/kevinmeng_ini58/article/details/7440810

首先这样做的好处是,当用户的手机运行我们的应用奔溃了的时候,我们可以向他要奔溃日志,来解决一些问题,这个很有用。

先上主要代码:

public class CrashHandler implements UncaughtExceptionHandler {
    private Context mContext;
    private UncaughtExceptionHandler mHandler;
    private static CrashHandler crashHandler;
    public static final String HOME_FILE = Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"TestLog"+File.separator;
    private CrashHandler(){}

    public static CrashHandler newInstence(){
        if (crashHandler == null) {
            synchronized (CrashHandler.class){
                if (crashHandler == null) {
                    crashHandler = new CrashHandler();
                }
            }
        }
        return crashHandler;
    }
    /**
     * 初始化信息
     * @param context
     */
    public void init(Context context){
        mHandler = Thread.getDefaultUncaughtExceptionHandler();
        mContext = context;
        Thread.setDefaultUncaughtExceptionHandler(this);
    }
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        if (!handlerException(ex) && mHandler != null) {
            mHandler.uncaughtException(thread,ex);
        }else{
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(1);
        }
    }

    public boolean handlerException(Throwable ex){
        if (ex == null) {
            return false;
        }
        ex.printStackTrace();
        changeExceptionToFileInfo(ex);
        return true;
    }

    public void changeExceptionToFileInfo(Throwable ex){
        String logName = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".log";
        String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        StringWriter sw = new StringWriter();
        sw.append(date).append("\n");
        PackageManager packageManager = mContext.getPackageManager();
        try {
            PackageInfo pi = packageManager.getPackageInfo(mContext.getPackageName(), 0);
            String versionName = pi.versionName;
            int versionCode = pi.versionCode;
            sw.append("r_" + "vn " + versionName + "_vc " + versionCode + "\n");
            sw.append(android.os.Build.BRAND + " " + android.os.Build.MODEL + " Android " + android.os.Build.VERSION.RELEASE + "\n");
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        ex.printStackTrace(new PrintWriter(sw));
        sw.append("*******************************************************").append("\n");
        sw.append("*******************************************************").append("\n");
        printToFile(logName,sw);

    }

    public void printToFile(String fileName,StringWriter sw) {
        File file = new File(HOME_FILE, fileName);
        FileWriter fw = null;
        try {
            File homeDir = new File(HOME_FILE);
            if (!homeDir.exists()) {
                homeDir.mkdirs();
            }
            if (!file.exists()) {
                file.createNewFile();
            }
            fw = new FileWriter(file,true);
            fw.write(sw.toString());
            fw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fw != null) {
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

使用方式是:
实现一个自己的application:
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        CrashHandler.newInstence().init(this);
    }
}

注册,我们自己的异常捕获类,就行了。
还有要注意的一点是,因为涉及到了,写文件操作,所有,需要权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值