获取Android应用程序出错信息并将信息发送到指定邮件


前段时间做过一个反馈应用程序Bug的程序,今天和大家分享下

如果想要获取应用程序的出错信息则比较简单,只需要通过实现 UncaughtExceptionHandler就可以达到目的,那么如何获取Android OS 所有应用程序的出错信息,目前的方式只有通过修改框架层来达到此目的。

(一)首先,我们先来看如何获取应用程序的出错信息:

A) 继承UncaughtExceptionHandler的类

  1. package org.winplus.getex;  
  2.   
  3. import java.lang.Thread.UncaughtExceptionHandler;  
  4.   
  5. import android.content.Context;  
  6. import android.os.Looper;  
  7. import android.util.Log;  
  8. import android.widget.Toast;  
  9.   
  10. public class CrashHandler implements UncaughtExceptionHandler {  
  11.   
  12.     private final static String TAG = "UncaughtExceptionHandler";  
  13.     private Thread.UncaughtExceptionHandler mDefaultHandler;  
  14.     private static CrashHandler mInstance;  
  15.     private Context mContext;  
  16.     private CrashHandler() {  
  17.     }  
  18.   
  19.     /** 获取CrashHandler实例 ,单例模式 */  
  20.     public static CrashHandler getInstance() {  
  21.         if (mInstance == null)  
  22.             mInstance = new CrashHandler();  
  23.         return mInstance;  
  24.     }  
  25.   
  26.     @Override  
  27.     public void uncaughtException(Thread thread, Throwable throwable) {  
  28.         if (!handleException(throwable) && mDefaultHandler != null) {    
  29.             // 如果用户没有处理则让系统默认的异常处理器来处理     
  30.             mDefaultHandler.uncaughtException(thread, throwable);    
  31.         } else {    
  32.             // Sleep一会后结束程序     
  33.             // 来让线程停止一会是为了显示Toast信息给用户,然后Kill程序     
  34.             try {    
  35.                 Thread.sleep(3000);    
  36.             } catch (InterruptedException e) {    
  37.                 Log.e(TAG, "Error : ", e);    
  38.             }    
  39.             android.os.Process.killProcess(android.os.Process.myPid());    
  40.             System.exit(10);    
  41.         }    
  42.     }  
  43.       
  44.     private boolean handleException(Throwable ex) {    
  45.         if (ex == null) {    
  46.             return true;    
  47.         }    
  48.         final String msg = ex.getLocalizedMessage();    
  49.         // 使用Toast来显示异常信息     
  50.         new Thread() {    
  51.             @Override    
  52.             public void run() {    
  53.                 // Toast 显示需要出现在一个线程的消息队列中     
  54.                 Looper.prepare();    
  55.                 Toast.makeText(mContext, "Exception:" + msg, Toast.LENGTH_LONG).show();    
  56.                 Looper.loop();    
  57.             }    
  58.         }.start();    
  59.         return true;    
  60.     }    
  61.       
  62.     public void init(Context context) {    
  63.         mContext = context;    
  64.         mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();    
  65.         Thread.setDefaultUncaughtExceptionHandler(this);    
  66.     }    
  67.       
  68.   
  69. }  

B) 初始化并启动获取异常的线程类:CrashApplication

  1. import android.app.Application;  
  2.   
  3. public class CrashApplication extends Application {  
  4.   
  5.     @Override  
  6.     public void onCreate() {  
  7.         super.onCreate();  
  8.   
  9.         CrashHandler crashHandler = CrashHandler.getInstance();  
  10.         // 注册crashHandler   
  11.         crashHandler.init(getApplicationContext());  
  12.     }  
  13. }  

C) 记得修改AndroidManifest.xml文件~~~

D) 写一个用于测试的Activity

  1. public class GetExceptionActivity extends Activity {  
  2.     @Override  
  3.     public void onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.         setContentView(R.layout.main);  
  6.           
  7.         int i = 1/0;//除数不能为0 这里会抛出异常   
  8.     }  
  9. }
  • 1
  • 2
  • 下一页

相关内容