歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 獲取Android應用程序出錯信息並將信息發送到指定郵件

獲取Android應用程序出錯信息並將信息發送到指定郵件

日期:2017/3/1 10:23:25   编辑:Linux編程

前段時間做過一個反饋應用程序Bug的程序,今天和大家分享下

如果想要獲取應用程序的出錯信息則比較簡單,只需要通過實現 UncaughtExceptionHandler就可以達到目的,那麼如何獲取Android OS 所有應用程序的出錯信息,目前的方式只有通過修改框架層來達到此目的。

(一)首先,我們先來看如何獲取應用程序的出錯信息:

A) 繼承UncaughtExceptionHandler的類

  1. package org.winplus.getex;
  2. import java.lang.Thread.UncaughtExceptionHandler;
  3. import android.content.Context;
  4. import android.os.Looper;
  5. import android.util.Log;
  6. import android.widget.Toast;
  7. public class CrashHandler implements UncaughtExceptionHandler {
  8. private final static String TAG = "UncaughtExceptionHandler";
  9. private Thread.UncaughtExceptionHandler mDefaultHandler;
  10. private static CrashHandler mInstance;
  11. private Context mContext;
  12. private CrashHandler() {
  13. }
  14. /** 獲取CrashHandler實例 ,單例模式 */
  15. public static CrashHandler getInstance() {
  16. if (mInstance == null)
  17. mInstance = new CrashHandler();
  18. return mInstance;
  19. }
  20. @Override
  21. public void uncaughtException(Thread thread, Throwable throwable) {
  22. if (!handleException(throwable) && mDefaultHandler != null) {
  23. // 如果用戶沒有處理則讓系統默認的異常處理器來處理
  24. mDefaultHandler.uncaughtException(thread, throwable);
  25. } else {
  26. // Sleep一會後結束程序
  27. // 來讓線程停止一會是為了顯示Toast信息給用戶,然後Kill程序
  28. try {
  29. Thread.sleep(3000);
  30. } catch (InterruptedException e) {
  31. Log.e(TAG, "Error : ", e);
  32. }
  33. android.os.Process.killProcess(android.os.Process.myPid());
  34. System.exit(10);
  35. }
  36. }
  37. private boolean handleException(Throwable ex) {
  38. if (ex == null) {
  39. return true;
  40. }
  41. final String msg = ex.getLocalizedMessage();
  42. // 使用Toast來顯示異常信息
  43. new Thread() {
  44. @Override
  45. public void run() {
  46. // Toast 顯示需要出現在一個線程的消息隊列中
  47. Looper.prepare();
  48. Toast.makeText(mContext, "Exception:" + msg, Toast.LENGTH_LONG).show();
  49. Looper.loop();
  50. }
  51. }.start();
  52. return true;
  53. }
  54. public void init(Context context) {
  55. mContext = context;
  56. mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
  57. Thread.setDefaultUncaughtExceptionHandler(this);
  58. }
  59. }

B) 初始化並啟動獲取異常的線程類:CrashApplication

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

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. int i = 1/0;//除數不能為0 這裡會拋出異常
  7. }
  8. }
Copyright © Linux教程網 All Rights Reserved