Android程序崩溃异常处理之自动发送邮件

Posted 当富网络

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android程序崩溃异常处理之自动发送邮件相关的知识,希望对你有一定的参考价值。


from :  http://blog.csdn.net/android_cmos/article/details/51170916

    由于自己最近在跟一个项目,怎么说呢,项目功能真的是太多了,有时测试的MM忙不过来,有些隐形的bug没发现出来,但是我认为整体稳定性不够好,有时会Crash掉,这也给那些出去演示的市场部伙伴带来了不少的尴尬,虽然说现在属于测试阶段,但毕竟是上线的项目,用户体验不好,有时直接可能会杀死一个产品,而市场部的伙伴在演示的时候也不知道程序崩溃crash具体的操作流程,因为挂的那么突然 = = !,所以每次演示回来都会提出一些UI和程序挂掉的BUG,于是经常会出现如下的对话场景,然而作为程序猿傲娇的本能,“怎么可能?你能给我重现吗?......”,”并不能,但是balabala.....“,好吧,有问题总得改吧,但是他们也只能说出大概挂掉的地方,于是,你就得跟这个bug,看的你是一脸懵逼,根本不知道挂在哪里,好伐???!!!要是你能告诉我挂在那一行,是什么原因,我就至少可以有针对性的改啊。  ~  ~  

        好了,说了这么多,我相信应该有人和我同样的感觉吧,要是能记录下挂掉的行数和原因那该多好啊,于是我搜索了一下,还真有这样的,满足我的需求。它可以自动捕获程序异常,并记录存储在本地,最主要的是它可以自动上传到邮箱和发送到服务器,而且原作者对此方法进行了封装,只要进行简单的配置就可以使用了。

        这里我就直接给出作者的文章地址(文章地址在文末)吧,不过,我这里做一些小的补充,因为就算有了别人的框架,我按照他的说明还是没完全成功,并不能发送到邮箱,只能保存异常信息到本地sd卡上,作为并没接触过邮件发送的我,也不知道原因出在哪,我看到好多人在下载源代码的链接下面留言说不能用,以为真的不能用,但是我不甘心,于是我又搜索了一些资料,终于看出了一些端倪,原来是我的邮箱的smtp服务功能没开启,邮箱为了安全起见,默认是关闭的,也就是不能自动发送邮件。

       好的,下面我给出此框架的使用步骤吧。

       使用本框架前,你需要以下jar包  android-crash-1.0.jar  activation.jar  additionnal.jar  mail.jar 后面的3个是可选的,如果你用邮件的方式的话,就需要它们,如果采用服务器的方式,就不用了。这几个jar包,点击此处下载

首先先说使用步骤吧:

1,添加jar包

①,如果你是Eclipse用户,你想用到邮件的发送来处理异常信息,那你得需要将上面的4个jar包添加到你的项目中,具体步骤不会的可百度。

②,如果你是Android studio用户,你需要在build.gradle(Project:xxx)下的repository中添加如下代码段

[java]  view plain  copy  print ?
  1. repository   
  2.    jcenter() // or mavenCentral()  
  3.   


在build.gradle(Module:xxx) 中的dependencies添加如下依赖

[java]  view plain  copy  print ?
  1. compile 'com.githang:android-crash:1.0'  

后面的3个是可选的,如果用邮件的方式发送的话,需要添加jar包,和添加相应的依赖


其实上述的添加依赖是可以自动完成的,当你把jar包导入后,然后邮件你的jar包,会出现add to library,你添加后,会在依赖中发现已经帮你自动添加了。

2,属性配置

自定义一个类,让其继承于Application,并在AndroidManifest.xml中的application节点中使用name属性,将类名添加进去,这样当程序一启动就会先执行继承自application类里面的配置,最后要别忘了添加权限,一个是网络权限,一个是往sd卡写的权限

