在市面上有很多异常捕获SDK,比如bugly,友盟等。今天记录一个自定义全局捕获异常功能。
主要用到的是Thread.UncaughtExceptionHandler这个接口。当出现异常时,会回调uncaughtException()方法
@Override
public void uncaughtException(Thread t, Throwable e) {}
参数一:异常出现的线程
参数二:未捕获的异常
可以根据Throwable参数得到异常信息。
代码:
public class CrashHandlerimplements Thread.UncaughtExceptionHandler {
private static final boolean DEBUG =true;
private static final FileROOT_FILE = Environment.getExternalStorageDirectory();
private static final StringFILE_NAME_SUFFIX ="trace.txt";
private static CrashHandlersInstance =new CrashHandler();
private Thread.UncaughtExceptionHandleruncaughtExceptionHandler;
private ContextmContext;
private CrashHandler() {
}
public static CrashHandlergetsInstance() {
return sInstance;
}
public void init(Context context) {
uncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
mContext = context.getApplicationContext();
}
/*
当程序中有未被捕获的异常,系统将会自动调用uncaughtException方法
Thread:出现未捕获异常的线程,
Throwable:未捕获的异常
*/
@Override
public void uncaughtException(Thread t, Throwable e) {
writeExceptionToSD(e);
e.printStackTrace();
if(uncaughtExceptionHandler !=null){
uncaughtExceptionHandler.uncaughtException(t,e);
}else{
Process.killProcess(Process.myPid());
}
}
/*
将异常信息写入文件中
*/
private void writeExceptionToSD(Throwable ex) {
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
if (DEBUG) {
return;
}
}
File dir =new File(ROOT_FILE,"crashLog");
if (!dir.exists()) {
dir.mkdir();
}
File file =new File(dir, FILE_NAME_SUFFIX);
if(!file.exists()){
try {
file.createNewFile();
}catch (IOException e) {
e.printStackTrace();
}
}
long current = System.currentTimeMillis();
String time =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(current));
try {
PrintWriter pw =new PrintWriter(new BufferedWriter(new FileWriter(file)));
pw.println(time);
readPhoneInfo(pw);
pw.println();
ex.printStackTrace(pw);
pw.close();
}catch (IOException e) {
e.printStackTrace();
}catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
/*
读取手机信息
*/
private void readPhoneInfo(PrintWriter pw)throws PackageManager.NameNotFoundException {
PackageManager pm =mContext.getPackageManager();
PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);
pw.print("App Version:");
pw.print(pi.versionName);
pw.print("______");
pw.println(pi.versionCode);
pw.print("OS Version: ");
pw.print(Build.VERSION.RELEASE);
pw.print("______");
pw.println(Build.VERSION.SDK_INT);
pw.print("Vendor: ");
pw.println(Build.MANUFACTURER);
pw.print("Model: ");
pw.println(Build.MODEL);
pw.print("CPU ABI: ");
pw.println(Build.CPU_ABI);
}
}
在application中引用
public class TestApplicationextends Application {
@Override
public void onCreate() {
super.onCreate();
CrashHandler crashHandler = CrashHandler.getsInstance();
crashHandler.init(this);
}
}
输入:











网友评论