ACRA: ¿Cómo puedo escribir ACRA informe a archivo (en tarjeta SD)?

Puedo utilizar la biblioteca de ACRA para manejar el error cercano de la fuerza manejando la excepción sin atrapar. El informe se puede enviar a google doc., Correo electrónico y servicio web personalizado con éxito.

Pero lo que quiero

  • ¿Cómo puedo escribir el informe en el archivo [ej. Sdcard / myapp / myLog.txt]?

Por qué quiero esto

  • Mi usuario de la aplicación no puede tener conexión a Internet mientras se cierre la fuerza se produce .. si es así entonces voy a extrañar el informe, si escribo el informe al archivo, entonces puedo enviar a mi servidor cuando la conexión a Internet disponible.

Creo que lo que quieres lograr ya lo está haciendo ACRA. Esto es lo que veo en mi logcat abd:

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 

Lo primero que hace ACRA es crear un informe sobre un archivo en el almacenamiento interno de su aplicación. Entonces, si está en línea y el errorreporter se inicializa correctamente, envía el informe. De lo contrario, los informes se guardan en el almacenamiento de datos (para un envío posterior).

No miré en los datos, pero actualmente estoy trabajando en un registrador personalizado. Así que si quieres hacer lo mismo que ACRA, es fácil:

  ACRA.init(this); // a custom reporter for your very own purposes ErrorReporter.getInstance().setReportSender(new LocalReportSender(this)); 

Y entonces :

 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<ReportField, String> mMapping = new HashMap<ReportField, String>() ; 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<String, String> finalReport = remap(report); try { OutputStreamWriter osw = new OutputStreamWriter(crashReport); Set set = finalReport.entrySet(); Iterator i = set.iterator(); while (i.hasNext()) { Map.Entry<String,String> 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<String, String> remap(Map<ReportField, String> report) { ReportField[] fields = ACRA.getConfig().customReportContent(); if (fields.length == 0) { fields = ACRA.DEFAULT_REPORT_FIELDS; } final Map<String, String> finalReport = new HashMap<String, String>( 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; } } 

No lo he probado completamente todavía, pero tienes la idea. Espero eso ayude.

Supongo que la respuesta de @ Gomoku7 contiene algún código obsoleto por lo que voy a publicar la solución que he utilizado:

Llame a esto en onCreate ():

 ACRA.init(this); ACRA.getErrorReporter().setReportSender(new LocalReportSender(this)); 

Aquí básicamente he cambiado el código para usar BufferedWriter para que pueda escribir directamente en la tarjeta SD que no era posible con openFileOutput() . Por lo tanto, sólo el método send() y el constructor LocalReportSender() están ligeramente cambiados.

Nota: Tenga en cuenta que el archivo de registro crece muy rápido, así que asegúrese de no tomar MB de espacio de la tarjeta SD de su usuario debido a un archivo de registro 🙂

 private class LocalReportSender implements ReportSender { private final Map<ReportField, String> mMapping = new HashMap<ReportField, String>(); private FileWriter crashReport = null; public LocalReportSender(Context ctx) { // the destination File logFile = new File(Environment.getExternalStorageDirectory(), "log.txt"); try { crashReport = new FileWriter(logFile, true); } catch (IOException e) { e.printStackTrace(); } } @Override public void send(CrashReportData report) throws ReportSenderException { final Map<String, String> finalReport = remap(report); try { BufferedWriter buf = new BufferedWriter(crashReport); Set<Entry<String, String>> set = finalReport.entrySet(); Iterator<Entry<String, String>> i = set.iterator(); while (i.hasNext()) { Map.Entry<String, String> me = (Entry<String, String>) i.next(); buf.append("[" + me.getKey() + "]=" + me.getValue()); } buf.flush(); buf.close(); } catch (IOException e) { Log.e("TAG", "IO ERROR", e); } } private boolean isNull(String aString) { return aString == null || ACRAConstants.NULL_VALUE.equals(aString); } private Map<String, String> remap(Map<ReportField, String> report) { ReportField[] fields = ACRA.getConfig().customReportContent(); if (fields.length == 0) { fields = ACRAConstants.DEFAULT_REPORT_FIELDS; } final Map<String, String> finalReport = new HashMap<String, String>( 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; } } 

He utilizado ACRA pero no en este formulario (utilizado para enviar los registros a mi propio servidor), así que no estoy seguro de cómo hacerlo.
Pero en tal caso no se puede obtener los registros del sistema como un todo (que será uno de los detalles) usando las otras libs / apis y escribirlo en un archivo.

O, lo que puede hacer es usar el código de la ACRA zip y modificarlo un poco, por ejemplo, utilizando el archivo "CrashReportData.java" o "CrashReporterDialog.java" en su paquete y obtener buscar el contenido de allí y guardarlo en tu archivo.

Estoy hablando de su versión 4.2.3.

La solución anterior funciona perfectamente. Probablemente sólo hay una cosa, si el archivo no está visible con el explorador de archivos, trate de agregar intención de difusión a Intent.ACTION_MEDIA_SCANNER_SCAN_FILE

Revise este enlace

  • La fuerza de aplicación se cierra al iniciar
  • App forcecloses en la actividad de inicio de Facebook
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.