2011-09-12 12 views
2

私のアプリケーションのクラッシュレポートをトレースするためにUncaught例外ハンドラを実装しています。メールフォームを送信できません。例外ハンドラ名はTopExceptionHandlerです。TopExceptionHandler.javaでこのコードを使用していますUncaught Excepetion Handlerから電子メールを送信するには?

public class TopExceptionHandler implements Thread.UncaughtExceptionHandler 
{ 
private Thread.UncaughtExceptionHandler defaultUEH; 

private Activity app = null; 

public TopExceptionHandler(Activity app) 
{ 
this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler(); 
this.app = app; 


} 



@Override 
public void uncaughtException(Thread t, Throwable e) 
{ 

    StackTraceElement[] arr = e.getStackTrace(); 
    String report = e.toString()+"\n\n"; 
    report += "--------- Stack trace ---------\n\n"; 
    for (int i=0; i<arr.length; i++) 
    { 
    report += " "+arr[i].toString()+"\n"; 
    } 
    report += "-------------------------------\n\n"; 

    // If the exception was thrown in a background thread inside 
    // AsyncTask, then the actual exception can be found with getCause 
    report += "--------- Cause ---------\n\n"; 
    Throwable cause = e.getCause(); 
    if(cause != null) { 
    report += cause.toString() + "\n\n"; 
    arr = cause.getStackTrace(); 
    for (int i=0; i<arr.length; i++) 
    { 
    report += " "+arr[i].toString()+"\n"; 
    } 
    } 
    report += "-------------------------------\n\n"; 

    Log.v("report", report); 

    try { 
    FileOutputStream trace = app.openFileOutput(
    "stack.trace", Context.MODE_PRIVATE); 
    trace.write(report.getBytes()); 
    trace.close(); 
    } catch(IOException ioe) { 
    // ... 
    } 




    sendEmail(report); 




    defaultUEH.uncaughtException(t, e); 


} 


private void sendEmail(String report) 
{ 

    try{ 
    Intent sendIntent = new Intent(Intent.ACTION_SEND); 
    sendIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    String subject = "Error report"; 
    String body = 
    "Mail this to [email protected]: "+ 
    "\n\n"+ 
    report+ 
    "\n\n"; 

    sendIntent.putExtra(Intent.EXTRA_EMAIL, 
    new String[] {"s[email protected]"}); 
    sendIntent.putExtra(Intent.EXTRA_TEXT, report); 
    sendIntent.putExtra(Intent.EXTRA_SUBJECT, "hai"); 
    sendIntent.setType("message/rfc822"); 

    app.startActivity(Intent.createChooser(sendIntent, "Email:")); 

    } 
    catch(Exception e) 
    { 
     Log.v("sendmail", e.toString()); 
    } 
} 



@Override 
protected void finalize() throws Throwable { 
if (Thread.getDefaultUncaughtExceptionHandler().equals(this)) 
Thread.setDefaultUncaughtExceptionHandler(defaultUEH); 
super.finalize(); 
} 

}

CrashreportActivity.java

public class CrashreportActivity extends Activity { 

    protected TopExceptionHandler mDamageReport = new TopExceptionHandler(this); 
    String len=null; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Thread.setDefaultUncaughtExceptionHandler(new TopExceptionHandler(this)); 

     for(int i=0;i<len.length();i++) 
     { 
      Log.v("error", ""+i); 
     } 
    } 
} 
+0

問題は何ですか? – njzk2

+0

@iは電子メールを送信できません。なぜ私に電子メールを送信できません。 – John

+0

これは少し曖昧です。あなたの頭の中にいないと、あなたがこれを実行するときに何が起こるかを推測することができなくなります。それは "それは動作しません"から任意の手がかりを持っていますか?スタックトレースはどこか? – njzk2

答えて

0

私はそれは常に失敗しuncaughtExceptionの体に何かをしようとします。そこで、私はAlarmManagerを使って、アプリケーションが終了した後にActivityを発生させます。このようにして、電子メールを送信するか、メールの内容とエラーと再起動通知でアプリケーションを再起動することができます。

関連する問題