需求:当我们的应用异常崩溃之后,我们如何的了解和如何让用户主动反馈异常报告
1,第一步,构建一个自己的异常类,并实现下面的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
public class AppException extends Exception implements UncaughtExceptionHandler {
private Thread.UncaughtExceptionHandler mDefaultHandler;
private AppException() {
this.mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
}
/**
* 获取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;
}
final Context context = AppManager.getAppManager().currentActivity();
if (context == null) {
return false;
}
final String crashReport = getCrashReport(context, ex);
// 显示异常信息&发送报告
new Thread() {
public void run() {
Looper.prepare();
UIHelper.sendAppCrashReport(context, crashReport);
Looper.loop();
}
}.start();
return true;
}
/**
* 获取APP崩溃异常报告
*
* @param ex
* @return
*/
private String getCrashReport(Context context, Throwable ex) {
PackageInfo pinfo = ((AppContext) context.getApplicationContext())
.getPackageInfo();
StringBuffer exceptionStr = new StringBuffer();
exceptionStr.append("Version: " + pinfo.versionName + "("
+ pinfo.versionCode + ")n");
exceptionStr.append("Android: " + android.os.Build.VERSION.RELEASE
+ "(" + android.os.Build.MODEL + ")n");
exceptionStr.append("Exception: " + ex.getMessage() + "n");
StackTraceElement[] elements = ex.getStackTrace();
for (int i = 0; i < elements.length; i++) {
exceptionStr.append(elements[i].toString() + "n");
}
return exceptionStr.toString();
}
}
|
2.第二步 与用户交互的界面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
/**
* 发送App异常崩溃报告
* @param cont
* @param crashReport
*/
public static void sendAppCrashReport(final Context cont, final String crashReport)
{
AlertDialog.Builder builder = new AlertDialog.Builder(cont);
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setTitle(R.string.app_error);
builder.setMessage(R.string.app_error_message);
builder.setPositiveButton(R.string.submit_report, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
//发送异常报告
Intent i = new Intent(Intent.ACTION_SEND);
//i.setType("text/plain"); //模拟器
i.setType("message/rfc822") ; //真机
i.putExtra(Intent.EXTRA_EMAIL, new String[]{"你的邮箱"});
i.putExtra(Intent.EXTRA_SUBJECT,"Android客户端 - 错误报告");
i.putExtra(Intent.EXTRA_TEXT,crashReport);
cont.startActivity(Intent.createChooser(i, "发送错误报告"));
//退出
}
});
builder.setNegativeButton(R.string.sure, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
//退出
}
});
builder.show();
}
|
3.第三部 最重要的一步
自己实现一个 Application 在onCreate() 中添加下面的方法
1 2 |
//注册App异常崩溃处理器
Thread.setDefaultUncaughtExceptionHandler(AppException.getAppExceptionHandler());
|