歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

獲取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. }
Copyright © Linux教程網 All Rights Reserved