標籤:android io ar os 使用 sp for on div
public class CrashHandler implements UncaughtExceptionHandler{private static CrashHandler instance; public static final String TAG = "CrashHandler"; private static final String VERSION_NAME = "versionName"; private static final String VERSION_CODE = "versionCode"; private static final String STACK_TRACE = "STACK_TRACE"; private Thread.UncaughtExceptionHandler mDefaultHandler; private Context mContext; private static final String CRASH_REPORTER_EXTENSION = ".cr";private Properties deviceCrashInfo = new Properties(); private CrashHandler(){} public static synchronized CrashHandler getInstance(){if (instance == null){instance = new CrashHandler();}return instance;} public void init(Context ctx){this.mContext = ctx;mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();Thread.setDefaultUncaughtExceptionHandler(this);} @Overridepublic void uncaughtException(Thread thread, Throwable ex){if (mDefaultHandler != null && !handlerException(ex)){// 如果使用者沒有進行異常處理就讓系統預設的處理器來處理mDefaultHandler.uncaughtException(thread, ex);} else{exitApp();}} private boolean handlerException(Throwable ex){if (ex == null){return true;}final String msg = ex.getLocalizedMessage();new Thread() {@Overridepublic void run(){Looper.prepare();Toast toast = Toast.makeText(mContext, "程式出錯啦!" + msg, Toast.LENGTH_SHORT);toast.setGravity(Gravity.CENTER, 0, 0);toast.show();Looper.loop();}}.start();// 收集裝置資訊collectDeviceInfo(mContext);// 儲存錯誤saveCrashInfoToFiles(ex);// 發送錯誤報表到伺服器sendCrashReportsToServer(mContext);return true;} private void collectDeviceInfo(Context ctx){try{PackageManager pm = ctx.getPackageManager();PackageInfo pi = pm.getPackageArchiveInfo(ctx.getPackageName(),PackageManager.GET_ACTIVITIES);if (pi != null){deviceCrashInfo.put(VERSION_NAME, pi.versionName == null ? "not set": pi.versionName);deviceCrashInfo.put(VERSION_CODE, pi.versionCode);}} catch (Exception e){Log.e(TAG, "error occured when collecting crash info" + e);} // 使用反射來收集裝置資訊.在Build類中包含各種裝置資訊,// 例如: 系統版本號碼,裝置生產商 等協助偵錯工具的有用資訊// 具體資訊請參考後面的Field[] fields = Builder.class.getDeclaredFields();for (Field field : fields){try{field.setAccessible(true);deviceCrashInfo.put(field.getName(), null);} catch (Exception e){Log.e(TAG, "error occured when collecting device info" + e);}}} private String saveCrashInfoToFiles(Throwable ex){Writer info = new StringWriter();PrintWriter printWriter = new PrintWriter(info);ex.printStackTrace(printWriter); Throwable cause = ex.getCause();while (cause != null){ex.printStackTrace(printWriter);cause = cause.getCause();} String result = info.toString();printWriter.close();deviceCrashInfo.put("EXCEPTION", ex.getLocalizedMessage());deviceCrashInfo.put(STACK_TRACE, result); try{long time = System.currentTimeMillis();String filename = "crash-" + time + CRASH_REPORTER_EXTENSION;FileOutputStream trace = mContext.openFileOutput(filename, Context.MODE_PRIVATE); deviceCrashInfo.store(trace, "");trace.flush();trace.close();} catch (Exception e){Log.e(TAG, "error occured when save crashinfo to files" + e);}return null;} private void sendCrashReportsToServer(Context ctx){String[] crFiles = getCrashReportFiles(ctx);if (crFiles != null && crFiles.length > 0){TreeSet<String> sortedFiles = new TreeSet<String>();sortedFiles.addAll(Arrays.asList(crFiles));for (String fileName : sortedFiles){File cr = new File(ctx.getFilesDir(), fileName);postReport(cr);cr.delete();// 刪除已發送的報告}}} private void postReport(File file){// TODO 發送錯誤報表到伺服器} private String[] getCrashReportFiles(Context ctx){File filesDir = ctx.getFilesDir();FilenameFilter filter = new FilenameFilter() {public boolean accept(File dir, String name){return name.endsWith(CRASH_REPORTER_EXTENSION);}};return filesDir.list(filter);} private void exitApp(){android.os.Process.killProcess(android.os.Process.myPid());System.exit(0);}} 結伴旅遊網,一個免費的交友網站:www.jieberu.com推推族,免費得門票,遊景區:www.tuituizu.com
Android處理未捕獲的異常(應用全域異常)