Android 程序崩溃日志邮件获取
版权声明:本文为博主原创文章,未经博主允许不得转载。
在我们开发Android应用程序的时候,BUG的出现是难以避免的,时不时还会出现崩溃的情况,这个时候,我们急需知道造成问题的原因是什么,但是,在没有连接ADT或者AS的情况下,我们很难获取到崩溃的日志,当然,如果你的手机获取到了最高的root权限,可以下载一些软件来得到log,比如:ES文件浏览器等。但是,并不是所有手机都能root,而且如果是在客户在使用,种种情况下,导致我们不能及时和准确的获取到崩溃的原因,从而迅速的解决问题。基于这个原因,下面分享一个很好获取到崩溃时日志的方法
第一步:导入mail.jar
首先我们将下载好的mail.jar导入到项目中去。
第二步:初始化
在Application中进行初始化
// crash记录及上传
CrashHandler.getInstance().init(this);
第三步:开始编码CrashHandler
CrashHandler类主要用于收集错误信息 发送错误报告。
1、由于我们在很多地方都会使用到CrashHandler的对象,所以单例模式最好不过了。
/** 获取CrashHandler实例 ,单例模式 */
public static CrashHandler getInstance() {
if(INSTANCE==null) {
INSTANCE=newCrashHandler();
}
return INSTANCE;
}
2、初始化初始化,注册Context对象, 获取系统默认的UncaughtException处理器, 设置该CrashHandler为程序的默认处理器
public void init(Context ctx) {
mContext= ctx;
mDefaultHandler= Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
3、CrashHandler需要继承UncaughtExceptionHandler接口,用于收集数据。
public class CrashHandler implements UncaughtExceptionHandler
实现UncaughtExceptionHandler的回调接口uncaughtException;
图1自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. 开发者可以根据自己的情况来自定义异常处理逻辑
图2collectCrashDeviceInfo是收集程序崩溃的设备信息的方法;restart()是崩溃后重新启动应用的方法;saveCrashInfoToFile是保存错误信息到SD卡中,然后发送日志到你的邮箱中。
图3 图4后续由于截图问题。没有截图完全,但是主要demo已经截完= =;
做到这里。就只差发邮件这一步了。
第四步:发邮件
这里新建了一个工具类EmailUtil用于操作发送邮件。
主要用到2个方法。不过在此之前需要注册网易邮箱,因为我使用的是smtp163服务器。
由于下面的篇幅比较大,又比较重要,所以直接po了上来就没截图了。原谅新手不会用简书。。。
public static void SendEmail(String host,finalString address, String from,finalString password, String to, String port, String subject, String content)throwsException {
Multipart multiPart;
String finalString ="";
Properties props = System.getProperties();
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.host", host);
props.put("mail.smtp.user", address);
props.put("mail.smtp.password", password);
props.put("mail.smtp.port", port);
props.put("mail.smtp.auth","true");
Log.i("Check","done pops");
Session session = Session.getDefaultInstance(props,newAuthenticator() {
protectedjavax.mail.PasswordAuthentication getPasswordAuthentication() {
//此处必须做验证,才能发送邮件
returnnewjavax.mail.PasswordAuthentication(address,
password);
}
});
DataHandler handler =newDataHandler(newByteArrayDataSource(finalString.getBytes(),"text/plain"));
MimeMessage message =newMimeMessage(session);
message.setFrom(newInternetAddress(from));
message.setDataHandler(handler);
Log.i("Check","done sessions");
multiPart =newMimeMultipart();
InternetAddress toAddress;
toAddress =newInternetAddress(to);
message.addRecipient(Message.RecipientType.TO, toAddress);
Log.i("Check","added recipient");
message.setSubject(subject);
message.setContent(multiPart);
message.setText(content);
Log.i("check","transport");
Transport transport = session.getTransport("smtp");
Log.i("check","connecting");
transport.connect(host, address, password);
Log.i("check","wana send");
transport.sendMessage(message, message.getAllRecipients());
transport.close();
Log.i("check","sent");
}
到此,整个功能就完成了。其实很简单的,主要是采集崩溃信息和保存以及发送邮件。写的不好,但是能够满足需求,希望大家能够在其中获益,我也会继续。