¿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.
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:
LoggerConfiguration.configuration().addHandlerToLogger
slf4android se mantiene principalmente por @miensol .
Lea más sobre slf4android en nuestro blog:
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());