Как я могу использовать ACRA из живых обоев?

У меня есть живые обои, которые время от времени падают, и я хотел бы воспользоваться преимуществами интеграции ACRA (http://code.google.com/p/acra/) для создания и сбора отчетов о сбоях в электронной таблице Google.

Однако я просто не мог интегрировать ACRA в свои живые обои. Вот что я пробовал до сих пор:

  1. Следовали основному руководству по настройке (http://code.google.com/p/acra/wiki/BasicSetup)
  2. Инициализирован ACRA с ACRA.init(WallpaperService.getApplication()); в WallpaperService.onCreate()
  3. Аннотированный WallpaperService с @ReportsCrashes(formKey = "dFhXY3Y4N2NXXXXXXXXwM1g3Z1FZUVE6MQ", mode = ReportingInteractionMode.TOAST, forceCloseDialogAfterToast = false, resToastText = R.string.crash_text_toast)

Когда я создаю и развертываю приложение, оно просто падает, как и раньше, и ACRA не включается.

Кажется, проблема связана с тем, что ACRA ожидает, что подкласс Application будет аннотирован.

Я компилирую свое приложение для обновления Android 2.1 и использую последнюю версию ACRA (4.23 на данный момент) и работаю на телефоне с Android 2.3.4.

Любая помощь более чем приветствуется!


person Lennart Rolland    schedule 08.11.2011    source источник
comment
У меня уже есть решение, но, поскольку я новичок в stackoverflow, мне не разрешено отправлять свое решение еще через 5 часов! :-/ Ну что ж. Вот ссылка на мой минимальный патч, который заставляет его работать: groups.google .com/group/acra-discuss/browse_thread/thread/   -  person Lennart Rolland    schedule 08.11.2011


Ответы (2)


Я упустил основной факт, что живые обои Android могут иметь необязательный класс, расширяющий android.app.Application, на который ссылается его AndroidManifest.xml.

Использование этого класса — лучший способ включить ACRA в ваши обои, поскольку он позволяет запускать ACRA в самый ранний возможный момент жизненного цикла ваших обоев.

Просто создайте класс, расширяющий android.app.Application в вашем проекте, и назовите его из атрибута android:name в элементе приложения вашего манифеста. Пример.

В вашем манифесте:

<application
 android:debuggable="true"
 android:icon="@drawable/icon"
 android:label="@string/app_name"
 android:name=".MyApplication" >

В MyApplication.java:

package com.mycompany.myapp;

import org.acra.ACRA;
import org.acra.ReportingInteractionMode;
import org.acra.annotation.ReportsCrashes;

@ReportsCrashes(resDialogIcon = R.drawable.icon, resToastText = R.string.crash_text_toast, formKey = "dFhXY3YXXXXXXXXXXXXXXZUVE6MQ", mode = ReportingInteractionMode.TOAST, forceCloseDialogAfterToast = false)
public class MyApplication extends android.app.Application {
    @Override
    public void onCreate() {
        ACRA.init(this);
        super.onCreate();
    }
}
person Lennart Rolland    schedule 17.11.2011

Я исследовал это дальше и обнаружил, что ACRA версии 4.2.3 не поддерживает живые обои. Решил пропатчить, чтобы добавить эту поддержку. Исправление можно найти в этой теме.

Вот небольшое резюме:

  1. Исправьте ACRA для поддержки второго аргумента в init() в соответствии с потоком в ссылке выше.
  2. Аннотируйте класс WallpaperService так же, как вы бы аннотировали класс Application согласно документации ACRA.
  3. Инициализируйте ACRA с новой функцией init() в методе onCreate() сервиса WallpaperService следующим образом: ACRA.init(getApplication(),this);

Я еще не всесторонне протестировал это, и может быть много ошибок. Но, по крайней мере, это начало. Теперь я получаю тост и некоторые данные в электронной таблице вместо надоедливого всплывающего уведомления о принудительном выходе.

person Lennart Rolland    schedule 09.11.2011