2010-01-22 10 views
25

¿Hay alguna forma de recuperar mensajes de registro de un teléfono Android?Iniciar sesión en un archivo en Android

Estoy construyendo una aplicación que utiliza 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. ¿Hay alguna forma de que pueda enviar estas excepciones a un archivo de texto en la tarjeta SD o enviar llamadas al Log.x("") a un archivo de texto para que pueda ver cuál es la excepción?

Gracias

EDIT: Solución

Aquí está el código finalmente fui con ...

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(); 
    } 
} 
}); 

que tenían para envolver la línea

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

en un try/catch como Eclipse no me deja compilar t la aplicación Se decía

Unhandled exception type IOException 

1 quick fix 
    Sorround with try/catch 

Así lo hice y funciona todo lo cual está bien por mí pero hace que me pregunte qué estaba en Eclipse sobre ...

+3

agradable si usted tiene una escritura hilo, pero lo que ocurre con esta solución si tiene 5 hilos de escritura a la misma archivo, no es una buena solución entonces. – JPM

+0

¿uso sincronizado? – Michael

Respuesta

19

Se podría utilizar para atrapar Thread.setUncaughtExceptionHandler() 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 App el permiso correcto escribir en la tarjeta SD añadiendo esto a su Manifiesto:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

Saludos Dave, voy a darle un toque –

6

Log4j o slf4j también se pueden utilizar 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(); 
} 
4

He intentado tanto opciones anteriores (microlog4android & android-tala-log4j) y eran una lucha para tratar de conseguir trabajo. Una vez que compilaron bien, obtendría Runtime java.lang.NoClassDefFoundError.

Entonces me encontré con logback-android ... También se encuentran aquí http://logback.qos.ch/

Tiene mucho mejores instrucciones y tengo que trabajar en un par de horas.

Parece que esta es la mejor solución de registro para Android.

1

basado en la solución @ Greg B y pregunta @JPM en el comentario, he hecho este método estático en una clase separada y cada vez que instanciar un nuevo hilo, lo llaman.

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(); 
          } 
         } 
        }); 
     } 

    } 

} 

llamarlo desde anythread como este,

  UnhandledExceptionHandler.setUndhandledException(Thread.currentThread()); 
4

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

Características:

  • registro en el archivo de la caja
  • registro a cualquier otro destino por LoggerConfiguration.configuration().addHandlerToLogger
  • agitar el dispositivo para enviar los registros de captura de pantalla por correo electrónico
  • muy pequeño, Tooks sólo ~ 55kB

slf4android se mantiene principalmente por @miensol.

Leer más sobre slf4android en nuestro blog:

Cuestiones relacionadas