Enviar salida de Logcat de una aplicación a un EmailAdress

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.

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.

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

No es posible recostackr datos arbitrarios de LogCat a partir de Android 4.1. Nunca hubo una manera documentada y compatible de hacerlo, y la forma no documentada / no compatible se bloqueó en Jelly Bean . Para sus propios lockings, se lo serviría mejor utilizando una biblioteca de registro de fallos, como ACRA .

También buscaría en Flurry ( flurry.com ) que no solo le brinda 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.

Encontré el LogCollector muy útil (la sugerencia de CommonsWare):

Y no olvides configurar tu propia aplicación:

 

Definitivamente recomendaría mirar también este proyecto aquí

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.

En su archivo de manifiesto, otorgue los siguientes permisos:

   

En su primera actividad / iniciador, justo después del

 super.onCreate(savedInstanceState); 

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

  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 a la dirección de correo electrónico deseada: use el método a continuación

 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[] = {"yourEmailAddress@gmail.com"}; 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 verificar si se otorgan o no permisos para Escribir en el almacenamiento externo:

/ * 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; } 

Gracias a ti 2, pero al explorar el foro android-log-collector encontré una solución que es aún más fácil de manejar:

Allí puede almacenar un archivo php en algún lugar de su servidor (o si no desea 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 lanzó 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 stack de stack sino también el logcat.