Android中错误异常日志管理(上传服务器)

public class MyApplication extends Application {

    private Stack<Activity> mActivities = new Stack<>();

    //当Activity create的时候放入到Stack
    public void addToStack(Activity activity) {

        mActivities.push(activity);
    }

    //当Activity 销毁的时候
    public void removeFromStack(Activity activity) {

        mActivities.remove(activity);
    }

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

        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread thread, final Throwable ex) {


                new Thread() {
                    @Override
                    public void run() {

                        //上传处理程序错误
                        procesError(ex);

                        Looper.prepare();
                        //出现错误弹窗提示
                        AlertDialog.Builder builder = new AlertDialog.Builder(/*getApplicationContext()*/mActivities.peek());//这里的上下文应该拿栈顶部的上下文
                        builder.setTitle("提示").setMessage("包抱歉,程序出错,我们将尽快修复错误,确定退出程序")
                                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {

                                        //1、其中一个界面出现错误应该退出整个应用程序而不是退出当前的界面
                                        while (!mActivities.empty()) {

                                            mActivities.pop().finish();
                                        }

                                        //当程序出现了不可预料的错误把错误捕获了在杀掉程序进程
                                        android.os.Process.killProcess(android.os.Process.myPid());
                                    }
                                }).setCancelable(false).create().show();

                        Looper.loop();
                    }
                }.start();


            }
        });

    }
    private void procesError(Throwable ex) {

        File file = saveReport(ex);
        uploadReport(file);
    }

    /*
        生成错误日志
     */
    private File saveReport(Throwable ex) {
        FileWriter writer = null;
        PrintWriter printWriter = null;
        try {
            File file = new File(getFilesDir(), "" + System.currentTimeMillis());
            writer = new FileWriter(file);
            printWriter = new PrintWriter(writer);
            writer.append("========Build==========\n");
            writer.append(String.format("BOARD\t%s\n", Build.BOARD));
            writer.append(String.format("BOOTLOADER\t%s\n", Build.BOOTLOADER));
            writer.append(String.format("BRAND\t%s\n", Build.BRAND));
            writer.append(String.format("CPU_ABI\t%s\n", Build.CPU_ABI));
            writer.append(String.format("CPU_ABI2\t%s\n", Build.CPU_ABI2));
            writer.append(String.format("DEVICE\t%s\n", Build.DEVICE));
            writer.append(String.format("DISPLAY\t%s\n", Build.DISPLAY));
            writer.append(String.format("FINGERPRINT\t%s\n", Build.FINGERPRINT));
            writer.append(String.format("HARDWARE\t%s\n", Build.HARDWARE));
            writer.append(String.format("HOST\t%s\n", Build.HOST));
            writer.append(String.format("ID\t%s\n", Build.ID));
            writer.append(String.format("MANUFACTURER\t%s\n", Build.MANUFACTURER));
            writer.append(String.format("MODEL\t%s\n", Build.MODEL));
            writer.append(String.format("SERIAL\t%s\n", Build.SERIAL));
            writer.append(String.format("PRODUCT\t%s\n", Build.PRODUCT));

            writer.append("========APP==========\n");
            try {
                PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
                int versionCode = packageInfo.versionCode;
                String versionName = packageInfo.versionName;
                writer.append(String.format("versionCode\t%s\n", versionCode));
                writer.append(String.format("versionName\t%s\n", versionName));

            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
            writer.append("========Exception==========\n");
            ex.printStackTrace(printWriter);
            return file;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } finally {
            if (printWriter != null) {
                printWriter.close();
            }
        }
    }

    /*

            上传错误日志
     */
    private void uploadReport(File report) {
        OutputStream os = null;
        FileInputStream fis = null;
        try {
            URL url = new URL(Constant.HOST + "/ErrorReportServlet");
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("POST");
            urlConnection.setDoOutput(true);
            os = urlConnection.getOutputStream();
            fis = new FileInputStream(report);
            byte[] buf = new byte[1024 * 8];
            int len = 0;
            while ((len = fis.read(buf)) != -1) {
                os.write(buf, 0, len);
            }
            int responseCode = urlConnection.getResponseCode();
            Log.d("uploadReport", "" + responseCode);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close(os);
            close(fis);
        }
    }

    public static void close(Closeable closeable) {
        if (closeable != null) {
            try {
                closeable.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值