捕獲異常 而且 保存到日誌文件的類。
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