每次让测试人员抓log都比较麻烦,有的log还是一次性的,错过了抓log的机会就比较难以复现了。发生未捕获异常后自动保存log信息
package com.example.exceptioncatchtest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.Thread.UncaughtExceptionHandler;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Application;
import android.os.Environment;
import android.util.Log;
public class AbstractApplication extends Application {
private static String packageName;
private static String TAG;
public AbstractApplication() {
}
@Override
public void onCreate() {
super.onCreate();
TAG = getClass().getSimpleName();
packageName = getPackageName();
Thread.setDefaultUncaughtExceptionHandler(new CrashHandler());
}
class CrashHandler implements UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
ex.printStackTrace(printWriter);
printWriter.close();
saveLog(stringWriter.toString());
android.os.Process.killProcess(android.os.Process.myPid());
}
}
/**
* 保存异常信息到文件中 StorageDirectory+/DebugLogs/packageName + getTime() + ".txt"
*
* @param exception
*/
private void saveLog(String exception) {
File path = Environment.getExternalStorageDirectory();
StringBuilder sb = new StringBuilder();
sb.append(path.getAbsolutePath());
sb.append("/DebugLogs/");
File dirFile = new File(sb.toString());
Log.d(packageName, "directory name: " + dirFile.getName());
if (!dirFile.exists()) {
dirFile.mkdirs();
}
deleteLogs(dirFile);
File file = new File(dirFile, packageName + getTime("yyyy-MM-dd-hh-mm-ss") + ".txt");
Log.d(packageName, "file name: " + file.getName());
if (!file.exists()) {
try {
file.createNewFile();
FileOutputStream out = new FileOutputStream(file);
out.write(exception.getBytes());
out.close();
} catch (IOException e) {
Log.e(packageName, "IOException" + e.getMessage());
}
}
}
/**
* 删除file目录下的非今天log,节省空间
*
* @param file
*/
private void deleteLogs(File file) {
String key = getTime("yyyy-MM-dd");
File[] files = file.listFiles();
for (File f : files) {
if (!f.getName().contains(key)) {
f.delete();
}
}
}
/**
* 根据输入格式返回时间数据
*
* @param type
* @return
*/
private String getTime(String type) {
SimpleDateFormat format = new SimpleDateFormat(type);
return format.format(new Date());
}
}