Вопрос по android – ACRA с android: как выполнить код до сообщения о сбое
Я использую ACRA с моим приложением для Android. Мой вопрос: когда происходит сбой, как я могу убедиться, что я выполнил некоторый код, прежде чем сообщать о сбое. Я имею в виду, что я хотел бы добавить некоторые пользовательские переменные, когда происходит сбой, чтобы я знал, в каком состоянии было приложение?
Пожалуйста помоги
Спасибо
er (...);
Вы можете установить свой собственный обработчик необработанных исключений, а затем вызвать ACRA для генерации отчета:
public class My_Exception_Interceptor implements Thread.UncaughtExceptionHandler {
/**
* Sets up to catch an exception.
* Call this after initializing ACRA.
*/
public void setUpFatalExceptionHandling() {
Thread.setDefaultUncaughtExceptionHandler(this);
}
/**
* Called by the JVM on an uncaught exception.
* @param t - the thread
* @param e - the throwable
*/
@Override
public void uncaughtException(@Nullable Thread t, @NonNull Throwable e) {
...your code...
ACRA.getErrorReporter().handleException(e, true);
}
}
что мне помогло, используя ACRA 4.5.0 с бэкэндом HttpSender. Я использую Acralyzer на Cloudant.
Оригинальный код:
@ReportsCrashes(
mode = ReportingInteractionMode.DIALOG,
resDialogText = R.string.crash_dialog_text,
resDialogCommentPrompt = R.string.crash_dialog_comment_prompt,
formUri = "https://kpc.cloudant.com/acra-openconnect/_design/acra-storage/_update/report",
formUriBasicAuthLogin="[restricted reporter login]",
formUriBasicAuthPassword="[restricted reporter password]",
reportType = org.acra.sender.HttpSender.Type.JSON,
httpMethod = org.acra.sender.HttpSender.Method.PUT,
formKey = ""
)
public class Application extends android.app.Application {
public void onCreate() {
super.onCreate();
ACRA.init(this);
Мое приложение хранит кольцевой буфер в памяти с сообщениями журнала. Это не записывается на диск, и я не особо хотел выводить его в строку и вызывать putCustomData () каждый раз, когда добавляется запись. Поэтому вместо этого я называю мой статический "дампер" Метод VPNLog.dumpLast (), чтобы изменить отчет непосредственно перед запуском HttpSender.send (). Новый код выглядит так:
@ReportsCrashes(
mode = ReportingInteractionMode.DIALOG,
resDialogText = R.string.crash_dialog_text,
resDialogCommentPrompt = R.string.crash_dialog_comment_prompt,
formUri = "https://kpc.cloudant.com/acra-openconnect/_design/acra-storage/_update/report",
formUriBasicAuthLogin="[restricted reporter login]",
formUriBasicAuthPassword="[restricted reporter password]",
// reportType and httpMethod are now defined below
formKey = ""
)
public class Application extends android.app.Application {
public void onCreate() {
super.onCreate();
ACRA.init(this);
ACRA.getErrorReporter().setReportSender(
new HttpSender(org.acra.sender.HttpSender.Method.PUT,
org.acra.sender.HttpSender.Type.JSON,
null) {
@Override
public void send(CrashReportData report) throws ReportSenderException {
report.put(ReportField.APPLICATION_LOG, VPNLog.dumpLast());
super.send(report);
}
});
Значение, которое я добавляю, является длинной (более 100 строк) строкой; Acralyzer правильно разбивает его на отдельные пронумерованные строки.
Другой вариант - заполнить ReportField.CUSTOM_DATA несколькими парами ключ / значение:
report.put(ReportField.CUSTOM_DATA, "key0=value0\nkey1=value1\n");
Acralyzer отобразит их в таблице HTML.