`

android全局异常捕获并发送异常到邮箱

 
阅读更多
public class AppException extends Exception implements UncaughtExceptionHandler {

private static final String TAG = "AppException";
private static final long serialVersionUID = -6262909398048670705L;
private String message;
private Thread.UncaughtExceptionHandler mDefaultHandler;
private AlertDialog appCrashDialog;
private Activity activity;

private AppException() {
super();
this.mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
}

public AppException(String message, Exception excp) {
super(message, excp);
this.mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
}

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

/**
* 获取APP异常崩溃处理对象
*
* @param context
* @return
*/
public static AppException getAppExceptionHandler() {
return new AppException();
}

@Override
public void uncaughtException(Thread thread, Throwable ex) {

if (!handleException(ex) && mDefaultHandler != null) {
mDefaultHandler.uncaughtException(thread, ex);
}

}

/**
* 自定义异常处理
*
* @param ex
* @return true:处理了该异常信息;否则返回false
*/
private boolean handleException(Throwable ex) {
if (ex == null) {
return false;
}

activity = AppManager.getAppManager().currentActivity();
Log.v(TAG, "crash activity is : " + activity);
if (activity == null) {
return false;
}
final String fileName = saveErrorToFile(ex);
new Thread() {
@Override
public void run() {
Looper.prepare();
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("温馨提示");
builder.setMessage("程序崩溃了!");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
activity.finish();
//UIHelper.Exit(activity);
}
});
appCrashDialog = builder.create();
appCrashDialog.setCanceledOnTouchOutside(false);
appCrashDialog.show();
Looper.loop();
}
}.start();

return true;
}

// 用来存储设备信息和异常信息
private Map<String, String> infos = new HashMap<String, String>();
// 用于格式化日期,作为日志文件名的一部分
private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");

/**
* 保存错误信息到文件中
* @param ex
* @return 返回文件名称,便于将文件传送到服务器
*/
private String saveErrorToFile(Throwable ex) {
StringBuffer sb = new StringBuffer();
for (Map.Entry<String, String> entry : infos.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
sb.append(key + "=" + value + "\n");
}
Writer writer = new StringWriter();
PrintWriter printWriter = new PrintWriter(writer);
ex.printStackTrace(printWriter);
Throwable cause = ex.getCause();
while (cause != null) {
cause.printStackTrace(printWriter);
cause = cause.getCause();
}
printWriter.close();
String result = writer.toString();
sb.append(result);
try {
long timestamp = System.currentTimeMillis();
String time = formatter.format(new Date());
String fileName = "error-" + time + "-" + timestamp + ".log";
String file_dir = Utils.getSDPath();
File dir = new File(file_dir + "/log/");
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir.toString() + "/" + fileName);
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file);
fos.write(sb.toString().getBytes());
//sendErrorToServer(sb.toString());
if(!sb.toString().contains("AppException$1.run")){
sendMail(sb.toString());
Log.e("123","ErrorToFile = "+ sb.toString());
}
fos.close();
return file.toString();
} catch (Exception e) {
}
return null;
}


private void sendMail(final String string) {
new Thread(){
public void run() {
MailUtils mail = new MailUtils();
mail.send("13974552815@qq.com", "ikuaishouApp崩溃日志("+StringUtils.formatTime(System.currentTimeMillis())+")", string);
};
}.start();
}
}

然后在自己的application中的oncreate方法调用:
Thread.setDefaultUncaughtExceptionHandler(AppException.getAppExceptionHandler());
分享到:
评论

相关推荐

    Android 全局异常捕获后台发送邮件

    网上找了很多资料都不能使用,后来自己参考写了这么一个 全局异常捕获并通过后台给指定的QQ邮箱发送 异常报告日志附件. 重点位置都已经注释了,其他的大家慢慢理解吧。 注意:QQ邮箱设置服务和生成授权码,...

    [源码]Android捕获全局异常将错误信息发送到邮件

    Android捕获全局异常将错误信息发送到邮件,很好用的

    Android 应用异常信息捕捉,邮件发送给开发者

    在这个场景中,"Android应用异常信息捕捉,邮件发送给开发者"是一个实用的解决方案,它利用了`UncaughtExceptionHandler`来实现。 `UncaughtExceptionHandler`是Android系统提供的一个接口,用于处理未被捕获的异常...

    Android异常捕获(发邮件+写文件)

    本篇文章将详细讲解如何在Android系统中实现异常捕获,并结合写文件和发送邮件功能,将捕获到的错误信息进行记录和报告。 首先,我们需要了解Android中的异常处理机制。在Java语言中,异常处理通常通过try-catch-...

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

    这个全局异常处理器会在程序出现未捕获的异常时被调用。在`Application`的`onCreate()`方法中,我们可以这样设置: ```java public class MyApplication extends Application { @Override public void onCreate()...

    android 捕获系统异常并上传日志具体实现

    在Android应用开发中,捕获系统异常并上传日志是一项重要的功能,可以帮助开发者及时发现和修复潜在的问题。本文将详细讲解如何实现这一功能。 首先,Android系统提供了`Thread.UncaughtExceptionHandler`接口,...

    android日志分析&崩溃拦截

    Android捕获全局异常源码.rar Android控制整个项目Log的打印和关闭.zip Android日志打印类LogUtils.rar android端_手机端日志查看工具.rar app打印日志保存到手机上传服务器.rar javaapk.com文件列表生成.bat ...

    Android 之APP程序崩溃后,自动向QQ 邮箱发送邮件

    本篇将介绍一种方法,即在Android APP崩溃后,自动通过QQ邮箱发送包含错误信息的邮件,帮助开发者快速定位并修复错误。 首先,我们需要在APP中实现一个全局的异常捕获机制。这通常通过自定义一个`Thread....

    android崩溃日志保存SDCARD-本地阅读-并发送email

    完成日志保存后,我们可以编写一个邮件发送功能,让用户能够通过点击应用内的按钮或自动触发,将日志发送到指定邮箱。以下是一个简单的示例,使用JavaMail API: ```java public boolean sendEmail(String[] ...

    SendCrashToMail

    它利用了ACRA(Application Crash Report for Android)库来捕获应用中的异常信息,并将这些信息通过电子邮件发送给指定的收件人,以便于开发者及时追踪和修复问题。 ACRA全称为Android Crash Report,是由Square...

    android 公共框架

    12. **异常处理**:全局异常捕获和处理机制,增强应用的健壮性。 13. **动画库**:包含一些预定义的动画效果,如进入退出动画、滑动切换等,提升用户体验。 14. **权限动态检测和申请**:如AndroidX的`AppCompat`...

    bugly简易使用

    1. 完成上述步骤后,当应用运行并发生异常时,Bugly会自动收集相关信息并上传到服务器。在Bugly后台,你可以看到详细的错误报告,包括错误类型、频率、影响用户数以及堆栈跟踪等。 2. 利用Bugly的筛选和排序功能,...

    namana:一组Android帮助器功能

    Namana可能包含了全局的异常捕获和处理机制,帮助开发者更好地处理程序运行时可能出现的错误,提高应用的稳定性。 7. 图片加载: 图像加载是Android应用常见的需求,Namana可能集成了像Glide或Picasso这样的图片...

    signup_php

    它处理客户端(即Android应用)发送的请求,执行业务逻辑,验证用户输入,并与数据库交互来存储或检索数据。以下是关于PHP在构建此类系统时涉及的一些核心知识点: 1. **PHP基础**:PHP是一种开源的服务器端脚本...

    react-native-firebase-auth-app:构建SignUp和SignIn表单并集成到Firebase身份验证

    为了提供良好的用户体验,我们需要捕获并显示Firebase抛出的错误。例如,当用户输入无效邮箱或密码时,我们可以显示自定义的错误提示。 **七、安全实践** 确保遵循最佳安全实践,如加密存储敏感信息,不要在客户端...

    wechat-miniprogram-dev

    - **错误处理**:遇到的常见错误如网络请求失败、API调用错误等,需要学会正确捕获并处理,提供友好的用户体验。 - **界面设计**:利用微信小程序的wxml和wxss进行布局,理解flex布局和相对定位,提升界面的响应式...

Global site tag (gtag.js) - Google Analytics