package com.anthony.library.utils; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Build; import android.os.Environment; import android.util.Log; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.util.Calendar; import java.util.Locale; public class LocalFileUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { private Context mContext; private Thread.UncaughtExceptionHandler mDefaultHandler; public LocalFileUncaughtExceptionHandler(Context context, Thread.UncaughtExceptionHandler defaultHandler){ this.mDefaultHandler = defaultHandler; this.mContext = context; } @Override public void uncaughtException(Thread thread, Throwable ex) { Log.e("Crash", "Application crash", ex); writeFile(thread, ex); mDefaultHandler.uncaughtException(thread, ex); } private void writeFile(final Thread thread, final Throwable ex){ try { OutputStream os = getLogStream(); os.write(getExceptionInformation(thread, ex).getBytes("utf-8")); os.flush(); os.close(); android.os.Process.killProcess(android.os.Process.myPid()); } catch(Exception e){ e.printStackTrace(); } } private OutputStream getLogStream() throws IOException { //crash_log_pkgname.log String fileName = String.format("crash_%s.log", mContext.getPackageName()); File file = new File(Environment.getExternalStorageDirectory(), fileName); if(!file.exists()){ file.createNewFile(); } return new FileOutputStream(file, true); } private String getExceptionInformation(Thread thread, Throwable ex){ long current = System.currentTimeMillis(); StringBuilder sb = new StringBuilder().append('\n'); sb.append("THREAD: ").append(thread).append('\n'); sb.append("BOARD: ").append(Build.BOARD).append('\n'); sb.append("BOOTLOADER: ").append(Build.BOOTLOADER).append('\n'); sb.append("BRAND: ").append(Build.BRAND).append('\n'); sb.append("CPU_ABI: ").append(Build.CPU_ABI).append('\n'); sb.append("CPU_ABI2: ").append(Build.CPU_ABI2).append('\n'); sb.append("DEVICE: ").append(Build.DEVICE).append('\n'); sb.append("DISPLAY: ").append(Build.DISPLAY).append('\n'); sb.append("FINGERPRINT: ").append(Build.FINGERPRINT).append('\n'); sb.append("HARDWARE: ").append(Build.HARDWARE).append('\n'); sb.append("HOST: ").append(Build.HOST).append('\n'); sb.append("ID: ").append(Build.ID).append('\n'); sb.append("MANUFACTURER: ").append(Build.MANUFACTURER).append('\n'); sb.append("MODEL: ").append(Build.MODEL).append('\n'); sb.append("PRODUCT: ").append(Build.PRODUCT).append('\n'); sb.append("SERIAL: ").append(Build.SERIAL).append('\n'); sb.append("TAGS: ").append(Build.TAGS).append('\n'); sb.append("TIME: ").append(Build.TIME).append(' ').append(toDateString(Build.TIME)).append('\n'); sb.append("TYPE: ").append(Build.TYPE).append('\n'); sb.append("USER: ").append(Build.USER).append('\n'); sb.append("VERSION.CODENAME: ").append(Build.VERSION.CODENAME).append('\n'); sb.append("VERSION.INCREMENTAL: ").append(Build.VERSION.INCREMENTAL).append('\n'); sb.append("VERSION.RELEASE: ").append(Build.VERSION.RELEASE).append('\n'); sb.append("VERSION.SDK_INT: ").append(Build.VERSION.SDK_INT).append('\n'); sb.append("LANG: ").append(mContext.getResources().getConfiguration().locale.getLanguage()).append('\n'); sb.append("APP.VERSION.NAME: ").append(getVersionName()).append('\n'); sb.append("APP.VERSION.CODE: ").append(getVersionCode()).append('\n'); sb.append("CURRENT: ").append(current).append(' ').append(toDateString(current)).append('\n'); sb.append(getErrorInformation(ex)); return sb.toString(); } private String getVersionName(){ PackageManager packageManager = mContext.getPackageManager(); PackageInfo packInfo = null; String version = null; try { packInfo = packageManager.getPackageInfo(mContext.getPackageName(),0); version = packInfo.versionName; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return version; } private int getVersionCode(){ PackageManager packageManager = mContext.getPackageManager(); PackageInfo packInfo = null; int version = 0; try { packInfo = packageManager.getPackageInfo(mContext.getPackageName(),0); version = packInfo.versionCode; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return version; } private String getErrorInformation(Throwable t){ ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintWriter writer = new PrintWriter(baos); t.printStackTrace(writer); writer.flush(); String result = new String(baos.toByteArray()); writer.close(); return result; } private String toDateString(long timeMilli){ Calendar calc = Calendar.getInstance(); calc.setTimeInMillis(timeMilli); return String.format(Locale.CHINESE, "%04d.%02d.%02d %02d:%02d:%02d:%03d", calc.get(Calendar.YEAR), calc.get(Calendar.MONTH) + 1, calc.get(Calendar.DAY_OF_MONTH), calc.get(Calendar.HOUR_OF_DAY), calc.get(Calendar.MINUTE), calc.get(Calendar.SECOND), calc.get(Calendar.MILLISECOND)); } }