获取崩溃日志并将其作为电子邮件发送

时间:2013-12-05 11:55:45

标签: android email crash

从我的搜索中,我得到了以下代码来获取崩溃日志。

try {
      Process process = Runtime.getRuntime().exec("logcat -d");
      BufferedReader bufferedReader = new BufferedReader(
      new InputStreamReader(process.getInputStream()));

      StringBuilder log=new StringBuilder();
      String line;
      while ((line = bufferedReader.readLine()) != null) 
      {
        log.append(line);
      }

但是我在哪里添加此代码,以便每当我的应用程序崩溃时都应该收到崩溃报告。

此外,我想通过电子邮件发送或发送到服务器,但在应用程序崩溃后,如何调用该动作来发送电子邮件/ HTTP帖子方法。

请提前通知并表示感谢。

5 个答案:

答案 0 :(得分:18)

处理崩溃日志的最佳方法是创建UncaughtExceptionHandler并根据您的要求进行处理。创建一个BaseActivity类并使用它扩展所有活动,并将此代码放在BaseActivity类中。

private Thread.UncaughtExceptionHandler handleAppCrash = 
                                         new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread thread, Throwable ex) {
            Log.e("error", ex.toString());
            //send email here
        }
    };

然后使用

启用onCreate() BaseActivity方法

Thread.setDefaultUncaughtExceptionHandler(handleAppCrash);

所以,现在只要你的应用程序uncaughtException()发生崩溃就会被调用,你将不得不相应地处理崩溃。

答案 1 :(得分:2)

我建议你使用ARCA https://github.com/ACRA/acra

在build.gradle中包含arca - 它使用自10月29日起的apache 2.0许可证。

compile 'ch.acra:acra:4.9.0' //TODO:  Apache 2.0 license https://github.com/ACRA/acra

在扩展应用程序的类中,将其放在"类"之上。声明。

@ReportsCrashes(mailTo = "someone@somewhere.com",
        customReportContent = { ReportField.APP_VERSION_CODE, ReportField.APP_VERSION_NAME, ReportField.ANDROID_VERSION, ReportField.PHONE_MODEL, ReportField.CUSTOM_DATA, ReportField.STACK_TRACE, ReportField.LOGCAT },
        mode = ReportingInteractionMode.TOAST,
        resToastText = R.string.resToastText) //you get to define resToastText
public class MyApplication extends Application {

然后从同一个Application类重写以下方法,如下所示:

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);

    // The following line triggers the initialization of ACRA
    ACRA.init(this);
}

答案 2 :(得分:0)

看看这个项目。 LINK 将堆栈跟踪发布到您的服务器是一个很小的项目,因此您可以将它们放在自己的服务器上。

答案 3 :(得分:0)

我还没试过,但看着它会给出当前的日志,而不是崩溃报告 参考How do I obtain crash-data from my Android application?

答案 4 :(得分:0)

在我的情况下,我有一个我无法在手机上复制的错误我只想从一个单独的测试人员那里找回堆栈跟踪。我能找到的最简单的方法是将它复制到用户剪贴板中并要求他们将代码发送给我:

import android.app.Application;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;

import java.io.PrintWriter;
import java.io.StringWriter;

/**
 * Copies the stack trace the exception that is causing your application to crash into the clip board.
 * Ask your testers to paste it into an email / text message to you.
 *
 * @author Stuart Clark
 */

public class CrashDebugApplication extends Application {
  @Override
  public void onCreate() {
    super.onCreate();

    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
      @Override
      public void uncaughtException(Thread thread, Throwable e) {
        // Get the stack trace.
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        e.printStackTrace(pw);

        // Add it to the clip board and close the app
        ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        ClipData clip = ClipData.newPlainText("Stack trace", sw.toString());
        clipboard.setPrimaryClip(clip);
        System.exit(1);
      }
    });

  }
}

然后在Android Manifesto中设置android:name属性,即

<application android:icon="@mipmap/ic_launcher" android:name=".CrashDebugApplication">