Android捕获崩溃日志并发送JavaMail邮件

图片来之网络

Android机型太多
Android机型更新太快
崩溃日志无法收集

请参考Demo:SendMail-Demo

一、收集崩溃日志

经常收到APP崩溃了,但是在测试环境又是好的。一说机型和Android版本,公司又没有。让用户拍一个视频或录屏吧。可还是没法重现,看不到崩溃日志。所以想到记录下崩溃日志吧。

 /**
     * 当UncaughtException发生时会转入该函数来处理
     */
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        if (!handleException(ex) && mDefaultHandler != null) {
            // 如果用户没有处理则让系统默认的异常处理器来处理
            mDefaultHandler.uncaughtException(thread, ex);
        } else {
            SystemClock.sleep(3000);
            // 退出程序
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(1);
        }
    }

当崩溃的时候,将崩溃日志记录到本地文件,并且保存5天。

二、发送崩溃日志

等到用户反馈崩溃时,让用户发送下崩溃日志吧。妥妥的,看到崩溃原因。

/**
   * 创建带有附件的邮件
   * 
   * @return
   */
  private Message createAttachmentMail(final Mail info, List fileList) {
    // 创建邮件
    MimeMessage message = null;
    Properties pro = info.getProperties();
    try {

      Session sendMailSession = Session.getInstance(pro, new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
          return new PasswordAuthentication(info.getUserName(), info.getPassword());
        }
      });

      message = new MimeMessage(sendMailSession);
      // 设置邮件的基本信息
      // 创建邮件发送者地址
      Address from = new InternetAddress(info.getFromAddress());
      // 设置邮件消息的发送者
      message.setFrom(from);
      // 创建邮件的接受者地址,并设置到邮件消息中
     setAddress(message,info);
      // 邮件标题
      message.setSubject(info.getSubject());


      // 创建容器描述数据关系
      MimeMultipart mp = new MimeMultipart("mixed");
      message.setContent(mp);


      // 创建邮件正文,为了避免邮件正文中文乱码问题,需要使用CharSet=UTF-8指明字符编码
      MimeBodyPart text = new MimeBodyPart();
      text.setContent(info.getContent(), "text/html;charset=UTF-8");
      mp.addBodyPart(text);


      // 创建邮件附件
      if (null != fileList && 0 < fileList.size()) {
        for (File file : fileList) {
          MimeBodyPart attach = new MimeBodyPart();

          FileDataSource ds = new FileDataSource(file);
          DataHandler dh = new DataHandler(ds);
          attach.setDataHandler(dh);
          attach.setFileName(MimeUtility.encodeText(dh.getName(), "UTF-8", "B"));
          mp.addBodyPart(attach);
        }
      }

      message.saveChanges();

      // add handlers for main MIME types
      MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
      mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
      mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
      mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
      mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
      mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
      CommandMap.setDefaultCommandMap(mc);

    } catch (Exception e) {
      Log.e("TAG", "创建带附件的邮件失败");
      e.printStackTrace();
    }
    // 返回生成的邮件
    return message;
  }

三、注意点

记录崩溃日志的实现是从网上下载,直接可以用。但是发送邮件碰到了几个坑:

1. 腾讯企业邮箱

如果使用的是腾讯企业邮箱,那么建议换一个自己的邮箱,比如126或者163. 不然一直提示授权失败。

2. jar的问题

使用的javaMail的jar,下载方式有很多种,并且又有很多封装的包。所以选择包的时候,最好是匹配的。可以直接使用DEMO的jar包。

3. 附件MIME TYP的问题

一切都很正常的时候,上传附件报mimeType问题,需要添加下。

// add handlers for main MIME types
      MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
      mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
      mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
      mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
      mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
      mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
      CommandMap.setDefaultCommandMap(mc);
4. 环境问题

当使用的jar包测试了很多次,依赖第三方库很多次,导致java mail的依赖包过多,会经常出现冲突的问题。那么建议清楚~/.gradle/caches文件夹中的内容。

5. Demo

在使用demo的时候,需要修改收件人和发件人的地址。其中发件人的密码,一定要使用授权码。授权码不同邮箱获取的方式不一样,不推荐使用腾讯的微信绑定安全码,尝试很多次不成功。推荐163或126邮箱,登录后在设置中可以明显的看到。

DEMO的地址,好用记得star。
请参考Demo:SendMail-Demo

// END 2018年8月14日 人生路漫漫,自己选择的路,再难也要继续。

你可能感兴趣的:(Android捕获崩溃日志并发送JavaMail邮件)