public class CaptureCrashException implements UncaughtExceptionHandler {
/** 系统默认的UncaughtException处理类 */private UncaughtExceptionHandler mDefaultHandler;
/** CaptureCrashException实例 */private static CaptureCrashExceptioninstance;
/** 程序的Context对象 */private Context mContext;
/** 使用Properties来保存设备的信息和错误堆栈信息 */
private static final String VERSION_NAME="versionName";
private static final String VERSION_CODE="versionCode";
/** 保证只有一个CaptureCrashException实例 */
privateCaptureCrashException() {}
/** 获取CrashHandler实例 ,单例模式 */
public static CaptureCrashException getInstance() {
if(instance==null) {instance=new CaptureCrashException();}returninstance;}
/*** 初始化,注册Context对象, 获取系统默认的UncaughtException处理器,
* 设置该CaptureCrashException为程序的默认处理器*/
public voidinit(Context ctx) {
mContext= ctx;
mDefaultHandler= Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
}
/**
* 当UncaughtException发生时会转入该函数来处理
*/
@Override
public void uncaughtException(Thread thread, Throwable ex) {
if(!handleException(ex) &&mDefaultHandler!=null) {
// 如果用户没有处理则让系统默认的异常处理器来处理
mDefaultHandler.uncaughtException(thread, ex);
}else{
newThread() {
@Override
public voidrun() {
SystemClock.sleep(2000);
MyApplication.getInstance().removeAll();
}
}.start();
}
}
/**
* 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. 开发者可以根据自己的情况来自定义异常处理逻辑
*
*@paramex
*@returntrue:如果处理了该异常信息;否则返回false
*/
private booleanhandleException(Throwable ex) {
if(ex ==null) {
return true;
}
// 输出到日志
StringWriter sw =newStringWriter();
PrintWriter pw =newPrintWriter(sw);
ex.printStackTrace(pw);
MyLogger.systemlLog().e(sw.toString());
// 保存异常日志到sd卡
saveErrorLog(ex);
// 收集设备信息
saveDeviceInfo();
// 发送异常信息到服务器
// 使用Toast友好提示
newThread() {
@Override
public voidrun() {
Looper.prepare();
ToolAlert.showCustomShortToast("程序崩溃了, 重新打开试试!");
Looper.loop();
}
}.start();
return true;
}
/**
* 保存异常日志
*
*@paramex
*/
public voidsaveErrorLog(Throwable ex) {
String errorlog ="";
String savePath ="";
String logFilePath ="";
FileWriter fw =null;
PrintWriter pw =null;
try{
// 判断是否挂载了SD卡
String storageState = Environment.getExternalStorageState();
if(storageState.equals(Environment.MEDIA_MOUNTED)) {
savePath = ConstantManager.logPath;
File file =newFile(savePath);
if(!file.exists()) {
file.mkdirs();
}
errorlog ="errorlog "
+ ToolDateTime.getdateTime()
+".txt";
logFilePath = savePath + errorlog;
}
// 没有挂载SD卡, 无法写文件
if(logFilePath =="") {
return;
}
File logFile =newFile(logFilePath);
if(!logFile.exists()) {
logFile.createNewFile();
}
fw =newFileWriter(logFile,true);
pw =newPrintWriter(fw);
ex.printStackTrace(pw);
pw.close();
fw.close();
}catch(Exception e) {
e.printStackTrace();
}finally{
if(pw !=null) {
pw.close();
}
if(fw !=null) {
try{
fw.close();
}catch(IOException e) {
}
}
}
}
/**
* 保存设备信息
*
*@param
*/
public voidsaveDeviceInfo() {
String errorlog ="";
String savePath ="";
String logFilePath ="";
FileWriter fw =null;
PrintWriter pw =null;
try{// 判断是否挂载了SD卡
String storageState = Environment.getExternalStorageState();
if(storageState.equals(Environment.MEDIA_MOUNTED)) {
savePath = ConstantManager.logPath;
File file =newFile(savePath);
if(!file.exists()) {
file.mkdirs();
}
errorlog ="deviceInfo "
+ ToolDateTime.getdateTime()
+".txt";
logFilePath = savePath + errorlog;
}
// 没有挂载SD卡, 无法写文件
if(logFilePath =="") {
return;
}
File logFile =newFile(logFilePath);
if(!logFile.exists()) {
logFile.createNewFile();
}
fw =newFileWriter(logFile,true);
pw =newPrintWriter(fw);
// 版本号
PackageManager pm =mContext.getPackageManager();
PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(),
PackageManager.GET_ACTIVITIES);
if(pi !=null) {
pw.println(VERSION_NAME+"="+ pi.versionName==null?"not set"
: pi.versionName);
pw.println(VERSION_CODE+"="+ pi.versionCode);
}
// 使用反射来收集设备信息.在Build类中包含各种设备信息,
// 例如: 系统版本号,设备生产商 等帮助调试程序的有用信息
Field[] fields = Build.class.getDeclaredFields();
for(Field field : fields) {
field.setAccessible(true);
pw.println(field.getName() +"="+ field.get(null));
}
pw.close();
fw.close();
}catch(Exception e) {
e.printStackTrace();
}finally{
if(pw !=null) {
pw.close();
}
if(fw !=null) {
try{
fw.close();
}catch(IOException e) {
}
}
}
}
/**
* 清空错误日志缓存目录
*/
public voidclearSavePathFile() {
File file =newFile(ConstantManager.logPath);
ToolFile.deleteFileOrDir(file);
}
}
在LauncherAcivity oncrease 中初始化
// 开启线程, 进行初始化操作
newThread() {
@Override
public voidrun() {
// 初始化CaptureCrashException
CaptureCrashException.getInstance().init(MyApplication.getMyApplication());
//"初始化完成"
initCacheDirectory();
}
}.start();
private void initCacheDirectory(){
File logPath =newFile(ConstantManager.logPath);
if(!logPath.isDirectory() || !logPath.exists()) {
logPath.mkdir();
}
}
网友评论