Android:捕获错误“很遗憾,'应用程序'已停止工作”

弗里茨

是否可以捕获/处理此错误并显示不同的对话框消息?像:对不起,“ AppName”已停止工作

弹簧断路器

是的,可以自定义Android Force关闭消息。请执行以下操作,

创建自己的异常处理程序类

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Thread.setDefaultUncaughtExceptionHandler(new UnCaughtException(MainActivity.this));

        int y = 5/0;
    }

这是捕获“强制关闭”对话框并显示我们的CustomDialog的类。

UnCaughtException.java

 import java.io.File;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.io.Writer;
 import java.lang.Thread.UncaughtExceptionHandler;
 import java.util.Date;
 import java.util.Locale;

 import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.os.Environment;
  import android.os.Looper;
 import android.os.StatFs;
 import android.util.Log;

 public class UnCaughtException implements UncaughtExceptionHandler {


private Context context;
private static Context context1;

public UnCaughtException(Context ctx) {
    context = ctx;
    context1 = ctx;
}

private StatFs getStatFs() {
   File path = Environment.getDataDirectory();
    return new StatFs(path.getPath());
}

private long getAvailableInternalMemorySize(StatFs stat) {
    long blockSize = stat.getBlockSize();
    long availableBlocks = stat.getAvailableBlocks();
    return availableBlocks * blockSize;
}

private long getTotalInternalMemorySize(StatFs stat) {
    long blockSize = stat.getBlockSize();
    long totalBlocks = stat.getBlockCount();
    return totalBlocks * blockSize;
}

private void addInformation(StringBuilder message) {
    message.append("Locale: ").append(Locale.getDefault()).append('\n');
    try {
        PackageManager pm = context.getPackageManager();
        PackageInfo pi;
        pi = pm.getPackageInfo(context.getPackageName(), 0);
        message.append("Version: ").append(pi.versionName).append('\n');
        message.append("Package: ").append(pi.packageName).append('\n');
    } catch (Exception e) {
        Log.e("CustomExceptionHandler", "Error", e);
        message.append("Could not get Version information for ").append(
                context.getPackageName());
    }
    message.append("Phone Model ").append(android.os.Build.MODEL)
            .append('\n');
    message.append("Android Version : ")
            .append(android.os.Build.VERSION.RELEASE).append('\n');
    message.append("Board: ").append(android.os.Build.BOARD).append('\n');
    message.append("Brand: ").append(android.os.Build.BRAND).append('\n');
    message.append("Device: ").append(android.os.Build.DEVICE).append('\n');
    message.append("Host: ").append(android.os.Build.HOST).append('\n');
    message.append("ID: ").append(android.os.Build.ID).append('\n');
    message.append("Model: ").append(android.os.Build.MODEL).append('\n');
    message.append("Product: ").append(android.os.Build.PRODUCT)
            .append('\n');
    message.append("Type: ").append(android.os.Build.TYPE).append('\n');
    StatFs stat = getStatFs();
    message.append("Total Internal memory: ")
            .append(getTotalInternalMemorySize(stat)).append('\n');
    message.append("Available Internal memory: ")
            .append(getAvailableInternalMemorySize(stat)).append('\n');
}

public void uncaughtException(Thread t, Throwable e) {
    try {
        StringBuilder report = new StringBuilder();
        Date curDate = new Date();
        report.append("Error Report collected on : ")
                .append(curDate.toString()).append('\n').append('\n');
        report.append("Informations :").append('\n');
        addInformation(report);
        report.append('\n').append('\n');
        report.append("Stack:\n");
        final Writer result = new StringWriter();
        final PrintWriter printWriter = new PrintWriter(result);
        e.printStackTrace(printWriter);
        report.append(result.toString());
        printWriter.close();
        report.append('\n');
        report.append("**** End of current Report ***");
        Log.e(UnCaughtException.class.getName(),
                "Error while sendErrorMail" + report);
        sendErrorMail(report);
    } catch (Throwable ignore) {
        Log.e(UnCaughtException.class.getName(),
                "Error while sending error e-mail", ignore);
    }
}


public void sendErrorMail(final StringBuilder errorContent) {
    final AlertDialog.Builder builder = new AlertDialog.Builder(context);
    new Thread() {
        @Override
        public void run() {
            Looper.prepare();
            builder.setTitle("Sorry...!");
            builder.create();
            builder.setNegativeButton("Cancel",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            System.exit(0);
                        }
                    });
            builder.setPositiveButton("Report",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            Intent sendIntent = new Intent(
                                    Intent.ACTION_SEND);
                            String subject = "Your App crashed! Fix it!";
                            StringBuilder body = new StringBuilder("Yoddle");
                            body.append('\n').append('\n');
                            body.append(errorContent).append('\n')
                                    .append('\n');
                            // sendIntent.setType("text/plain");
                            sendIntent.setType("message/rfc822");
                            sendIntent.putExtra(Intent.EXTRA_EMAIL,
                                    new String[] { "[email protected]" });
                            sendIntent.putExtra(Intent.EXTRA_TEXT,
                                    body.toString());
                            sendIntent.putExtra(Intent.EXTRA_SUBJECT,
                                    subject);
                            sendIntent.setType("message/rfc822");
                            context1.startActivity(sendIntent);
                            System.exit(0);
                        }
                    });
            builder.setMessage("Oops,Your application has crashed");
            builder.show();
            Looper.loop();
        }
    }.start();
}
}

