package org.cnodejs.android.md.ui.activity; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.widget.Toolbar; import android.view.MenuItem; import android.widget.TextView; import org.cnodejs.android.md.R; import org.cnodejs.android.md.ui.base.StatusBarActivity; import org.cnodejs.android.md.ui.listener.NavigationFinishClickListener; import org.cnodejs.android.md.ui.util.Navigator; import org.cnodejs.android.md.ui.util.ThemeUtils; import org.joda.time.DateTime; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; import butterknife.BindView; import butterknife.ButterKnife; public class CrashLogActivity extends StatusBarActivity implements Toolbar.OnMenuItemClickListener { private static final String EXTRA_E = "e"; public static void start(@NonNull Context context, @NonNull Throwable e) { Intent intent = new Intent(context, CrashLogActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Bundle bundle = new Bundle(); bundle.putSerializable(EXTRA_E, e); intent.putExtras(bundle); context.startActivity(intent); } @BindView(R.id.toolbar) protected Toolbar toolbar; @BindView(R.id.tv_info) protected TextView tvInfo; private String crashLog; @Override protected void onCreate(Bundle savedInstanceState) { ThemeUtils.configThemeBeforeOnCreate(this, R.style.AppThemeLight, R.style.AppThemeDark); super.onCreate(savedInstanceState); setContentView(R.layout.activity_crash_log); ButterKnife.bind(this); toolbar.setNavigationOnClickListener(new NavigationFinishClickListener(this)); toolbar.inflateMenu(R.menu.crash_log); toolbar.setOnMenuItemClickListener(this); Throwable e = (Throwable) getIntent().getSerializableExtra(EXTRA_E); StringBuilder sb = new StringBuilder(); sb.append("生产厂商:\n"); sb.append(Build.MANUFACTURER).append("\n\n"); sb.append("手机型号:\n"); sb.append(Build.MODEL).append("\n\n"); sb.append("系统版本:\n"); sb.append(Build.VERSION.RELEASE).append("\n\n"); sb.append("异常时间:\n"); sb.append(new DateTime()).append("\n\n"); sb.append("异常类型:\n"); sb.append(e.getClass().getName()).append("\n\n"); sb.append("异常信息:\n"); sb.append(e.getMessage()).append("\n\n"); sb.append("异常堆栈:\n"); Writer writer = new StringWriter(); PrintWriter printWriter = new PrintWriter(writer); e.printStackTrace(printWriter); Throwable cause = e.getCause(); while (cause != null) { cause.printStackTrace(printWriter); cause = cause.getCause(); } printWriter.close(); sb.append(writer.toString()); crashLog = sb.toString(); tvInfo.setText(crashLog); } @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.action_send: Navigator.openEmail( this, "takwolf@foxmail.com", "来自 CNodeMD-" + AboutActivity.VERSION_TEXT + " 的客户端崩溃日志", crashLog ); return true; default: return false; } } }