Android 崩溃后打开AlertDialog

Android 崩溃后打开AlertDialog,android,exception-handling,android-alertdialog,crash-reports,Android,Exception Handling,Android Alertdialog,Crash Reports,我制作了一个抽象片段,其他片段扩展如下: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Thread.UncaughtExceptionHandler oldHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaug

我制作了一个抽象片段,其他片段扩展如下:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final Thread.UncaughtExceptionHandler oldHandler = Thread.getDefaultUncaughtExceptionHandler();

    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
            Writer writer = new StringWriter();
            PrintWriter printWriter = new PrintWriter(writer);
            paramThrowable.printStackTrace(printWriter);
            String s = writer.toString();
            Utils.logToFile(s);
            emailReport(s); ///<<<<<

            if (oldHandler != null) oldHandler.uncaughtException(paramThread, paramThrowable); //Delegates to Android's error handling
            else System.exit(2); //Prevents the service/app from freezing
        }
    });

}
我希望在操作系统控制之前显示警报对话框,以便用户可以打开他的电子邮件客户端向我发送崩溃消息,或者取消并关闭应用程序。调试在创建警报对话框的那一行停止,但在那之后,它跳到此方法的末尾,并从那里返回到旧的处理程序

<>这可能是另一个例外,但我不确定,我不能抓住它,因为我已经在处理当前异常的中间了。代码中有什么错误吗?如果没有,我如何查看在尝试创建警报对话框时发生的情况

更新:我将处理行放在对话框的setNegativeButton内,认为它已显示但立即关闭,但没有帮助:

        if (oldHandler != null) oldHandler.uncaughtException(paramThread, paramThrowable); //Delegates to Android's error handling
        else System.exit(2); //Prevents the service/app from freezing
    }

我想问题是,您立即调用默认处理程序,该处理程序在内部调用exit,因此您的对话框永远不会显示。因此,您的方法应该如下所示:

private void emailReport(final String report,
                         final Thread.UncaughtExceptionHandler oldHandler) {
    new AlertDialog.Builder(getActivity())
            .setTitle(getString(R.string.crash_report))
            .setMessage(getString(R.string.send_crash_report))
            .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    Intent intent = new Intent(Intent.ACTION_SENDTO);
                    intent.setData(Uri.parse("mailto:support@example.com"));
                    intent.setType("message/rfc822");
                    intent.putExtra(Intent.EXTRA_SUBJECT, "Crash Report");
                    intent.putExtra(Intent.EXTRA_TEXT, report);
                    Intent mailer = Intent.createChooser(intent, null);
                    startActivity(mailer);
                }
            })
            .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    if(oldHandler != null) {
                        //Delegates to Android's error handling
                        oldHandler.uncaughtException(paramThread, paramThrowable);
                    } else {
                         // Force to close the app now after handling the crash bug
                         System.exit(2);
                    }
                }
            })
            .setIcon(android.R.drawable.ic_dialog_alert)
            .show();
}
不要错过删除最后两行:

if (oldHandler != null) oldHandler.uncaughtException(paramThread, paramThrowable); //Delegates to Android's error handling
else System.exit(2); //Prevents the service/app from freezing

我宁愿不使用第三方组件,也不依赖它们。如果我能自己做一些事情(我需要一个非常简单的机制),我更喜欢这样做。我只是说他们是怎么做的。你应该试试这个想法,我并没有说你应该使用ACRA。因此,与其使用目前可能不存在的活动,不如创建一个新的活动并使用它。。。将尝试一下主要活动仍然存在,因此无法解释,我更新了上面的问题。我将处理程序行放在setNegativeButton中并解释了原因,但没有起到任何作用。好吧,我有点遗漏了这一部分。默认处理程序也调用exit。因此,您应该仅在负按钮处理中调用原始处理程序。如果有帮助的话,我会重写我的答案。你试过使用try-catch短语吗?你说得有道理。现在,它没有任何异常,所以它只是跳过它而没有实际执行,可能是因为它在崩溃时脱离了上下文?如果出现异常,应用程序将不会崩溃,而是进入catch子句。所以在catch子句中,您可以调用emailReport-method。我可以举个例子吗?我制作这个抽象片段是为了全局捕获异常。我不想尝试捕获所有代码:)唯一的问题是如何处理此警报对话框以及为什么不创建此对话框可能会有所帮助:
if (oldHandler != null) oldHandler.uncaughtException(paramThread, paramThrowable); //Delegates to Android's error handling
else System.exit(2); //Prevents the service/app from freezing