`
- 浏览:
2108414 次
- 性别:
- 来自:
深圳
-
CrashHandler
-
packageorg.wp.activity;
-
-
importjava.io.File;
-
importjava.io.FileOutputStream;
-
importjava.io.FilenameFilter;
-
importjava.io.PrintWriter;
-
importjava.io.StringWriter;
-
importjava.io.Writer;
-
importjava.lang.Thread.UncaughtExceptionHandler;
-
importjava.lang.reflect.Field;
-
importjava.util.Arrays;
-
importjava.util.Properties;
-
importjava.util.TreeSet;
-
-
importandroid.content.Context;
-
importandroid.content.pm.PackageInfo;
-
importandroid.content.pm.PackageManager;
-
importandroid.content.pm.PackageManager.NameNotFoundException;
-
importandroid.os.Build;
-
importandroid.os.Looper;
-
importandroid.util.Log;
-
importandroid.widget.Toast;
-
-
-
-
-
-
-
-
-
-
-
-
-
publicclassCrashHandlerimplementsUncaughtExceptionHandler{
-
-
publicstaticfinalStringTAG="CrashHandler";
-
-
publicstaticfinalbooleanDEBUG=true;
-
-
privatestaticCrashHandlerINSTANCE;
-
-
privateContextmContext;
-
-
privateThread.UncaughtExceptionHandlermDefaultHandler;
-
-
-
privatePropertiesmDeviceCrashInfo=newProperties();
-
privatestaticfinalStringVERSION_NAME="versionName";
-
privatestaticfinalStringVERSION_CODE="versionCode";
-
privatestaticfinalStringSTACK_TRACE="STACK_TRACE";
-
-
privatestaticfinalStringCRASH_REPORTER_EXTENSION=".cr";
-
-
-
privateCrashHandler(){
-
}
-
-
-
publicstaticCrashHandlergetInstance(){
-
if(INSTANCE==null)
-
INSTANCE=newCrashHandler();
-
returnINSTANCE;
-
}
-
-
-
-
-
-
-
publicvoidinit(Contextctx){
-
mContext=ctx;
-
mDefaultHandler=Thread.getDefaultUncaughtExceptionHandler();
-
Thread.setDefaultUncaughtExceptionHandler(this);
-
}
-
-
-
-
-
@Override
-
publicvoiduncaughtException(Threadthread,Throwableex){
-
if(!handleException(ex)&&mDefaultHandler!=null){
-
-
mDefaultHandler.uncaughtException(thread,ex);
-
}else{
-
-
-
try{
-
Thread.sleep(3000);
-
}catch(InterruptedExceptione){
-
Log.e(TAG,"Error:",e);
-
}
-
android.os.Process.killProcess(android.os.Process.myPid());
-
System.exit(10);
-
}
-
}
-
-
-
-
-
-
-
-
privatebooleanhandleException(Throwableex){
-
if(ex==null){
-
returntrue;
-
}
-
finalStringmsg=ex.getLocalizedMessage();
-
-
newThread(){
-
@Override
-
publicvoidrun(){
-
-
Looper.prepare();
-
Toast.makeText(mContext,"程序出错啦:"+msg,Toast.LENGTH_LONG).show();
-
Looper.loop();
-
}
-
}.start();
-
-
collectCrashDeviceInfo(mContext);
-
-
StringcrashFileName=saveCrashInfoToFile(ex);
-
-
sendCrashReportsToServer(mContext);
-
returntrue;
-
}
-
-
-
-
-
-
-
publicvoidcollectCrashDeviceInfo(Contextctx){
-
try{
-
-
-
-
PackageManagerpm=ctx.getPackageManager();
-
-
-
-
-
PackageInfopi=pm.getPackageInfo(ctx.getPackageName(),PackageManager.GET_ACTIVITIES);
-
if(pi!=null){
-
-
-
mDeviceCrashInfo.put(VERSION_NAME,pi.versionName==null?"notset":pi.versionName);
-
-
-
mDeviceCrashInfo.put(VERSION_CODE,pi.versionCode);
-
}
-
}catch(NameNotFoundExceptione){
-
Log.e(TAG,"Errorwhilecollectpackageinfo",e);
-
}
-
-
-
-
Field[]fields=Build.class.getDeclaredFields();
-
for(Fieldfield:fields){
-
try{
-
-
-
-
field.setAccessible(true);
-
mDeviceCrashInfo.put(field.getName(),field.get(null));
-
if(DEBUG){
-
Log.d(TAG,field.getName()+":"+field.get(null));
-
}
-
}catch(Exceptione){
-
Log.e(TAG,"Errorwhilecollectcrashinfo",e);
-
}
-
}
-
}
-
-
-
-
-
-
-
-
privateStringsaveCrashInfoToFile(Throwableex){
-
Writerinfo=newStringWriter();
-
PrintWriterprintWriter=newPrintWriter(info);
-
-
-
ex.printStackTrace(printWriter);
-
-
-
Throwablecause=ex.getCause();
-
while(cause!=null){
-
cause.printStackTrace(printWriter);
-
cause=cause.getCause();
-
}
-
-
-
Stringresult=info.toString();
-
printWriter.close();
-
mDeviceCrashInfo.put(STACK_TRACE,result);
-
-
try{
-
longtimestamp=System.currentTimeMillis();
-
StringfileName="crash-"+timestamp+CRASH_REPORTER_EXTENSION;
-
-
FileOutputStreamtrace=mContext.openFileOutput(fileName,Context.MODE_PRIVATE);
-
mDeviceCrashInfo.store(trace,"");
-
trace.flush();
-
trace.close();
-
returnfileName;
-
}catch(Exceptione){
-
Log.e(TAG,"anerroroccuredwhilewritingreportfile...",e);
-
}
-
returnnull;
-
}
-
-
-
-
-
-
-
privatevoidsendCrashReportsToServer(Contextctx){
-
String[]crFiles=getCrashReportFiles(ctx);
-
if(crFiles!=null&&crFiles.length>0){
-
TreeSet<String>sortedFiles=newTreeSet<String>();
-
sortedFiles.addAll(Arrays.asList(crFiles));
-
-
for(StringfileName:sortedFiles){
-
Filecr=newFile(ctx.getFilesDir(),fileName);
-
postReport(cr);
-
cr.delete();
-
}
-
}
-
}
-
-
-
-
-
-
-
-
privateString[]getCrashReportFiles(Contextctx){
-
FilefilesDir=ctx.getFilesDir();
-
-
FilenameFilterfilter=newFilenameFilter(){
-
-
-
publicbooleanaccept(Filedir,Stringname){
-
returnname.endsWith(CRASH_REPORTER_EXTENSION);
-
}
-
};
-
-
-
returnfilesDir.list(filter);
-
}
-
-
privatevoidpostReport(Filefile){
-
-
-
-
}
-
-
-
-
-
publicvoidsendPreviousReportsToServer(){
-
sendCrashReportsToServer(mContext);
-
}
-
}
CrashApplication
-
packageorg.wp.activity;
-
-
importandroid.app.Application;
-
-
-
-
-
-
-
-
publicclassCrashApplicationextendsApplication{
-
@Override
-
publicvoidonCreate(){
-
super.onCreate();
-
CrashHandlercrashHandler=CrashHandler.getInstance();
-
-
crashHandler.init(getApplicationContext());
-
-
crashHandler.sendPreviousReportsToServer();
-
}
-
}
在AndroidManifest.xml中注册
-
<?xmlversion="1.0"encoding="utf-8"?>
-
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
-
package="org.wp.activity"android:versionCode="1"android:versionName="1.0">
-
<applicationandroid:icon="@drawable/icon"android:label="@string/app_name"
-
android:name=".CrashApplication"android:debuggable="true">
-
<activityandroid:name=".MainActivity"android:label="@string/app_name">
-
<intent-filter>
-
<actionandroid:name="android.intent.action.MAIN"/>
-
<categoryandroid:name="android.intent.category.LAUNCHER"/>
-
</intent-filter>
-
</activity>
-
</application>
-
<uses-sdkandroid:minSdkVersion="8"/>
-
</manifest>
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
android 全局异常处理 继承java.lang中的UncaughtExceptionHandler 的构造方法uncaughtException 来捕获异常
android工程全局异常处理-将未处理异常日志保存在文件中,可后续开发提交至服务器
初始化,把当前对象设置成UncaughtExceptionHandler处理器,处理异常时我们还可以把异常信息写入文件,以供后来分析。 保存错误信息到文件中 返回文件名称,我们定义了saveCrashInfo2File(Throwable ex)...
Android 全局异常处理,存储本地及上传服务器
android全局异常捕获,全局捕获异常消息示例,当程序发生Uncaught异常的时候,有该类来接管程序,并记录错误日志,使用系统默认的UncaughtException处理类,实现自定义错误处理,收集错误信息 发送错误报告等操作,还...
Android全局异常捕获CrashHandler
Android 捕获全局异常处理,崩溃前弹出提示框,错误信息保存至本地文件或发送邮件,或上传至后台服务器。
android 异常处理 对异常进行全局捕捉,很实用,特别是产品发布后可以使用该方法。
AndroidCrash全局崩溃异常捕获,友好的提示页面,收集手机信息+捕获异常信息,并上传到服务器,带重启APP功能。
android开发过程中,捕获全局异常,然后关闭程序
Android 全局异常捕获 今天就来说说作为程序猿的我们每天都会遇到的东西bug,出bug不可怕可怕的是没有出bug时的堆栈信息,那么对于bug的信息收集就显得尤为重要了,一般用第三方bugly或者友盟等等都能轻易收集,但是由于...
Android开发中异常捕获,异常信息捕获后存储在sd文件中,可跟踪。
Android 异常捕获以及上传到服务器
android_exception_handler Android上的全局异常处理
Android Crash Helper。安卓APP自定义异常处理器,Release状态下意外奔溃提示更加友好(代替系统默认的那个讨厌的对话框),不影响Debug模式下LogCat的打印。 ***************************************************...
主要为大家介绍了Android全局异常的捕获处理,为什么要进行捕获处理,如何进行捕获处理,想要了解的朋友可以参考一下
详细介绍了android程序中的全局异常处理,示例代码。
该工具类是对Retrofit2+Rxjava2网络请求异常统一封装处理,将onError(Throwable e)中得异常转化成具体的错误信息。除了提示用户以外,还方便开发者准确定位Bug的所在。
在Android中有的未知的Bug可能在测试中没有及时发现,导致用户在使用时出现程序奔溃,出现用户...android提供了Thread.UncaughtExceptionHandler接口,可以通过实现这个接口,在全局中捕获异常并处理,上传到服务器。