- 浏览: 75892 次
- 性别:
- 来自: 西安
文章分类
- 全部博客 (101)
- Android (45)
- java中多线程的实现 (1)
- Runnable (2)
- Thread (1)
- TCP网络编程 (1)
- PHP (1)
- java (4)
- JDBC (1)
- oauth登录 (1)
- 中文乱码 (1)
- Ajax (1)
- web (2)
- Mysql (2)
- HTML5 (0)
- HTML5 (1)
- entity not found (1)
- JQuery (2)
- 使用jsp和Servlet实现一个验证码 (1)
- 验证码 (1)
- 异常 (1)
- webService (2)
- not insert异常 (1)
- JAVAmail (1)
- 选中分享 (1)
- 控件 (1)
- 方法 (1)
- listView (1)
- android控件 (1)
- jqueryMobile (1)
- servlet开发中文乱码解决方案 (1)
- servlet开发中文乱码解决方案 (1)
- web文本框初始提示 (1)
- web文本框初始提示 (0)
- xml (1)
- java中的加密技术 (1)
- 互联网 (1)
- mysql数据库 (1)
- java单例模式 (1)
- gson转json (1)
最新评论
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());
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自动化测试--Espresso框架使用
2016-11-01 10:02 759转载: Android自动化测试--Espresso框架 ... -
浅谈android中仅仅使用一个TextView实现高仿京东,淘宝各种倒计时
2016-11-01 09:54 1090转载:http://blog.csdn.net/u0130 ... -
利用apktool等工具发编译android apk
2016-10-25 09:15 748这个是我的csdn中的一篇关于android app反编译的文 ... -
Error:Execution failed for task ':app:mergeDebugResources'. > Some file crunchin
2016-10-08 10:30 1036向studio中导入微信支付Demo的时候报错了,具体如图: ... -
android studio实用快捷键收集
2016-09-30 17:51 492本人用android studio刚开始,做一下笔记,只适用于 ... -
android中事件分发机制
2016-09-22 11:52 587转载自:http://www.cnblogs.com/linj ... -
一个对sharedpreferences 数据进行加密的开源库
2016-09-18 14:30 655http://www.cnblogs.com/zhaoyanj ... -
LinerLayout滑动后停在顶部
2016-09-18 12:08 685转载自:http://blog.csdn.net/ff2008 ... -
android studio入门知识
2016-09-06 18:11 713http://blog.csdn.net/jdsjlzx/ar ... -
android图片加载OOM解决方案
2016-08-30 15:17 489转载自:http://www.apkbus.com/blog- ... -
android oom连带问题,以及tag错位问题结局方案
2016-08-30 13:48 676http://www.apkbus.com/blog-8430 ... -
android新手指导
2016-08-30 11:59 403http://www.apkbus.com/forum.php ... -
android app自动化测试
2016-07-12 15:51 520android sdk的lib目录下有个monkeyrunne ... -
利用BadgeView实现数字提醒效果
2016-07-06 16:38 975BadgeView是一个第三方开源库, github地址:ht ... -
android端图片缓存实现,特别适用于listview来回滚动
2016-07-02 10:40 698转载自: http://www.open-open.com/l ... -
android文件存储文本
2016-05-17 17:26 504/** * 写入文本 */ private void ... -
android listView的BaseAdapter的抽取
2016-05-12 11:52 657/** * BaseAdapter的抽取 * @autho ... -
android第三方框架xutils的使用
2016-05-12 11:35 848这里写一些网络请求的相关 //初始化相关参数和对象 publi ... -
android端版本更新
2016-05-12 11:26 736整个思路,先判断服务端当前版本是不是高于本地版本,高的话可以选 ... -
android端从相册或者拍照读取图片
2016-04-16 16:45 826android端从相册或者拍照读取图片,见demo
相关推荐
网上找了很多资料都不能使用,后来自己参考写了这么一个 全局异常捕获并通过后台给指定的QQ邮箱发送 异常报告日志附件. 重点位置都已经注释了,其他的大家慢慢理解吧。 注意:QQ邮箱设置服务和生成授权码,...
Android捕获全局异常将错误信息发送到邮件,很好用的
在这个场景中,"Android应用异常信息捕捉,邮件发送给开发者"是一个实用的解决方案,它利用了`UncaughtExceptionHandler`来实现。 `UncaughtExceptionHandler`是Android系统提供的一个接口,用于处理未被捕获的异常...
本篇文章将详细讲解如何在Android系统中实现异常捕获,并结合写文件和发送邮件功能,将捕获到的错误信息进行记录和报告。 首先,我们需要了解Android中的异常处理机制。在Java语言中,异常处理通常通过try-catch-...
这个全局异常处理器会在程序出现未捕获的异常时被调用。在`Application`的`onCreate()`方法中,我们可以这样设置: ```java public class MyApplication extends Application { @Override public void onCreate()...
在Android应用开发中,捕获系统异常并上传日志是一项重要的功能,可以帮助开发者及时发现和修复潜在的问题。本文将详细讲解如何实现这一功能。 首先,Android系统提供了`Thread.UncaughtExceptionHandler`接口,...
Android捕获全局异常源码.rar Android控制整个项目Log的打印和关闭.zip Android日志打印类LogUtils.rar android端_手机端日志查看工具.rar app打印日志保存到手机上传服务器.rar javaapk.com文件列表生成.bat ...
本篇将介绍一种方法,即在Android APP崩溃后,自动通过QQ邮箱发送包含错误信息的邮件,帮助开发者快速定位并修复错误。 首先,我们需要在APP中实现一个全局的异常捕获机制。这通常通过自定义一个`Thread....
完成日志保存后,我们可以编写一个邮件发送功能,让用户能够通过点击应用内的按钮或自动触发,将日志发送到指定邮箱。以下是一个简单的示例,使用JavaMail API: ```java public boolean sendEmail(String[] ...
它利用了ACRA(Application Crash Report for Android)库来捕获应用中的异常信息,并将这些信息通过电子邮件发送给指定的收件人,以便于开发者及时追踪和修复问题。 ACRA全称为Android Crash Report,是由Square...
12. **异常处理**:全局异常捕获和处理机制,增强应用的健壮性。 13. **动画库**:包含一些预定义的动画效果,如进入退出动画、滑动切换等,提升用户体验。 14. **权限动态检测和申请**:如AndroidX的`AppCompat`...
1. 完成上述步骤后,当应用运行并发生异常时,Bugly会自动收集相关信息并上传到服务器。在Bugly后台,你可以看到详细的错误报告,包括错误类型、频率、影响用户数以及堆栈跟踪等。 2. 利用Bugly的筛选和排序功能,...
Namana可能包含了全局的异常捕获和处理机制,帮助开发者更好地处理程序运行时可能出现的错误,提高应用的稳定性。 7. 图片加载: 图像加载是Android应用常见的需求,Namana可能集成了像Glide或Picasso这样的图片...
它处理客户端(即Android应用)发送的请求,执行业务逻辑,验证用户输入,并与数据库交互来存储或检索数据。以下是关于PHP在构建此类系统时涉及的一些核心知识点: 1. **PHP基础**:PHP是一种开源的服务器端脚本...
为了提供良好的用户体验,我们需要捕获并显示Firebase抛出的错误。例如,当用户输入无效邮箱或密码时,我们可以显示自定义的错误提示。 **七、安全实践** 确保遵循最佳安全实践,如加密存储敏感信息,不要在客户端...
- **错误处理**:遇到的常见错误如网络请求失败、API调用错误等,需要学会正确捕获并处理,提供友好的用户体验。 - **界面设计**:利用微信小程序的wxml和wxss进行布局,理解flex布局和相对定位,提升界面的响应式...