1. 程式人生 > >Android獲取崩潰日誌並上傳到郵箱

Android獲取崩潰日誌並上傳到郵箱

好吧,老闆要獲取崩潰日誌並上傳伺服器,已經實現了,這個比較簡單,主要說說上傳到郵箱的一個主意的地方:

上傳到伺服器和郵箱需要4個jar包(android-crash-1.0.jar,activation.jar,additionnal.jar,mail.jar),我是在別人的部落格上面下載的,還需要積分,下載連結:點選開啟連結。其實不用下載,大牛已經上傳到jcenter上面了,直接在Android studio中就可以搜尋到然後關聯就好了


如果不放心的話就花點積分下載關聯也行。下面貼程式碼:

主要是一個傳送郵件的類

import java.io.File;
import java.util.Date;
import java.util.Properties; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; /* { //上傳到163郵箱中 EmailSender sender=new EmailSender(); //設定伺服器地址和埠,網上搜的到 sender.setProperties("smtp.163.com","25"); //分別設定發件人,郵件標題和文字內容 sender.setMessage("自己的163郵箱賬號
","EmailSender","Java Mail
"); //設定收件人 sender.setReceiver(new String[]{"自己的163賬號"}); //新增附件 //這個附件的路徑是我手機裡的啊,要發你得換成你手機里正確的路徑 sender.addAttachment(filePath); *//** * 傳送郵件 * * 重點來了!!!!!! * password:此處應該填寫我們第一步那裡生成的授權碼(我就是錯在這裡.......* 這裡的授權碼不是賬號登入時候的密碼,是為了第三方客戶端登入用的授權碼(也可以看做密碼,但是不能跟賬戶密碼相同) * 參考:https://blog.csdn.net/th226/article/details/79052561 * *//* sender.sendEmail("smtp.163.com","自己的163賬號","這裡是在163裡設定POP3/SMTP的時候設定的授權碼"); //sender.setMessage("你的163郵箱賬號", "EmailS//ender", "Java Mail ");這裡面兩個郵箱賬號要一致 } */ public class EmailSender { private Properties properties; private Session session; private Message message; private MimeMultipart multipart; public EmailSender() { super(); this.properties = new Properties(); } public void setProperties(String host, String post) { //地址 this.properties.put("mail.smtp.host", host); //埠號 this.properties.put("mail.smtp.post", post); //是否驗證 this.properties.put("mail.smtp.auth", true); this.session = Session.getInstance(properties); this.message = new MimeMessage(session); this.multipart = new MimeMultipart("mixed"); } /** * 設定收件人 * * @param receiver * @throws MessagingException */ public void setReceiver(String[] receiver) throws MessagingException { InternetAddress[] address = new InternetAddress[receiver.length]; for (int i = 0; i < receiver.length; i++) { address[i] = new InternetAddress(receiver[i]); } this.message.setRecipients(Message.RecipientType.TO, address); } /** * 設定郵件 * * @param from 來源 * @param title 標題 * @param content 內容 * @throws AddressException * @throws MessagingException */ public void setMessage(String from, String title, String content) throws AddressException, MessagingException { this.message.setFrom(new InternetAddress(from)); this.message.setSubject(title); //純文字的話用setText()就行,不過有附件就顯示不出來內容了 MimeBodyPart textBody = new MimeBodyPart(); textBody.setContent(content, "text/html;charset=gbk"); this.multipart.addBodyPart(textBody); } /** * 新增附件 * * @param filePath 檔案路徑 * @throws MessagingException */ public void addAttachment(String filePath) throws MessagingException { FileDataSource fileDataSource = new FileDataSource(new File(filePath)); DataHandler dataHandler = new DataHandler(fileDataSource); MimeBodyPart mimeBodyPart = new MimeBodyPart(); mimeBodyPart.setDataHandler(dataHandler); mimeBodyPart.setFileName(fileDataSource.getName()); this.multipart.addBodyPart(mimeBodyPart); } /** * 傳送郵件 * * @param host 地址 * @param account 賬戶名 * @param pwd 密碼 * @throws MessagingException */ public void sendEmail(String host, String account, String pwd) throws MessagingException { //傳送時間 this.message.setSentDate(new Date()); //傳送的內容,文字和附件 this.message.setContent(this.multipart); this.message.saveChanges(); //建立郵件傳送物件,並指定其使用SMTP協議傳送郵件 Transport transport = session.getTransport("smtp"); //登入郵箱 transport.connect(host, account, pwd); //傳送郵件 transport.sendMessage(message, message.getAllRecipients()); //關閉連線 transport.close(); } }

然後在建立的第一個activity中開一個子執行緒實現上傳方法:

new Thread(new Runnable() {
    @Override
public void run() {
      
            try {
              
                 //上傳成功後接著上傳到QQ郵箱中
EmailSender sender = new EmailSender();
//設定伺服器地址和埠,網上搜的到
sender.setProperties("smtp.qq.com", "25");
//分別設定發件人,郵件標題和文字內容
sender.setMessage("自己的qq郵箱賬號", "EmailSender", "Java Mail ");
//設定收件人
sender.setReceiver(new String[]{"自己的qq郵箱地址"});
//新增附件,就是獲取的bug日誌先儲存到本地檔案,然後獲取檔案的絕對路徑
sender.addAttachment(filePath);
/**
                  *  傳送郵件
*
                  * 重點來了!!!!!!
* password:此處應該填寫我們第一步那裡生成的授權碼(我就是錯在這裡.......* 這裡的授權碼不是賬號登入時候的密碼,是為了第三方客戶端登入用的授權碼(也可以看做密碼,但是不能跟賬戶密碼相同)
* 參考:https://blog.csdn.net/th226/article/details/79052561
                  * QQ中的授權碼需要登入QQ郵箱——設定——賬戶——POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務——開啟服務
* 
                  */
sender.sendEmail("smtp.qq.com", "自己的qq郵箱地址", "授權碼");
//sender.setMessage("你的163郵箱賬號", "EmailS//ender", "Java Mail ");這裡面兩個郵箱賬號要一致//上傳成功後清除本地檔案和快取資料
File file = new File(filePath);
file.delete();
}
            } catch (Exception e) {
                e.printStackTrace();
}
    }
}).start();

這裡面的授權碼很重要,不是賬號的密碼,獲取授權碼的步驟:主要說QQ的

登入QQ郵箱——設定——賬戶——POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務——開啟服務——將(POP3/SMTP服務 (如何使用 Foxmail 等軟體收發郵件?))開啟,開啟的時候回提示有個授權碼,這個授權碼就是上面傳送檔案的時候要設定的,不然是無法連線QQ郵箱的,163郵箱的授權碼獲取也是同樣的步驟