[java]  view plain  copy  print ?
  1. public class MyApplication extends Application   
  2.       @Override  
  3.     public void onCreate()   
  4.         super.onCreate();  
  5.         initHttpReporter();  
  6.       
  7.   
  8.     /** 
  9.      * 使用EMAIL发送日志 
  10.      */  
  11.     private void initEmailReporter()   
  12.         CrashEmailReporter reporter = new CrashEmailReporter(this);  
  13.         reporter.setReceiver("你的接收邮箱");  
  14.         reporter.setSender("xxxx@163.com");  
  15.         reporter.setSendPassword("xxxxxxxx");//说到这个密码,你可以设置一个客户端授权码,它是登录第三方客户端的专用密码,和主登录密码不冲突  
  16.         reporter.setSMTPHost("smtp.163.com");//这里使用的是163发送邮件的服务,所以主机名是163的,有需要修改的,也可以更改对应的主机名  
  17.         reporter.setPort("465");//端口号,可选25端口号,具体的看是否使用ssl安全协议  
  18.         AndroidCrash.getInstance().setCrashReporter(reporter).init(this);  
  19.       
  20.   
  21.     /** 
  22.      * 使用HTTP发送日志 
  23.      */  
  24.     private void initHttpReporter()   
  25.         CrashHttpReporter reporter = new CrashHttpReporter(this)   
  26.             /** 
  27.              * 重写此方法,可以弹出自定义的崩溃提示对话框,而不使用系统的崩溃处理。 
  28.              * @param thread 
  29.              * @param ex 
  30.              */  
  31.             @Override  
  32.             public void closeApp(Thread thread, Throwable ex)   
  33.               //  final Activity activity = AppManager.currentActivity();  
  34.              //   Toast.makeText(activity, "发生异常,正在退出", Toast.LENGTH_SHORT).show();  
  35.                 // 自定义弹出对话框  
  36.                 new AlertDialog.Builder(getApplicationContext()).  
  37.                         setMessage("程序发生异常,现在退出").  
  38.                         setPositiveButton("确定"new DialogInterface.OnClickListener()   
  39.                     @Override  
  40.                     public void onClick(DialogInterface dialog, int which)   
  41.                   //      AppManager.AppExit(activity);  
  42.                       
  43.                 ).create().show();  
  44.                 Log.d("MyApplication""thead:" + Thread.currentThread().getName());  
  45.               
  46.         ;  
  47.         reporter.setUrl("http://xxx.crashreport.jd-app.com/your_receiver").setFileParam("fileName")  
  48.                 .setToParam("to").setTo("你的接收邮箱")  
  49.                 .setTitleParam("subject").setBodyParam("message");  
  50.         reporter.setCallback(new CrashHttpReporter.HttpReportCallback()   
  51.             @Override  
  52.             public boolean isSuccess(int i, String s)   
  53.                 return s.endsWith("ok");  
  54.               
  55.         );  
  56.         AndroidCrash.getInstance().setCrashReporter(reporter).init(this);  
  57.       

特别要注意的是,对于自动发送邮件的,一定要邮箱开启SMTP服务功能,否则程序会报一个自动验证失败的异常,发送不了邮件。

具体怎么设置SMTP服务,请点击下面的链接 http://jingyan.baidu.com/article/0aa223755d15dc88cd0d6473.html  

本框架的作者原文链接如下 http://blog.csdn.net/maosidiaoxian/article/details/27178439  具体的原理可参见此文
 

附加:

    这也是我后来在运用中才发现的,所以就也写在这里好了,下面的内容是介绍一个非常强大、非常牛掰的一个bug收集服务器.免去了自己搭建的功夫,以及邮件查看时要下载日志的不便。

     腾讯 Bugly,是腾讯公司为移动开发者开放的服务之一,面向移动开发者提供专业的 Crash 监控、崩溃分析等质量跟踪服务。Bugly 能帮助移动互联网开发者更及时地发现掌控异常,更全面的了解定位异常,更高效的修复解决异常。

    这里我就不浪费笔墨在此去教如何使用了,毕竟官方的更专业,相信你也更相信官方的文档。链接如下:http://bugly.qq.com/androidfast

     给张官方示例的截图看看,相信你会喜欢上使用它的


以上是关于Android程序崩溃异常处理之自动发送邮件的主要内容,如果未能解决你的问题,请参考以下文章

Android异常处理最佳实践?

Android logcat:使用电子邮件从设备发送日志条目

android 中处理崩溃异常并重启程序

C# 为啥定时器会自动停止

如何使用 ACRA 发送 Android 崩溃报告

Kotlin 协程协程异常处理 ④ ( Android 协程中出现异常导致应用崩溃 | Android 协程中使用协程异常处理器捕获异常 | Android 全局异常处理器 )