Вопрос по android – ACRA с android: как выполнить код до сообщения о сбое

3

Я использую ACRA с моим приложением для Android. Мой вопрос: когда происходит сбой, как я могу убедиться, что я выполнил некоторый код, прежде чем сообщать о сбое. Я имею в виду, что я хотел бы добавить некоторые пользовательские переменные, когда происходит сбой, чтобы я знал, в каком состоянии было приложение?

Пожалуйста помоги

Спасибо

Ваш Ответ

3   ответа
0

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);
    }
}
2

Вот, Это может быть просто обертка вокруг существующего отправителя, пересылающая туда функцию отправки.

Внутри кода отправителя вы можете предпринять любые специальные действия перед отправкой отчета.

Идеально! Спасибо Snake
1

что мне помогло, используя 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.

Благодарю. Это было потрясающе!

Похожие вопросы