您的位置:首页 > 移动开发 > Android开发

android 捕获应用异常并保存入日志文件中

2016-11-14 15:24 477 查看
本文参考了:http://blog.csdn.net/kevinmeng_ini58/article/details/7440810

首先这样做的好处是,当用户的手机运行我们的应用奔溃了的时候,我们可以向他要奔溃日志,来解决一些问题,这个很有用。

先上主要代码:

public class CrashHandler implements UncaughtExceptionHandler {
private Context mContext;
private UncaughtExceptionHandler mHandler;
private static CrashHandler crashHandler;
public static final String HOME_FILE = Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"TestLog"+File.separator;
private CrashHandler(){}

public static CrashHandler newInstence(){
if (crashHandler == null) {
synchronized (CrashHandler.class){
if (crashHandler == null) {
crashHandler = new CrashHandler();
}
}
}
return crashHandler;
}
/**
* 初始化信息
* @param context
*/
public void init(Context context){
mHandler = Thread.getDefaultUncaughtExceptionHandler();
mContext = context;
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
if (!handlerException(ex) && mHandler != null) {
mHandler.uncaughtException(thread,ex);
}else{
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
}
}

public boolean handlerException(Throwable ex){
if (ex == null) {
return false;
}
ex.printStackTrace();
changeExceptionToFileInfo(ex);
return true;
}

public void changeExceptionToFileInfo(Throwable ex){
String logName = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".log";
String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
StringWriter sw = new StringWriter();
sw.append(date).append("\n");
PackageManager packageManager = mContext.getPackageManager();
try {
PackageInfo pi = packageManager.getPackageInfo(mContext.getPackageName(), 0);
String versionName = pi.versionName;
int versionCode = pi.versionCode;
sw.append("r_" + "vn " + versionName + "_vc " + versionCode + "\n");
sw.append(android.os.Build.BRAND + " " + android.os.Build.MODEL + " Android " + android.os.Build.VERSION.RELEASE + "\n");
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
ex.printStackTrace(new PrintWriter(sw));
sw.append("*******************************************************").append("\n");
sw.append("*******************************************************").append("\n");
printToFile(logName,sw);

}

public void printToFile(String fileName,StringWriter sw) {
File file = new File(HOME_FILE, fileName);
FileWriter fw = null;
try {
File homeDir = new File(HOME_FILE);
if (!homeDir.exists()) {
homeDir.mkdirs();
}
if (!file.exists()) {
file.createNewFile();
}
fw = new FileWriter(file,true);
fw.write(sw.toString());
fw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}
}


使用方式是:
实现一个自己的application:
public class MyApplication extends Application {

    @Override

    public void onCreate() {

        super.onCreate();

        CrashHandler.newInstence().init(this);

    }

}

注册,我们自己的异常捕获类,就行了。
还有要注意的一点是,因为涉及到了,写文件操作,所有,需要权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 异常