Android 捕获App意外退出错误的日志信息

1.创建获取日志信息的类AppLogHandler,该类的功能是捕获导致应用程序意外退出的错误的日志信息,这里写的是一个错误保存一个log文件,保存到SD卡对应的目录下。代码如下:

package com.ryan.test.crash;

import java.io.File;
import java.io.FileOutputStream;
import java.lang.Thread.UncaughtExceptionHandler;

import android.content.Context;
import android.os.Environment;
import android.os.Looper;

public class AppLogHandler implements UncaughtExceptionHandler {

public static final boolean DEBUG = true;

public static final String AGR_LOG_DIRECOTORY = "agrlog";

private Thread.UncaughtExceptionHandler mDefaultHandler;

private static AppLogHandler instance;

private AppLogHandler() {
}

public static AppLogHandler getInstance() {
if (instance == null) {
instance = new AppLogHandler();
}
return instance;
}

public void init(Context context) {
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
}

@Override
public void uncaughtException(Thread thread, Throwable ex) {
if (!handleException(ex) && mDefaultHandler != null) {
mDefaultHandler.uncaughtException(thread, ex);
} else {
try {
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(10);
}
}

private boolean handleException(final Throwable ex) {
if (DEBUG) {
if (ex == null) {
return false;
}
final StackTraceElement[] stack = ex.getStackTrace();
final String message = ex.getMessage();
new Thread() {
@Override
public void run() {
Looper.prepare();
createLogDirectory();
String fileName = AGR_LOG_DIRECOTORY + "/crash-" + System.currentTimeMillis() + ".log";
File file = new File(
Environment.getExternalStorageDirectory(), fileName);
try {
FileOutputStream fos = new FileOutputStream(file, true);
fos.write(message.getBytes());
for (int i = 0; i < stack.length; i++) {
fos.write(stack[i].toString().getBytes());
}
fos.flush();
fos.close();
} catch (Exception e) {
}
Looper.loop();
}
}.start();
}
return false;
}

private void createLogDirectory() {
File file = new File(Environment.getExternalStorageDirectory(), AGR_LOG_DIRECOTORY);
try {
if (!file.exists() || !file.isDirectory()) {
file.mkdir();
}
} catch (Exception e) {
e.printStackTrace();
}
}

}


2.为了读取Logcat的信息并保存到SD卡中,必须添加对应的权限:

<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

3.新建MyApplication类继承自Application,在应用启动时开启对导致程序意外退出的错误的捕获:

import com.ryan.test.crash.AppLogHandler;

import android.app.Application;

public class MyApplication extends Application{

@Override
public void onCreate() {
super.onCreate();
AppLogHandler appLogHandler = AppLogHandler.getInstance();
appLogHandler.init(getApplicationContext());
}
}


4.为了使MyApplication生效,必须修改AndroidMenifest.xml文件:

<application
android:name="com.ryan.test.MyApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar">
<!-- 省略其他信息 -->
</application>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值