UPDATE: Bitte sehen Sie unten die "akzeptierte" Lösung
Wenn meine App eine nicht behandelte Ausnahme erstellt, anstatt sie einfach zu beenden, möchte ich dem Benutzer zunächst die Möglichkeit geben, eine Protokolldatei zu senden. Mir ist klar, dass es riskant ist, nach einer zufälligen Ausnahme mehr Arbeit zu erledigen, aber das Schlimmste ist, dass die App abstürzt und die Protokolldatei nicht gesendet wird. Das wird schwieriger als ich erwartet hatte :)
Was funktioniert: (1) Abfangen der nicht erfassten Ausnahme, (2) Extrahieren von Protokollinformationen und Schreiben in eine Datei.
Was noch nicht funktioniert: (3) Starten einer Aktivität zum Senden von E-Mails. Letztendlich werde ich noch eine weitere Aktivität haben, um den Benutzer um Erlaubnis zu bitten. Wenn die E-Mail-Aktivität funktioniert, erwarte ich für den anderen keine großen Probleme.
Der Kern des Problems besteht darin, dass die nicht behandelte Ausnahme in meiner Anwendungsklasse abgefangen wird. Da dies keine Aktivität ist, ist es nicht offensichtlich, wie eine Aktivität mit Intent.ACTION_SEND gestartet werden soll. Das heißt, normalerweise wird zum Starten einer Aktivität startActivity aufgerufen und mit onActivityResult fortgesetzt. Diese Methoden werden von Activity, jedoch nicht von Application unterstützt.
Irgendwelche Vorschläge dazu?
Hier sind einige Code-Schnipsel als Starthilfe:
public class MyApplication extends Application
{
defaultUncaughtHandler = Thread.getDefaultUncaughtExceptionHandler();
public void onCreate ()
{
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException (Thread thread, Throwable e)
{
handleUncaughtException (thread, e);
}
});
}
private void handleUncaughtException (Thread thread, Throwable e)
{
String fullFileName = extractLogToFile(); // code not shown
// The following shows what I'd like, though it won't work like this.
Intent intent = new Intent (Intent.ACTION_SEND);
intent.setType ("plain/text");
intent.putExtra (Intent.EXTRA_EMAIL, new String[] {"[email protected]"});
intent.putExtra (Intent.EXTRA_SUBJECT, "log file");
intent.putExtra (Intent.EXTRA_STREAM, Uri.parse ("file://" + fullFileName));
startActivityForResult (intent, ACTIVITY_REQUEST_SEND_LOG);
}
public void onActivityResult (int requestCode, int resultCode, Intent data)
{
if (requestCode == ACTIVITY_REQUEST_SEND_LOG)
System.exit(1);
}
}
quelle
Antworten:
Hier ist die vollständige Lösung (fast: Ich habe das Layout der Benutzeroberfläche und die Handhabung der Schaltflächen weggelassen) - abgeleitet aus vielen Experimenten und verschiedenen Beiträgen von anderen, die sich auf Probleme bezogen, die auf dem Weg auftauchten.
Es gibt eine Reihe von Dingen, die Sie tun müssen:
Hier sind die Details:
(1 & 2) Behandeln Sie uncaughtException und starten Sie das Senden der Protokollaktivität:
(3) Protokoll extrahieren (ich habe dies in meine SendLog-Aktivität eingefügt):
(4) Starten Sie eine E-Mail-App (auch in meiner SendLog-Aktivität):
(3 & 4) So sieht SendLog aus (Sie müssen jedoch die Benutzeroberfläche hinzufügen):
(5) Manifest:
(6) Setup Proguard:
Ändern Sie in project.properties die Konfigurationszeile. Sie müssen angeben , „optimieren“ oder Proguard wird nicht entfernen Log.v () und Log.d () Anrufe.
Fügen Sie in proguard-project.txt Folgendes hinzu. Dies weist Proguard an, anzunehmen, dass Log.v und Log.d keine Nebenwirkungen haben (obwohl dies der Fall ist, da sie in die Protokolle schreiben) und daher während der Optimierung entfernt werden können:
Das ist es! Wenn Sie Verbesserungsvorschläge haben, lassen Sie es mich bitte wissen und ich kann dies aktualisieren.
quelle
Heutzutage gibt es viele Crash-Reprting-Tools, die dies problemlos tun.
Crashlytics - Ein kostenloses Crash-Reporting-Tool, das Ihnen grundlegende Berichte bietet. Vorteile: Kostenlos
Gryphonet - Ein erweitertes Berichterstellungstool, für das eine Gebühr erforderlich ist. Vorteile: Einfache Wiederherstellung von Abstürzen, ANRs, Langsamkeit ...
Wenn Sie ein privater Entwickler sind, würde ich Crashlytics vorschlagen, aber wenn es eine große Organisation ist, würde ich mich für Gryphonet entscheiden.
Viel Glück!
quelle
Versuchen Sie stattdessen, ACRA zu verwenden. Hiermit werden der Stack-Trace sowie unzählige andere nützliche Debug-Informationen an Ihr Backend oder an das von Ihnen eingerichtete Google Text & Tabellen-Dokument gesendet.
https://github.com/ACRA/acra
quelle
Die Antwort von @ PeriHartman funktioniert gut, wenn der UI-Thread eine nicht erfasste Ausnahme auslöst. Ich habe einige Verbesserungen vorgenommen, wenn die nicht erfasste Ausnahme von einem Nicht-UI-Thread ausgelöst wird.
quelle
Schön erklärt. Aber eine Beobachtung hier, anstatt mit File Writer und Streaming in eine Datei zu schreiben, habe ich die Option logcat -f direkt verwendet. Hier ist der Code
Dies hat mir geholfen, die neuesten Pufferinformationen zu löschen. Die Verwendung von Datei-Streaming gab mir ein Problem, dass die neuesten Protokolle nicht aus dem Puffer gelöscht wurden. Trotzdem war dies eine sehr hilfreiche Anleitung. Danke dir.
quelle
Umgang mit nicht erfassten Ausnahmen: Wie @gilm erklärt hat, tun Sie dies einfach (kotlin):
Ich hoffe es hilft, es hat bei mir funktioniert .. (: y). In meinem Fall habe ich die Bibliothek 'com.microsoft.appcenter.crashes.Crashes' für die Fehlerverfolgung verwendet.
quelle
Sie können die nicht erfassten Ausnahmen mit FireCrasher behandeln Bibliothek behandeln und eine Wiederherstellung durchführen.
Weitere Informationen zur Bibliothek finden Sie in diesem Medium-Artikel
quelle