Android 全局異常捕獲 CrashHandler

捕獲異常 而且 保存到日誌文件的類。
package com.and.mvp.base.base;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.os.Build;
import android.os.Environment;
import android.text.TextUtils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.Thread.UncaughtExceptionHandler;
import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.TimeZone;

public class CarshHandler implements UncaughtExceptionHandler {
    private static Context cxt;
    private UncaughtExceptionHandler mPrevious;
    /**
     * android系統版本
     */
    private static String ANDROID = Build.VERSION.RELEASE;
    /**
     * 機型
     */
    private static String MODEL = Build.MODEL;
    /**
     * 手機牌子
     */
    private static String MANUFACTURER = Build.MANUFACTURER;
    public static String VERSION = "Unknown";
    private static CarshBuilder mBuilder;
    private boolean isAppend;
    private boolean isSimple;

    /**
     * @param isSimple 是否爲簡單的日誌記錄模式
     */
    public void setSimple(boolean isSimple) {
        this.isSimple = isSimple;
    }

    /**
     * @param isAppend 是否爲日誌追加模式
     */
    public CarshHandler setAppend(boolean isAppend) {
        this.isAppend = isAppend;
        return this;
    }

    private CarshHandler() {
        mPrevious = Thread.currentThread().getUncaughtExceptionHandler();
        Thread.currentThread().setUncaughtExceptionHandler(this);
    }

    public static CarshHandler init(Context context, String dirName) {
        cxt = context;
        try {
            PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            VERSION = info.versionName + info.versionCode;
            mBuilder = CarshBuilder.build(context, dirName);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return new CarshHandler();
    }

    private static String formatNumber(int value) {
        return new DecimalFormat("00").format(value);
    }

    private static String getCurrentDate() {
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00"));
        return calendar.get(Calendar.YEAR) + "-" + formatNumber((calendar.get(Calendar.MONTH) + 1)) + "-"
                + formatNumber(calendar.get(Calendar.DAY_OF_MONTH)) + "  "
                + formatNumber(calendar.get(Calendar.HOUR_OF_DAY)) + ":" + formatNumber(calendar.get(Calendar.MINUTE));
    }

    @Override
    public void uncaughtException(Thread thread, Throwable throwable) {
        File f = new File(mBuilder.getCarsh_log());
        if (f.exists()) {
            if (!isAppend)
                f.delete();
        } else {
            try {
                new File(mBuilder.getCarsh_dir()).mkdirs();
                f.createNewFile();
            } catch (Exception e) {
                return;
            }
        }

        PrintWriter p;
        try {
            p = new PrintWriter(new FileWriter(f, true));
        } catch (Exception e) {
            return;
        }
        p.write("\n*************---------Carsh  Log  Head ------------****************\n\n");
        p.write("Happend Time: " + getCurrentDate() + "\n");
        p.write("Android Version: " + ANDROID + "\n");
        p.write("Device Model: " + MODEL + "\n");
        p.write("Device Manufacturer: " + MANUFACTURER + "\n");
        p.write("App Version: v" + VERSION + "\n\n");
        p.write("*************---------Carsh  Log  Head ------------****************\n\n");
        if (!isSimple) {
            throwable.printStackTrace(p);
        } else {
            p.write(throwable.getLocalizedMessage() + "\n");
        }
        p.close();
        try {
            new File(mBuilder.getCarsh_tag()).createNewFile();
        } catch (Exception e) {
            return;
        }

        if (mPrevious != null) {
            mPrevious.uncaughtException(thread, throwable);
        }
    }

    public static class CarshBuilder {
        private String carsh_dir;

        public String getCarsh_dir() {
            return carsh_dir;
        }

        public String getCarsh_log() {
            return getCarsh_dir() + File.separator + "carshRecord.log";
        }

        public String getCarsh_tag() {

            return getCarsh_dir() + File.separator + ".carshed";
        }

        public CarshBuilder(Context context, String dirName) {
            if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
                this.carsh_dir = context.getCacheDir().getPath() + File.separator + dirName;
            } else
                this.carsh_dir = Environment.getExternalStorageDirectory().getPath() + File.separator + dirName;
        }

        public static CarshBuilder build(Context context, String dirName) {
            return new CarshBuilder(context, dirName);
        }

        @Override
        public String toString() {
            return "CarshBuilder [dir path: " + getCarsh_dir() + "-- log path:" + getCarsh_log() + "-- tag path:"
                    + getCarsh_tag() + "]";
        }
    }

    /**
     * 獲取log 日誌路徑
     */
    public static String getLogFilePath() {
        if (mBuilder == null)
            return "Unknown";
        else
            return mBuilder.getCarsh_log();
    }

    /**
     * 獲取 LOG 記錄的內容
     */
    public static String getLogContent() {
        if (TextUtils.isEmpty(getLogFilePath()))
            return null;

        File file = new File(getLogFilePath());
        if (file.exists() && file.isFile()) {
            BufferedReader bis = null;
            try {
                bis = new BufferedReader(new FileReader(file));
                String buffer = null;
                StringBuilder sb = new StringBuilder();
                while ((buffer = bis.readLine()) != null) {
                    sb.append(buffer);
                }
                return sb.toString();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (bis != null)
                        bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}

 

//在Application裏面進行初始化java

public class BApplication extends Application implements Thread.UncaughtExceptionHandler {

    @Override
    public void onCreate() {
        super.onCreate();

    //做用爲設置當線程因爲未捕獲到異常而忽然終止,而且沒有爲該線程定義其餘處理程序時所調用的默認處理程序。
        Thread.setDefaultUncaughtExceptionHandler(this);
        //setAppend是否爲追加模式, setSimple是不是簡單的log信息,
        CarshHandler.init(this, "CarshHandler").setAppend(true).setSimple(false);

    }

    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        //調用這個方法說明程序異常了,在這裏能夠推出程序 或者 重啓應用程序
    ext();
    }

    // 從新啓動應用程序
    private void ext() {
        Intent intent = new Intent(getApplicationContext(), StartActivity.class);
        PendingIntent restartIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent,
                Intent.FLAG_ACTIVITY_NEW_TASK);
        AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent); // 1秒鐘後重啓應用
        // 殺死該應用進程
        android.os.Process.killProcess(android.os.Process.myPid());
    }

}

也能夠在Activity 裏面獲得 日誌保存的路徑和錯誤日誌內容android

"日誌路徑 : " + CarshHandler.getLogFilePath() + " ---- 日誌內容 : " + CarshHandler.getLogContent());app

最後別忘了 android:name=".base.BApplication" ide

相關文章
相關標籤/搜索