当前位置: 首页 > 工具软件 > acra > 使用案例 >

写入 sd卡android data,android – ACRA:如何将ACRA报告写入文件(在SD卡中)?

吴正祥
2023-12-01

我想您想要实现的目标已经由ACRA完成.这是我在abd logcat中看到的内容:

01-23 12:15:28.056: D/ACRA(614): Writing crash report file.

01-23 12:15:28.136: D/ACRA(614): Mark all pending reports as approved.

01-23 12:15:28.136: D/ACRA(614): Looking for error files in /data/data/com.ybi/files

01-23 12:15:28.136: V/ACRA(614): About to start ReportSenderWorker from #handleException

01-23 12:15:28.146: D/ACRA(614): Add user comment to null

01-23 12:15:28.146: D/ACRA(614): #checkAndSendReports - start

01-23 12:15:28.146: D/ACRA(614): Looking for error files in /data/data/com.ybi/files

ACRA所做的第一件事就是在应用程序的内部存储上创建一个文件报告.

然后,如果您在线并且错误报告器已正确初始化,则会发送报告.

否则,报告将保留在数据存储中(以便稍后发送).

我没有查看数据,但我正在研究自定义记录器.因此,如果您想要做与ACRA相同的事情,那很简单:

ACRA.init(this);

// a custom reporter for your very own purposes

ErrorReporter.getInstance().setReportSender(new LocalReportSender(this));

然后 :

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

import org.acra.ACRA;

import org.acra.CrashReportData;

import org.acra.ReportField;

import org.acra.sender.ReportSender;

import org.acra.sender.ReportSenderException;

import android.content.Context;

import de.akquinet.android.androlog.Log;

public class LocalReportSender implements ReportSender {

private final Map mMapping = new HashMap() ;

private FileOutputStream crashReport = null;

public LocalReportSender(Context ctx) {

// the destination

try {

crashReport = ctx.openFileOutput("crashReport", Context.MODE_WORLD_READABLE);

} catch (FileNotFoundException e) {

Log.e("TAG", "IO ERROR",e);

}

}

@Override

public void send(CrashReportData report) throws ReportSenderException {

final Map finalReport = remap(report);

try {

OutputStreamWriter osw = new OutputStreamWriter(crashReport);

Set set = finalReport.entrySet();

Iterator i = set.iterator();

while (i.hasNext()) {

Map.Entry me = (Map.Entry) i.next();

osw.write("[" + me.getKey() + "]=" + me.getValue());

}

osw.flush();

osw.close();

} catch (IOException e) {

Log.e("TAG", "IO ERROR",e);

}

}

private static boolean isNull(String aString) {

return aString == null || ACRA.NULL_VALUE.equals(aString);

}

private Map remap(Map report) {

ReportField[] fields = ACRA.getConfig().customReportContent();

if (fields.length == 0) {

fields = ACRA.DEFAULT_REPORT_FIELDS;

}

final Map finalReport = new HashMap(

report.size());

for (ReportField field : fields) {

if (mMapping == null || mMapping.get(field) == null) {

finalReport.put(field.toString(), report.get(field));

} else {

finalReport.put(mMapping.get(field), report.get(field));

}

}

return finalReport;

}

}

我还没有完全测试它,但你明白了.希望能帮助到你.

 类似资料: