2010-05-17 85 views
17

我們現在正在與幾位朋友測試我們的應用程序。有時會出現一些不會拋出異常的錯誤。所以我真的不知道問題是什麼。所以我認爲實現一個允許將logcat輸出發送到電子郵件地址的菜單項是個好主意,這樣我們就可以檢查日誌。將App的Logcat輸出發送到EmailAdress

不幸的是,我沒有在互聯網上找到如何從手機中提取logcat的提示。如何發送電子郵件不應該是問題。

回答

13

看看 android-log-collector,因爲它做你正在做的事情。

從Android 4.1開始,不可能收集任意的LogCat數據。從來沒有一個記錄和支持的方式來做到這一點,以及無證/無支持的方式was locked down in Jelly Bean。對於你自己的崩潰,你最好使用崩潰日誌庫,如ACRA

+0

嗯,謝謝。所以我必須將源代碼添加到我的項目中或在手機上安裝應用程序。對? – RoflcoptrException 2010-05-17 20:21:03

+0

你不得不問他們,因爲我沒有用過他們的東西。至少,你可以看看他們的源代碼,看看他們如何閱讀日誌。 – CommonsWare 2010-05-17 20:59:39

+0

嗯是的,我在開發人員可以使用它的頁面上閱讀,但是沒有文檔,我不知道如何啓動它。但感謝 – RoflcoptrException 2010-05-17 21:06:41

7

我還會研究Flurry(flurry.com),它不僅可以給你一般的分析,還可以記錄任意信息並記錄未捕獲的異常。我在5分鐘內設置了它,但有一點需要記住的是它不是實時的電子郵件警報。您必須等待幾個小時才能登錄您的應用,並在其儀表板上顯示。如果你有一個非常輕量級的應用程序,它也可能是矯枉過正的,但我注意到,由於使用該服務,我的應用程序沒有性能損失。

0

感謝您2,但通過瀏覽Android的日誌收集論壇上,我發現了一個solution這是更容易處理:

在那裏,你可以在服務器上存儲一些PHP文件(或者,如果你不想要使用您自己的服務器,他們的服務器上也有一個腳本)。在這個php文件中,你可以定義郵件到達服務器時應該做什麼。我只是定義了一個將數據轉發給我的郵件地址的非常簡單的代碼。

這隻適用於未拋出異常的情況。但是可以擴展默認的未捕獲異常處理程序,這樣不僅可以獲取堆棧跟蹤,還可以獲取logcat。

+1

此鏈接已中斷,您可以升級它或者發佈源代碼? – gobernador 2012-03-07 02:32:12

+0

是的,它壞了,我找不到一個新的。但正如你可能已經看到答案已經快2年了。 – 2012-03-07 09:11:24

+0

這是一箇舊的鏈接。我正在研究並嘗試做這件事,我只是想知道你是否知道它在哪裏。無論如何,我會嘗試另一個答案。 – gobernador 2012-03-07 16:38:35

3

我肯定會推薦也來看看這個項目here

6

我發現LogCollector非常有用的確(從CommonsWare尖端):

而且不要忘記在自己的應用程序設置:

<uses-permission android:name="android.permission.READ_LOGS" /> 
+0

LogCollector似乎記錄一些垃圾,而不是我的應用程序的日誌。沒有一條線。 – djdance 2014-08-28 19:31:34

+1

LogCollector似乎已經死亡。自2012年以來沒有任何活動。 – 2014-10-01 07:44:45

1

此解決方案不會發送電子郵件,而是通過UDP將其發送到服務器。

https://github.com/Chemik/logcatudp

的源代碼是可用的。它可以輕鬆嵌入到我們自己的應用程序中。我沒有試圖這樣做。

+0

Logcat到UDP源已經轉移到https://github.com/Chemik/logcatudp。 BTW應用程序可以發送日誌到電子郵件或使用任何其他安裝的應用程序共享。 – Chemik 2015-03-13 22:11:11

1

在您的清單文件提供以下權限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

在你的第一個/發射活動,以下線的

super.onCreate(savedInstanceState); 

寫之後:這會寫你的應用程序的logcat的到您的設備的外部存儲

 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, EXTERNAL_PERMISSION_CODE); 
    } 
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, READ_PERMISSION_CODE); 
    } 

    if (isExternalStorageWritable()) { 

     File appDirectory = new File(Environment.getExternalStorageDirectory() + "/MyAppLog"); 
     File logDirectory = new File(appDirectory + "/log"); 
     File logFile = new File(logDirectory, "logcat" + ".txt"); 

     // create app folder 
     if (!appDirectory.exists()) { 
      appDirectory.mkdir(); 
     } 

     // create log folder 
     if (!logDirectory.exists()) { 
      logDirectory.mkdir(); 
     } 

     // clear the previous logcat and then write the new one to the file 
     if (logFile.exists()){ 
      logFile.delete(); 
     } 

     try { 
      Process process = Runtime.getRuntime().exec("logcat -c"); 
      process = Runtime.getRuntime().exec("logcat -f " + logFile); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } else if (isExternalStorageReadable()) { 
     // only readable 
    } else { 
     // not accessible 
    } 

要發送logcat到所需的電子郵件添加RESS:用以下方法

public void sendLogcatMail(){ 

    if (isExternalStorageWritable()) { 

     File appDirectory = new File(Environment.getExternalStorageDirectory() + "/MyAppLog"); 
     File logDirectory = new File(appDirectory + "/log"); 
     File logFile = new File(logDirectory, "logcat" + ".txt"); 

     if (logFile.exists()) { 
      Intent emailIntent = new Intent(Intent.ACTION_SEND); 
      emailIntent.setType("vnd.android.cursor.dir/email"); 
      String to[] = {"[email protected]"}; 
      emailIntent.putExtra(Intent.EXTRA_EMAIL, to); 
      emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(String.valueOf(logFile.toURI()))); 
      emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Log files"); 
      emailIntent.putExtra(Intent.EXTRA_TEXT, "Send some message along"); 
      startActivity(Intent.createChooser(emailIntent, "Send email...")); 
     } 
    } 
} 

方法檢查寫入外部存儲的權限是否被賦予與否:

/*檢查,如果外部存儲空間可用於讀取和寫入*/

public static boolean isExternalStorageWritable() { 
    String state = Environment.getExternalStorageState(); 
    if (Environment.MEDIA_MOUNTED.equals(state)) { 
     return true; 
    } 
    return false; 
}