android 异常打印
【摘要】 Log.e注意问题:
"find bar"字符串中间有空格,所有搜索不到,但是用下划线连接起来,过滤日志时就能搜到。
Log.e("find bar",points[0].toString());
package com.lbstock; import java.io.File; import java.io.FileNotFoundEx...
Log.e注意问题:
"find bar"字符串中间有空格,所有搜索不到,但是用下划线连接起来,过滤日志时就能搜到。
Log.e("find bar",points[0].toString());
-
package com.lbstock;
-
-
import java.io.File;
-
import java.io.FileNotFoundException;
-
import java.io.FileOutputStream;
-
import java.io.IOException;
-
import java.io.PrintWriter;
-
import java.io.StringWriter;
-
import java.io.Writer;
-
import java.lang.Thread.UncaughtExceptionHandler;
-
import java.lang.reflect.Field;
-
import java.text.SimpleDateFormat;
-
import java.util.Date;
-
import java.util.HashMap;
-
import java.util.Map;
-
-
import android.content.Context;
-
import android.content.pm.PackageInfo;
-
import android.content.pm.PackageManager;
-
import android.content.pm.PackageManager.NameNotFoundException;
-
import android.os.Build;
-
import android.os.Environment;
-
import android.os.Looper;
-
import android.util.Log;
-
import android.widget.Toast;
-
-
/**
-
* UncaughtException处理类,当程序发生Uncaught异常的时候,由该类来接管程序,并记录发送错误报告.
-
* @author way
-
*/
-
public class CrashHandler implements UncaughtExceptionHandler {
-
private static final String TAG = "CrashHandler";
-
private Thread.UncaughtExceptionHandler mDefaultHandler;// 系统默认的UncaughtException处理类
-
private static CrashHandler INSTANCE = new CrashHandler();// CrashHandler实例
-
private Context mContext;// 程序的Context对象
-
private Map<String, String> info = new HashMap<String, String>();// 用来存储设备信息和异常信息
-
private SimpleDateFormat format = new SimpleDateFormat(
-
"yyyy-MM-dd-HH-mm-ss");// 用于格式化日期,作为日志文件名的一部分
-
-
/** 保证只有一个CrashHandler实例 */
-
private CrashHandler() {
-
-
}
-
-
/** 获取CrashHandler实例 ,单例模式 */
-
public static CrashHandler getInstance() {
-
return INSTANCE;
-
}
-
public void init(Context context) {
-
mContext = context;
-
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();// 获取系统默认的UncaughtException处理器
-
Thread.setDefaultUncaughtExceptionHandler(this);// 设置该CrashHandler为程序的默认处理器
-
}
-
-
/**
-
* 当UncaughtException发生时会转入该重写的方法来处理
-
*/
-
public void uncaughtException(Thread thread, Throwable ex) {
-
if (!handleException(ex) && mDefaultHandler != null) {
-
// 如果自定义的没有处理则让系统默认的异常处理器来处理
-
mDefaultHandler.uncaughtException(thread, ex);
-
} else {
-
try {
-
Thread.sleep(3000);// 如果处理了,让程序继续运行3秒再退出,保证文件保存并上传到服务器
-
} catch (InterruptedException e) {
-
e.printStackTrace();
-
}
-
// 退出程序
-
android.os.Process.killProcess(android.os.Process.myPid());
-
System.exit(1);
-
}
-
}
-
-
/**
-
* 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
-
* @param ex 异常信息
-
* @return true 如果处理了该异常信息;否则返回false.
-
*/
-
public boolean handleException(Throwable ex) {
-
if (ex == null)
-
return false;
-
new Thread() {
-
public void run() {
-
Looper.prepare();
-
Log.e("lbsotck",String.valueOf(ex.getMessage()));
-
Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出", Toast.LENGTH_LONG).show();
-
Looper.loop();
-
}
-
}.start();
-
// 收集设备参数信息
-
collectDeviceInfo(mContext);
-
// 保存日志文件
-
saveCrashInfo2File(ex);
-
return true;
-
}
-
-
/**
-
* 收集设备参数信息
-
* @param context
-
*/
-
public void collectDeviceInfo(Context context) {
-
try {
-
PackageManager pm = context.getPackageManager();// 获得包管理器
-
PackageInfo pi = pm.getPackageInfo(context.getPackageName(),
-
PackageManager.GET_ACTIVITIES);// 得到该应用的信息,即主Activity
-
if (pi != null) {
-
String versionName = pi.versionName == null ? "null"
-
: pi.versionName;
-
String versionCode = pi.versionCode + "";
-
info.put("versionName", versionName);
-
info.put("versionCode", versionCode);
-
}
-
} catch (NameNotFoundException e) {
-
e.printStackTrace();
-
}
-
-
Field[] fields = Build.class.getDeclaredFields();// 反射机制
-
for (Field field : fields) {
-
try {
-
field.setAccessible(true);
-
info.put(field.getName(), field.get("").toString());
-
Log.d(TAG, field.getName() + ":" + field.get(""));
-
} catch (IllegalArgumentException e) {
-
e.printStackTrace();
-
} catch (IllegalAccessException e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
-
private String saveCrashInfo2File(Throwable ex) {
-
StringBuffer sb = new StringBuffer();
-
for (Map.Entry<String, String> entry : info.entrySet()) {
-
String key = entry.getKey();
-
String value = entry.getValue();
-
sb.append(key + "=" + value + "\r\n");
-
}
-
Writer writer = new StringWriter();
-
PrintWriter pw = new PrintWriter(writer);
-
ex.printStackTrace(pw);
-
Throwable cause = ex.getCause();
-
// 循环着把所有的异常信息写入writer中
-
while (cause != null) {
-
cause.printStackTrace(pw);
-
cause = cause.getCause();
-
}
-
pw.close();// 记得关闭
-
String result = writer.toString();
-
sb.append(result);
-
// 保存文件
-
long timetamp = System.currentTimeMillis();
-
String time = format.format(new Date());
-
// String fileName = "crash-" + time + "-" + timetamp + ".log";
-
String fileName = "crash-" + time + ".log";
-
if (Environment.getExternalStorageState().equals(
-
Environment.MEDIA_MOUNTED)) {
-
try {
-
File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "1lbg");
-
Log.i("CrashHandler", dir.toString());
-
if (!dir.exists())
-
dir.mkdir();
-
FileOutputStream fos = new FileOutputStream(new File(dir,
-
fileName));
-
fos.write(sb.toString().getBytes());
-
fos.close();
-
return fileName;
-
} catch (FileNotFoundException e) {
-
e.printStackTrace();
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
return null;
-
}
-
}
文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/jacke121/article/details/55684163
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)