Iniciar sesión en un archivo en Android

¿Hay alguna forma de recuperar mensajes de registro de un teléfono Android?

Estoy construyendo una aplicación que usa el GPS de mi HTC Hero. Puedo ejecutar y depurar la aplicación del eclipse, pero este no es un buen caso de uso del GPS, se sentó en mi escritorio.

Cuando enciendo la aplicación cuando estoy caminando, recibo una excepción intermitente. De todos modos, puedo mostrar estas excepciones en un archivo de texto en la tarjeta SD o enviar llamadas a Log.x("") a un archivo de texto para que pueda ver cuál es la excepción.

Gracias

EDITAR: Solución

Aquí está el código con el que finalmente fui …

 Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread thread, Throwable ex) { PrintWriter pw; try { pw = new PrintWriter( new FileWriter(Environment.getExternalStorageDirectory()+"/rt.log", true)); ex.printStackTrace(pw); pw.flush(); pw.close(); } catch (IOException e) { e.printStackTrace(); } } }); 

Tuve que envolver la línea

 pw = new PrintWriter(new FileWriter(Environment.getExternalStorageDirectory()+"/rt.log", true)); 

en un try / catch como Eclipse no me dejaba comstackr la aplicación. Sigo diciendo

 Unhandled exception type IOException 1 quick fix Sorround with try/catch 

Así que lo hice y todo funciona, lo cual está bien para mí, pero me hace preguntarme en qué estaba Eclipse …

Puede usar Thread.setUncaughtExceptionHandler() para capturar las Excepciones.

Escribir en la tarjeta SD es tan simple como recuperar el directorio de la tarjeta usando Environment.getExternalStorageDirectory() y crear un archivo allí.

 File f = new File(Environment.getExternalStorageDirectory(),filename); 

Tendrá que darle a la aplicación el permiso correcto para escribir en la tarjeta SD al agregar esto a su Manifiesto:

  

Log4j o slf4j también se pueden usar como marcos de registro en Android junto con logcat. Vea el proyecto android-logging-log4j . Configurar el registro en un (s) archivo (s) rotativo (s) es muy fácil.

  static { final LogConfigurator logConfigurator = new LogConfigurator(); logConfigurator.setFileName(Environment.getExternalStorageDirectory() + "myapp.log"); logConfigurator.setRootLevel(Level.DEBUG); // Set log level of a specific logger logConfigurator.setLevel("org.apache", Level.ERROR); logConfigurator.configure(); } 

Podrías echar un vistazo a microlog4android. Tienen una solución lista para iniciar sesión en un archivo.

https://github.com/johanlkarlsson/microlog4android

Probé las dos opciones anteriores (microlog4android y android-logging-log4j) y fueron un esfuerzo para tratar de trabajar. Una vez que comstackron bien, obtendría Runtime java.lang.NoClassDefFoundError.

Entonces, me encontré con logback-android … también encontré aquí http://logback.qos.ch/

Tiene instrucciones mucho mejores y lo conseguí trabajando en un par de horas.

Esta parece ser la mejor solución de registro para Android.

Utilice slf4-android lib creado por BrightInventions . Es una implementación simple de slf4j api usando android java.util.logging. *.

caracteristicas:

  • logging para archivar de la caja
  • iniciar sesión en cualquier otro destino mediante LoggerConfiguration.configuration().addHandlerToLogger
  • agita tu dispositivo para enviar registros con captura de pantalla por correo electrónico
  • realmente pequeño, solo tomó ~ 55kB

slf4android se mantiene principalmente por @miensol .

Lea más sobre slf4android en nuestro blog:

  • Presentando slf4android
  • Integre slf4android con Crashlytics

En base a la solución @Greg B y la pregunta @JPM en el comentario, hice este método estático en una clase separada y cada vez que instancia un nuevo hilo, llámalo.

paquete com.stackoverflow.

 import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import android.os.Environment; public class UnhandledExceptionHandler { public static void setUndhandledException(Thread thread) { if (thread.getUncaughtExceptionHandler() == null) { Thread.currentThread().setUncaughtExceptionHandler( new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread thread, Throwable ex) { PrintWriter pw; try { pw = new PrintWriter(new FileWriter(Environment .getExternalStorageDirectory() + "/rt-networkandgps" + "/gpx/" + thread.getId() + ".log", true)); ex.printStackTrace(pw); pw.flush(); pw.close(); } catch (IOException e) { e.printStackTrace(); } } }); } } } 

Llámalo desde cualquier hilo como este,

  UnhandledExceptionHandler.setUndhandledException(Thread.currentThread());