我已经在异常可能的地方实现了try catch。 android OS会抛出不同的其他异常[数据库异常,权限和其他异常]。我想将这些错误日志数据写入文件{只有我们的应用程序崩溃}。
我已经有了将给定数据写入文件的代码。我只是想知道如何从android进程获取错误日志。
如果发生任何崩溃,则该应用实例不可用。而且我不知道调用获取错误日志方法的确切位置。 就此而言。 请帮帮我。
答案 0 :(得分:0)
在您的应用程序类中,您可以初始化未处理的异常。回调方法将有一个throwable对象。从这个对象,我们可以获取崩溃日志数据,然后将相同的数据写入文件。
申请类:
public class MyApplication extends Application {
// uncaught exception handler variable
private UncaughtExceptionHandler defaultUEH;
public MyApplication() {
defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
// setup handler for uncaught exception
Thread.setDefaultUncaughtExceptionHandler(_unCaughtExceptionHandler);
}
// handler listener
private Thread.UncaughtExceptionHandler _unCaughtExceptionHandler = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
//To write the crash log data to file
AppUtil.getInstance().writeActivityLogToFile(true,
getErrorMessgae(ex));
// re-throw critical exception further to the os (important) to handle
defaultUEH.uncaughtException(thread, ex);
// System.exit(2);
}
};
/**
* To get the crash log message from throwable object
*
* @param e
* - throwable exception object
* @return - the crash log
*/
private String getErrorMessgae(Throwable e) {
StackTraceElement[] stackTrackElementArray = e.getStackTrace();
String crashLog = e.toString() + "\n\n";
crashLog += "--------- Stack trace ---------\n\n";
for (int i = 0; i < stackTrackElementArray.length; i++) {
crashLog += " " + stackTrackElementArray[i].toString() + "\n";
}
crashLog += "-------------------------------\n\n";
// If the exception was thrown in a background thread inside
// AsyncTask, then the actual exception can be found with getCause
crashLog += "--------- Cause ---------\n\n";
Throwable cause = e.getCause();
if (cause != null) {
crashLog += cause.toString() + "\n\n";
stackTrackElementArray = cause.getStackTrace();
for (int i = 0; i < stackTrackElementArray.length; i++) {
crashLog += " " + stackTrackElementArray[i].toString()
+ "\n";
}
}
crashLog += "-------------------------------\n\n";
return crashLog;
}
}
在清单中的以下标记中声明您的应用程序类:
<application
android:name=".application.FleetLOCApplication"
......>