获取Android应用程序出错信息并将信息发送到指定邮件
2012-04-21 17:22
435 查看
前段时间做过一个反馈应用程序Bug的程序,今天和大家分享下
如果想要获取应用程序的出错信息则比较简单,只需要通过实现 UncaughtExceptionHandler就可以达到目的,那么如何获取Android OS 所有应用程序的出错信息,目前的方式只有通过修改框架层来达到此目的。
C) 记得修改AndroidManifest.xml文件~~~
D) 写一个用于测试的Activity
系统出错时一般会弹出一个Dialog,这个Dialog是由frameworks\base\services\java\com\android\server\am\ActivityManagerService.java弹出的,具体的Dialog是frameworks\base\services\java\com\android\server\am\AppErrorDialog.java,所以在这里我们只需要将这个AppErrorDialog改掉,或者在AppErrorDialog中添加一个按钮用于来反馈出错信息的功能,简单的说就是在AppErrorDialog中添加一个按钮,这个按钮通过Intent打开相应的应用程序,并将错误信息发送到应用程序的Activity。
这里主要给出一个思路吧。
我们来看如何使用这些jar包发邮件
发送邮件时一定要注意属性值得设置,不同的邮件服务器有不同的设置,要想实现发送gmail,yahoo等邮箱的发送接收,需要正确的设置,当时就纠结了很久!至于怎么设置,可以先在foxmail中进行设置,看属性就好了。
比如说需要发送接收gmail的邮件,要进行一下设置
Ok,这篇文章就到这里吧,主要是和大家分享思路~各位有更好的方法要分享哦
原创文章,欢迎转载,转载请注明出处http://blog.csdn.net/tangcheng_ok
如果想要获取应用程序的出错信息则比较简单,只需要通过实现 UncaughtExceptionHandler就可以达到目的,那么如何获取Android OS 所有应用程序的出错信息,目前的方式只有通过修改框架层来达到此目的。
(一)首先,我们先来看如何获取应用程序的出错信息:
A) 继承UncaughtExceptionHandler的类package org.winplus.getex; import java.lang.Thread.UncaughtExceptionHandler; import android.content.Context; import android.os.Looper; import android.util.Log; import android.widget.Toast; public class CrashHandler implements UncaughtExceptionHandler { private final static String TAG = "UncaughtExceptionHandler"; private Thread.UncaughtExceptionHandler mDefaultHandler; private static CrashHandler mInstance; private Context mContext; private CrashHandler() { } /** 获取CrashHandler实例 ,单例模式 */ public static CrashHandler getInstance() { if (mInstance == null) mInstance = new CrashHandler(); return mInstance; } @Override public void uncaughtException(Thread thread, Throwable throwable) { if (!handleException(throwable) && mDefaultHandler != null) { // 如果用户没有处理则让系统默认的异常处理器来处理 mDefaultHandler.uncaughtException(thread, throwable); } else { // Sleep一会后结束程序 // 来让线程停止一会是为了显示Toast信息给用户,然后Kill程序 try { Thread.sleep(3000); } catch (InterruptedException e) { Log.e(TAG, "Error : ", e); } android.os.Process.killProcess(android.os.Process.myPid()); System.exit(10); } } private boolean handleException(Throwable ex) { if (ex == null) { return true; } final String msg = ex.getLocalizedMessage(); // 使用Toast来显示异常信息 new Thread() { @Override public void run() { // Toast 显示需要出现在一个线程的消息队列中 Looper.prepare(); Toast.makeText(mContext, "Exception:" + msg, Toast.LENGTH_LONG).show(); Looper.loop(); } }.start(); return true; } public void init(Context context) { mContext = context; mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(this); } }B) 初始化并启动获取异常的线程类:CrashApplication
import android.app.Application; public class CrashApplication extends Application { @Override public void onCreate() { super.onCreate(); CrashHandler crashHandler = CrashHandler.getInstance(); // 注册crashHandler crashHandler.init(getApplicationContext()); } }
C) 记得修改AndroidManifest.xml文件~~~
D) 写一个用于测试的Activity
public class GetExceptionActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); int i = 1/0;//除数不能为0 这里会抛出异常 } }
(二)获取AndroidOS应用程序所有出错信息的思路
获取应用程序异常的方法我们介绍过了,网上也有很多例子。下面来进入这边文章的重点,说是重点,其实也不难。我们的目的是通过修改最少的代码来获取系统中所有应用程序出错的信息:修改框架层ActivityManagerService类(如果不是特殊的要求,非常不建议修改框架层,当然我们在这里要修改的东西不会影响到什么)系统出错时一般会弹出一个Dialog,这个Dialog是由frameworks\base\services\java\com\android\server\am\ActivityManagerService.java弹出的,具体的Dialog是frameworks\base\services\java\com\android\server\am\AppErrorDialog.java,所以在这里我们只需要将这个AppErrorDialog改掉,或者在AppErrorDialog中添加一个按钮用于来反馈出错信息的功能,简单的说就是在AppErrorDialog中添加一个按钮,这个按钮通过Intent打开相应的应用程序,并将错误信息发送到应用程序的Activity。
这里主要给出一个思路吧。
(三)发送邮件
最后,如何发送邮件呢?Android有几种发送邮件的方式,一种是直接调用系统的邮件,第二种是通过Java Mail的方式发送邮件,第一种并不是我们所需要的,要通过javaMail发送邮件,但Android如何通过JavaMail的方式发送邮件呢?很好,以及有哥们帮我们做了,请看这个:http://code.google.com/p/javamail-android/,只需要下载下面3个Jar包即可:additionnal.jar mail.jar activation.jar我们来看如何使用这些jar包发邮件
public class MailTool { public static void sendMail(String subject, String content) throws MessagingException { Properties props = new Properties(); props.put("mail.smtp.host", "mail.sina.cn");// 存储发送邮件服务器的信息 props.put("mail.smtp.auth", "true");// 同时通过验证 // 基本的邮件会话 Session session = Session.getInstance(props); session.setDebug(true);// 设置调试标志 // 构造信息体 MimeMessage message = new MimeMessage(session); // 发件地址 Address fromAddress = null; fromAddress = new InternetAddress("abc@sina.cn"); message.setFrom(fromAddress); // 收件地址 Address toAddress = new InternetAddress("def@sina.cn"); message.addRecipient(Message.RecipientType.TO, toAddress); // 解析邮件内容 message.setSubject(subject);// 设置信件的标题 message.setText(content);// 设置信件内容 message.saveChanges(); // implicit with send()//存储信息 // send e-mail message Transport transport = null; transport = session.getTransport("smtp"); transport.connect("mail.sina.cn", "abc@sina.cn", "winplus.org"); transport.sendMessage(message, message.getAllRecipients()); transport.close(); } }
发送邮件时一定要注意属性值得设置,不同的邮件服务器有不同的设置,要想实现发送gmail,yahoo等邮箱的发送接收,需要正确的设置,当时就纠结了很久!至于怎么设置,可以先在foxmail中进行设置,看属性就好了。
比如说需要发送接收gmail的邮件,要进行一下设置
Properties props = new Properties(); props.setProperty("mail.transport.protocol", "smtp"); props.setProperty("mail.host", "smtp.gmail.com"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.port", "465"); props.put("mail.smtp.socketFactory.port", "465"); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.smtp.quitwait", "false");
Ok,这篇文章就到这里吧,主要是和大家分享思路~各位有更好的方法要分享哦
原创文章,欢迎转载,转载请注明出处http://blog.csdn.net/tangcheng_ok
相关文章推荐
- 获取Android应用程序出错信息并将信息发送到指定邮件
- 获取Android应用程序出错信息并将信息发送到指定邮件
- 获取Android应用程序出错信息并将信息发送到指定邮件
- 获取Android应用程序出错信息并将信息发送到指定邮件 .
- Android将日志信息自动发送到指定的邮箱中 邮件的内容以附件形式发送
- Android将日志信息自动发送到指定的邮箱中 邮件的内容以附件形式发送
- python获取天气信息,给指定用户发送邮件
- python实现获取天气信息后自动登录邮箱发送到指定邮件联系人
- Android将日志信息自动发送到指定的邮箱中 邮件的内容以附件形式发送
- Android将日志信息自动发送到指定的邮箱中 邮件的内容以附件形式发送
- Android中获取应用程序(包)的信息-----PackageManager的使用(一)
- [置顶] 使用Python获取每天最新CVE漏洞信息,通过邮件进行预警发送(二)
- Android中获取应用程序(包)的信息-----PackageManager的使用(一)
- 获取Android系统中应用程序的信息
- Android 后台发送邮件到指定邮箱
- 技术回顾:Android 如何在Service获取最佳坐标以及发送短信到指定的手机
- Android中获取应用程序(包)的信息-----PackageManager的使用(一)
- Android中获取应用程序(包)的信息-----PackageManager的使用(一)
- python获取CSDN个人收藏的文章链接和标题,然后发送到指定邮件
- Android中获取应用程序(包)的信息-----PackageManager的使用(一)