ACRAライブラリを利用することでクラッシュレポートの通知ができます。
ただ、ネットワーク環境がない状態でエラーが発生した場合の状況も入手したかったので、
その方法をメモで残そうと思います。
ただ、ネットワーク環境がない状態でエラーが発生した場合の状況も入手したかったので、
その方法をメモで残そうと思います。
エラー発生時はエラー情報をファイルに保存するだけにし、
ネットワーク環境につながっているときに後から送信するという方法で実装しました。
ネットワーク環境につながっているときに後から送信するという方法で実装しました。
- クラッシュレポート用のクラス作成
- ReportSenderの作成
- ACRAの設定
クラッシュレポート用のクラス作成
クラッシュレポートの内容をファイルに保存、読み込みを行うクラス
※Read,Write処理部分は省略
※Read,Write処理部分は省略
CrashReport.java
public class CrashReport {
private static final String CRASH_REPORT_FILE = "crash_report.txt";
private Context context;
private StringBuilder report = new StringBuilder();
public CrashReport(Context context) {
this.context = context;
// ロード処理
.
.
.
report.append(loadData);
}
public void add(CrashReportData errorContent) throws JSONReportBuilder.JSONReportException{
// レポートを追加
report.append("\n------------------------------------------------------------\n");
report.append(errorContent.toJSON().toString().replaceAll("\\\\n", "\n").replaceAll("\\\\t", "\t"));
}
public void save() throws IOException{
// レポートの保存
}
public void send(String email){
// メールでクラッシュレポートを送信
Intent intent = new Intent();
intent.setType("message/rfc822");
intent.setAction(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:" + email));
intent.putExtra(Intent.EXTRA_SUBJECT, String.format("Crash report![%s]", context.getPackageName()));
intent.putExtra(Intent.EXTRA_TEXT, report.toString());
context.startActivity(intent);
}
public void clear(){
// クラッシュレポートのクリア
report = new StringBuilder();
try {
save();
}catch (Exception e){
e.printStackTrace();
}
}
}
ReportSenderの作成
クラッシュしたときに動作するSenderクラスを作成
CrashReportSender.java
public class CrashReportSender implements ReportSender {
@Override
public void send(Context context, CrashReportData errorContent) throws ReportSenderException {
CrashReport crashReport = new CrashReport(context);
try {
crashReport.add(errorContent);
crashReport.save();
}catch (Exception e){
Log.e("CrashReportSender", "CrashReport save is failed.");
e.printStackTrace();
}
}
}
ACRAの設定
最後にACRAを設定して完了!
AcraCrashReportApplication.java
@ReportsCrashes(
mode= ReportingInteractionMode.TOAST,
resToastText = R.string.acra_dialog_text,
resDialogCommentPrompt= R.string.acra_dialog_comment_prompt // 発生状況を入力する欄のラベル
)
public class AcraCrashReportApplication extends Application {
@Override
public void onCreate() {
// The following line triggers the initialization of ACRA
super.onCreate();
// ACRAの設定
ACRA.init(this);
CrashReportSender sender = new CrashReportSender();
ACRA.getErrorReporter().setReportSender(sender);
}
}
AndroidManifest.xml
android:name=lang:AcraCrashReportApplication
あとは、どこかの画面でCrashReportのsendを呼び出せばOKです。