- 浏览: 72963 次
- 性别:
- 来自: 西安
文章分类
- 全部博客 (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 716转载: Android自动化测试--Espresso框架 ... -
浅谈android中仅仅使用一个TextView实现高仿京东,淘宝各种倒计时
2016-11-01 09:54 1049转载:http://blog.csdn.net/u0130 ... -
利用apktool等工具发编译android apk
2016-10-25 09:15 712这个是我的csdn中的一篇关于android app反编译的文 ... -
Error:Execution failed for task ':app:mergeDebugResources'. > Some file crunchin
2016-10-08 10:30 996向studio中导入微信支付Demo的时候报错了,具体如图: ... -
android studio实用快捷键收集
2016-09-30 17:51 452本人用android studio刚开始,做一下笔记,只适用于 ... -
android中事件分发机制
2016-09-22 11:52 539转载自:http://www.cnblogs.com/linj ... -
一个对sharedpreferences 数据进行加密的开源库
2016-09-18 14:30 619http://www.cnblogs.com/zhaoyanj ... -
LinerLayout滑动后停在顶部
2016-09-18 12:08 653转载自:http://blog.csdn.net/ff2008 ... -
android studio入门知识
2016-09-06 18:11 688http://blog.csdn.net/jdsjlzx/ar ... -
android图片加载OOM解决方案
2016-08-30 15:17 456转载自:http://www.apkbus.com/blog- ... -
android oom连带问题,以及tag错位问题结局方案
2016-08-30 13:48 639http://www.apkbus.com/blog-8430 ... -
android新手指导
2016-08-30 11:59 370http://www.apkbus.com/forum.php ... -
android app自动化测试
2016-07-12 15:51 488android sdk的lib目录下有个monkeyrunne ... -
利用BadgeView实现数字提醒效果
2016-07-06 16:38 937BadgeView是一个第三方开源库, github地址:ht ... -
android端图片缓存实现,特别适用于listview来回滚动
2016-07-02 10:40 662转载自: http://www.open-open.com/l ... -
android文件存储文本
2016-05-17 17:26 464/** * 写入文本 */ private void ... -
android listView的BaseAdapter的抽取
2016-05-12 11:52 622/** * BaseAdapter的抽取 * @autho ... -
android第三方框架xutils的使用
2016-05-12 11:35 817这里写一些网络请求的相关 //初始化相关参数和对象 publi ... -
android端版本更新
2016-05-12 11:26 694整个思路,先判断服务端当前版本是不是高于本地版本,高的话可以选 ... -
android端从相册或者拍照读取图片
2016-04-16 16:45 792android端从相册或者拍照读取图片,见demo
相关推荐
网上找了很多资料都不能使用,后来自己参考写了这么一个 全局异常捕获并通过后台给指定的QQ邮箱发送 异常报告日志附件. 重点位置都已经注释了,其他的大家慢慢理解吧。 注意:QQ邮箱设置服务和生成授权码,...
Android捕获全局异常并写日志保存到sd卡,捕获异常消息后输出这个消息,可避免APP强制退出,抛出NullPointException玩玩哈,捕获全局异常是因为有的异常我们捕获不到,捕获时我们采用同步方法,以免单例多线程环境下...
该资源包含了一个android全局异常捕获的代码,当应用发生异常的时候,会将该异常存放到sdcard上。
Android 全局异常错误或崩溃捕捉。当出现崩溃,软件不会闪退,会出现弹出一个对话框,异常错误信息保存在sd卡一个文件夹下。后续需要还可以发送到服务器的。我博客网址: http://blog.csdn.net/qq_16064871。我写了...
Android捕获全局异常将错误信息发送到邮件,很好用的
android全局异常捕获 exception_global
Android全局异常捕获CrashHandler
涵盖全局异常捕获以及服务器加密上传
Android例子源码捕获应用全局异常避免强制退出并写出日志到sd卡
Android全局异常捕获 保存
本实例配套博文《Android 异常捕获》http://www.cnblogs.com/scetopcsa/p/4237595.html
android 全局异常处理 继承java.lang中的UncaughtExceptionHandler 的构造方法uncaughtException 来捕获异常
android为了防止应用崩溃 进行全局的捕获一下
全局异常捕获,并保存在本地,用户再次打开可以传到服务器
android全局异常捕获,全局捕获异常消息示例,当程序发生Uncaught异常的时候,有该类来接管程序,并记录错误日志,使用系统默认的UncaughtException处理类,实现自定义错误处理,收集错误信息 发送错误报告等操作,还...
android在产品上线以后为了能够实时捕获异常,需要写一个异常捕获的类,这个类在你遇到异常的时候会执行uncaughtException这个方法,然后你就可以对异常进行一些操作。
Android全局异常捕获
AndroidCrash全局崩溃异常捕获,友好的提示页面,收集手机信息+捕获异常信息,并上传到服务器,带重启APP功能。
Android中捕获全局异常信息,并使用系统级对话框显示
Android 全局异常捕获 今天就来说说作为程序猿的我们每天都会遇到的东西bug,出bug不可怕可怕的是没有出bug时的堆栈信息,那么对于bug的信息收集就显得尤为重要了,一般用第三方bugly或者友盟等等都能轻易收集,但是由于...