2010-05-17 4 views
17

Ahora estamos probando nuestra aplicación con algunos amigos. A veces hay algunos errores que no arrojan una excepción. Entonces realmente no sé cuál fue el problema. Así que pensé que sería una buena idea implementar un elemento del menú que permita enviar la salida de logcat a una dirección de correo electrónico, para que podamos examinar el registro.Enviar la salida de Logcat de una aplicación a un EmailAdress

Lamentablemente no encontré una pista en Internet sobre cómo extraer el logcat de un teléfono. Cómo enviar un correo electrónico no debería ser el problema.

Respuesta

13

Mire android-log-collector, ya que hace lo que está tratando de hacer.

No es posible recopilar datos arbitrarios de LogCat desde Android 4.1. Nunca hubo una forma documentada y compatible de hacerlo, y la forma no documentada/no compatible was locked down in Jelly Bean. Para sus propios bloqueos, lo mejor es que use una biblioteca de registro de fallos, como ACRA.

+0

hmm gracias. entonces tengo que agregar la fuente a mi proyecto o instalar la aplicación en el teléfono. ¿derecho? – RoflcoptrException

+0

Tendría que preguntarles, ya que no he usado sus cosas. Como mínimo, puede ver su código fuente para ver cómo leen los registros. – CommonsWare

+0

hmm sí leo en la página que los desarrolladores pueden usarlo, pero sin embargo no hay documentación y no sé cómo iniciarlo. pero gracias – RoflcoptrException

7

También vería en Flurry (flurry.com) que no solo le proporciona análisis generales, sino que le permite registrar información arbitraria y también registra excepciones no detectadas para usted. Lo configuré en literalmente 5 minutos, pero una cosa a tener en cuenta es que no es en tiempo real como una alerta por correo electrónico. Tendrás que esperar unas horas para que lo que inicies sesión en tu aplicación aparezca en su tablero. También podría ser excesivo si tienes una aplicación realmente liviana, pero no he notado ninguna pérdida de rendimiento en mi aplicación como resultado del uso del servicio.

0

Gracias a que 2, pero navegando por la ingrese colector androide-foro me encontré con un solution que es aún más fácil de manejar:

Allí se puede almacenar un archivo PHP en algún lugar de su servidor (o si no quieres para usar su propio servidor, también tienen un script en su servidor). En este archivo php puede definir qué se hará cuando el mensaje de correo llegue al servidor. Acabo de definir un código muy simple que envía los datos a mi dirección de correo electrónico.

Esto solo funciona si se lanza una excepción no detectada. Pero se podría extender el manejador de excepción no capturado por defecto, de modo que también es posible no solo obtener la pila de pila sino también el logcat.

+1

Este enlace está roto, ¿puedes actualizarlo o publicar un código fuente? – gobernador

+0

Sí, está roto y no puedo encontrar uno nuevo. Pero como puede haber visto, la respuesta tiene casi 2 años. –

+0

Es un enlace antiguo. Estaba investigando e intentando hacer esto mismo, y me preguntaba si sabías dónde está. No importa, intentaré con otra respuesta. El código del cliente – gobernador

3

sin duda recomiendo que mirar también en este proyecto here

6

encontré el LogCollector muy útil de hecho (la punta de CommonsWare):

Y no se olvide de poner en su propia aplicación:

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

LogCollector parece registrar algo de basura, no el registro de mi aplicación. No hay una línea – djdance

+1

LogCollector parece estar muerto. Sin actividad desde 2012. –

1

Esta solución no envía un correo electrónico, sino que lo envía a un servidor a través de UDP.

https://github.com/Chemik/logcatudp

El código fuente está disponible. Se puede incrustar fácilmente en nuestra propia aplicación. No he intentado hacerlo.

+0

Logcat to UDP sources se ha movido a https://github.com/Chemik/logcatudp. La aplicación BTW puede enviar el registro a un correo electrónico o compartirlo usando cualquier otra aplicación instalada. – Chemik

1

En el archivo de manifiesto con dar los siguientes permisos:

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

En su primera actividad/lanzador, justo después de la escritura

super.onCreate(savedInstanceState); 

debajo de las líneas: Esto escribirá Logcat de su aplicación en el dispositivo de almacenamiento externo

 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, EXTERNAL_PERMISSION_CODE); 
    } 
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, READ_PERMISSION_CODE); 
    } 

    if (isExternalStorageWritable()) { 

     File appDirectory = new File(Environment.getExternalStorageDirectory() + "/MyAppLog"); 
     File logDirectory = new File(appDirectory + "/log"); 
     File logFile = new File(logDirectory, "logcat" + ".txt"); 

     // create app folder 
     if (!appDirectory.exists()) { 
      appDirectory.mkdir(); 
     } 

     // create log folder 
     if (!logDirectory.exists()) { 
      logDirectory.mkdir(); 
     } 

     // clear the previous logcat and then write the new one to the file 
     if (logFile.exists()){ 
      logFile.delete(); 
     } 

     try { 
      Process process = Runtime.getRuntime().exec("logcat -c"); 
      process = Runtime.getRuntime().exec("logcat -f " + logFile); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } else if (isExternalStorageReadable()) { 
     // only readable 
    } else { 
     // not accessible 
    } 

Para enviar el logcat al correo electrónico deseado, agregue O prima: utilizar a continuación el método

public void sendLogcatMail(){ 

    if (isExternalStorageWritable()) { 

     File appDirectory = new File(Environment.getExternalStorageDirectory() + "/MyAppLog"); 
     File logDirectory = new File(appDirectory + "/log"); 
     File logFile = new File(logDirectory, "logcat" + ".txt"); 

     if (logFile.exists()) { 
      Intent emailIntent = new Intent(Intent.ACTION_SEND); 
      emailIntent.setType("vnd.android.cursor.dir/email"); 
      String to[] = {"[email protected]"}; 
      emailIntent.putExtra(Intent.EXTRA_EMAIL, to); 
      emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(String.valueOf(logFile.toURI()))); 
      emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Log files"); 
      emailIntent.putExtra(Intent.EXTRA_TEXT, "Send some message along"); 
      startActivity(Intent.createChooser(emailIntent, "Send email...")); 
     } 
    } 
} 

método para comprobar si los permisos para escribir en el almacenamiento externo se da o no:

/* Comprueba si el almacenamiento externo está disponible para lectura y escritura */

public static boolean isExternalStorageWritable() { 
    String state = Environment.getExternalStorageState(); 
    if (Environment.MEDIA_MOUNTED.equals(state)) { 
     return true; 
    } 
    return false; 
} 
Cuestiones relacionadas