取自以下教程

http://www.coderzheaven.com/2013/03/13/customize-force-close-dialog-android/

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

不幸的是,该应用程序在Android中已停止工作错误

来自分类Dev

是否可以从“不幸的应用程序已停止工作”错误中获取额外信息?

来自分类Dev

应用程序已停止工作

来自分类Dev

应用已停止工作,但日志未显示错误?

来自分类Dev

单击按钮时,Android Studio 中的应用程序崩溃。显示应用名称已停止工作

来自分类Dev

Xamarin.Forms在Android上“应用已停止工作”

来自分类Dev

Android Studio:如何调试在模拟器中显示错误“不幸的是,应用程序已停止工作”的Android应用程序?

来自分类Dev

Xamarin Android应用程序不幸地停止工作

来自分类Dev

单击TextView后,Android应用程序停止工作

来自分类Dev

android-地图应用程序停止工作

来自分类Dev

Android Studio错误:很遗憾,我自己的应用已停止

来自分类Dev

不幸的是,应用程序已停止工作?

来自分类Dev

适用于Android的Google Maps API 2“很遗憾,应用程序已停止。”

来自分类Dev

适用于Android的Google Maps API 2“很遗憾,应用程序已停止。”

来自分类Dev

我的第一个应用已停止工作错误

来自分类Dev

我的C ++程序获取“ ... .exe已停止工作” Windows 7错误

来自分类Dev

“很遗憾,我的Android应用已停止”

来自分类Dev

csc.exe停止工作,导致“ /”应用程序中的服务器错误

来自分类Dev

Android虚拟设备中的应用程序继续停止工作

来自分类Dev

转到使用Java创建布局后,Android应用程序停止工作

来自分类Dev

不幸的是,应用已停止工作?

来自分类Dev

不幸的是我的应用已停止工作

来自分类Dev

不幸的是,该应用已停止工作

来自分类Dev

C ++:程序已停止工作

来自分类Dev

Android USB调试已停止工作

来自分类Dev

Android USB调试已停止工作

来自分类Dev

不幸的是停止了工作的Android应用程序

来自分类Dev

Android Eclipse SignUp页面应用程序已停止错误

来自分类Dev

“不幸的是,应用程序已停止错误” Android Studio

Related 相关文章

  1. 1

    不幸的是,该应用程序在Android中已停止工作错误

  2. 2

    是否可以从“不幸的应用程序已停止工作”错误中获取额外信息?

  3. 3

    应用程序已停止工作

  4. 4

    应用已停止工作,但日志未显示错误?

  5. 5

    单击按钮时,Android Studio 中的应用程序崩溃。显示应用名称已停止工作

  6. 6

    Xamarin.Forms在Android上“应用已停止工作”

  7. 7

    Android Studio:如何调试在模拟器中显示错误“不幸的是,应用程序已停止工作”的Android应用程序?

  8. 8

    Xamarin Android应用程序不幸地停止工作

  9. 9

    单击TextView后,Android应用程序停止工作

  10. 10

    android-地图应用程序停止工作

  11. 11

    Android Studio错误:很遗憾,我自己的应用已停止

  12. 12

    不幸的是,应用程序已停止工作?

  13. 13

    适用于Android的Google Maps API 2“很遗憾,应用程序已停止。”

  14. 14

    适用于Android的Google Maps API 2“很遗憾,应用程序已停止。”

  15. 15

    我的第一个应用已停止工作错误

  16. 16

    我的C ++程序获取“ ... .exe已停止工作” Windows 7错误

  17. 17

    “很遗憾,我的Android应用已停止”

  18. 18

    csc.exe停止工作,导致“ /”应用程序中的服务器错误

  19. 19

    Android虚拟设备中的应用程序继续停止工作

  20. 20

    转到使用Java创建布局后,Android应用程序停止工作

  21. 21

    不幸的是,应用已停止工作?

  22. 22

    不幸的是我的应用已停止工作

  23. 23

    不幸的是,该应用已停止工作

  24. 24

    C ++:程序已停止工作

  25. 25

    Android USB调试已停止工作

  26. 26

    Android USB调试已停止工作

  27. 27

    不幸的是停止了工作的Android应用程序

  28. 28

    Android Eclipse SignUp页面应用程序已停止错误

  29. 29

    “不幸的是,应用程序已停止错误” Android Studio

热门标签

归档