2015-04-21 32 views
0

我使用airbrake趕上崩潰一旦報告提示用戶發送應用程序崩潰信息,以空中剎車

的應用程序崩潰,我可以看到儀表盤上的報告,但在我的應用程序要求沒有警報用戶轉到「發送錯誤報告」。如何啓用airbrake警報以要求用戶發送崩潰報告。在airbrake文檔中找不到與此相關的任何內容。謝謝。

回答

0

閱讀您鏈接到AirbrakeNotifier代碼顯示它automatically sends crashes儘快。

您將不得不修改此類以詢問用戶是否發送崩潰,例如,下一次初始化Airbrake類。

例如,HockeyApp有一個選項可以在其CrashManager類中執行此操作。

儘管我更喜歡總是自動發送崩潰報告給服務器,通常沒有理由打擾用戶請求。

-1

如果你想發送崩潰報告發送你可以讓類來處理UnCaughtException將處理所有崩潰異常。你可以這樣寫代碼:

import java.io.File; 
import java.io.PrintWriter; 
import java.io.StringWriter; 
import java.io.Writer; 
import java.lang.Thread.UncaughtExceptionHandler; 
import java.util.Date; 
import java.util.Locale; 

import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.pm.PackageInfo; 
import android.content.pm.PackageManager; 
import android.os.Environment; 
import android.os.Looper; 
import android.os.StatFs; 
import android.util.Log; 

public class UnCaughtException implements UncaughtExceptionHandler { 

    private Context context; 
    private static Context context1; 

    public UnCaughtException(Context ctx) { 
     context = ctx; 
     context1 = ctx; 
    } 

    private StatFs getStatFs() { 
     File path = Environment.getDataDirectory(); 
     return new StatFs(path.getPath()); 
    } 

    private long getAvailableInternalMemorySize(StatFs stat) { 
     long blockSize = stat.getBlockSize(); 
     long availableBlocks = stat.getAvailableBlocks(); 
     return availableBlocks * blockSize; 
    } 

    private long getTotalInternalMemorySize(StatFs stat) { 
     long blockSize = stat.getBlockSize(); 
     long totalBlocks = stat.getBlockCount(); 
     return totalBlocks * blockSize; 
    } 

    private void addInformation(StringBuilder message) { 
     message.append("Locale: ").append(Locale.getDefault()).append('\n'); 
     try { 
      PackageManager pm = context.getPackageManager(); 
      PackageInfo pi; 
      pi = pm.getPackageInfo(context.getPackageName(), 0); 
      message.append("Version: ").append(pi.versionName).append('\n'); 
      message.append("Package: ").append(pi.packageName).append('\n'); 

     } catch (Exception e) { 
      Log.e("CustomExceptionHandler", "Error", e); 
      message.append("Could not get Version information for ").append(
        context.getPackageName()); 
     } 
     message.append("Phone Model: ").append(android.os.Build.MODEL) 
       .append('\n'); 
     message.append("Android Version: ") 
       .append(android.os.Build.VERSION.RELEASE).append('\n'); 
     message.append("Board: ").append(android.os.Build.BOARD).append('\n'); 
     message.append("Brand: ").append(android.os.Build.BRAND).append('\n'); 
     message.append("Device: ").append(android.os.Build.DEVICE).append('\n'); 
     message.append("Host: ").append(android.os.Build.HOST).append('\n'); 
     message.append("ID: ").append(android.os.Build.ID).append('\n'); 
     message.append("Model: ").append(android.os.Build.MODEL).append('\n'); 
     message.append("Product: ").append(android.os.Build.PRODUCT) 
       .append('\n'); 
     message.append("Type: ").append(android.os.Build.TYPE).append('\n'); 
     StatFs stat = getStatFs(); 
     message.append("Total Internal memory: ") 
       .append(getTotalInternalMemorySize(stat)).append('\n'); 
     message.append("Available Internal memory: ") 
       .append(getAvailableInternalMemorySize(stat)).append('\n'); 
    } 

    public void uncaughtException(Thread t, Throwable e) { 
     try { 
      StringBuilder report = new StringBuilder(); 
      Date curDate = new Date(); 
      report.append("Error Report collected on : ") 
        .append(curDate.toString()).append('\n').append('\n'); 
      report.append("Informations :").append('\n'); 
      addInformation(report); 
      report.append('\n').append('\n'); 
      report.append("Stack:\n"); 
      final Writer result = new StringWriter(); 
      final PrintWriter printWriter = new PrintWriter(result); 
      e.printStackTrace(printWriter); 
      report.append(result.toString()); 
      printWriter.close(); 
      report.append('\n'); 
      report.append("**** End of current Report ***"); 
      Log.e(UnCaughtException.class.getName(), 
        "Error while sendErrorMail" + report); 
      sendErrorMail(report); 
     } catch (Throwable ignore) { 
      Log.e(UnCaughtException.class.getName(), 
        "Error while sending error e-mail", ignore); 
     } 
    } 

    /** 
    * This method for call alert dialog when application crashed! 
    */ 
    public void sendErrorMail(final StringBuilder errorContent) { 
     final AlertDialog.Builder builder = new AlertDialog.Builder(context); 
     new Thread() { 
      @Override 
      public void run() { 
       Looper.prepare(); 
       builder.setTitle("Sorry...!"); 
       builder.create(); 
       builder.setNegativeButton("Cancel", 
         new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, 
            int which) { 
           System.exit(0); 
          } 
         }); 
       builder.setPositiveButton("Report", 
         new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, 
            int which) { 
           Intent sendIntent = new Intent(
             Intent.ACTION_SEND); 
           String subject = "Your App crashed! Fix it!"; 
           StringBuilder body = new StringBuilder("Yoddle"); 
           body.append('\n').append('\n'); 
           body.append(errorContent).append('\n') 
             .append('\n'); 
           // sendIntent.setType("text/plain"); 
           sendIntent.setType("message/rfc822"); 
           sendIntent 
             .putExtra(
               Intent.EXTRA_EMAIL, 
               new String[] { "[email protected]" }); 
           sendIntent.putExtra(Intent.EXTRA_TEXT, 
             body.toString()); 
           sendIntent.putExtra(Intent.EXTRA_SUBJECT, 
             subject); 
           sendIntent.setType("message/rfc822"); 
           context1.startActivity(sendIntent); 
           System.exit(0); 
          } 
         }); 
       builder.setMessage("Oops,Your application has crashed."); 
       builder.show(); 
       Looper.loop(); 
      } 
     }.start(); 
    } 

} 

,並在每Class文件中聲明這個異常類來獲得每個崩潰日誌。下面的代碼,你可以使用在Activity或任何其他類中添加:

Thread.setDefaultUncaughtExceptionHandler(new UnCaughtException(
       YourActivity.this)); 
+0

謝謝,但爲了發送崩潰報告,我正在使用airbrake SDK。我只需要向用戶顯示警報,以選擇是否要將報告發送到空氣制動器。 – Bhavna

+0

我認爲她在問題中提到她正在使用'airbrake'! –

相關問題