Lea logcat programáticamente dentro de la aplicación

Quiero leer y reactjsr a los registros de logcat dentro de mi aplicación.

Encontré el siguiente código:

try { Process process = Runtime.getRuntime().exec("logcat -d"); BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(process.getInputStream())); StringBuilder log=new StringBuilder(); String line = ""; while ((line = bufferedReader.readLine()) != null) { log.append(line); } TextView tv = (TextView)findViewById(R.id.textView1); tv.setText(log.toString()); } catch (IOException e) {} 

Este código de hecho devuelve los registros de logcat que se realizaron hasta que se inició la aplicación:

Pero, ¿es posible escuchar continuamente incluso los registros logcat nuevos?

Puede seguir leyendo los registros, simplemente eliminando el indicador “-d” en su código anterior.

El indicador “-d” indica a logcat que muestre el contenido del registro y salga. Si quita la bandera, logcat no terminará y sigue enviando cualquier nueva línea añadida.

Solo tenga en cuenta que esto puede bloquear su aplicación si no está correctamente diseñada.

buena suerte.

Puede borrar su logcat con este método que estoy usando para borrar después de escribir logcat en un archivo para evitar líneas duplicadas:

 public void clearLog(){ try { Process process = new ProcessBuilder() .command("logcat", "-c") .redirectErrorStream(true) .start(); } catch (IOException e) { } } 

La bandera “-c” borra el buffer.

-c Borra (vacía) todo el registro y sale.

Aquí hay un conjunto desplegable rápido que se puede usar para capturar todos los elementos de registro actuales o todos los nuevos (desde una última solicitud).

Debe modificar / extender esto, ya que es posible que desee devolver un flujo continuo en lugar de un LogCapture.

El “Manual” Android LogCat: https://developer.android.com/studio/command-line/logcat.html import android.util.Log;

 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Stack; /** * Created by triston on 6/30/17. */ public class Logger { // http://www.java2s.com/Tutorial/Java/0040__Data-Type/SimpleDateFormat.htm private static final String ANDROID_LOG_TIME_FORMAT = "MM-dd kk:mm:ss.SSS"; private static SimpleDateFormat logCatDate = new SimpleDateFormat(ANDROID_LOG_TIME_FORMAT); public static String lineEnding = "\n"; private final String logKey; private static List logKeys = new ArrayList(); Logger(String tag) { logKey = tag; if (! logKeys.contains(tag)) logKeys.add(logKey); } public static class LogCapture { private String lastLogTime = null; public final String buffer; public final List log, keys; LogCapture(String oLogBuffer, ListoLogKeys) { this.buffer = oLogBuffer; this.keys = oLogKeys; this.log = new ArrayList<>(); } private void close() { if (isEmpty()) return; String[] out = log.get(log.size() - 1).split(" "); lastLogTime = (out[0]+" "+out[1]); } private boolean isEmpty() { return log.size() == 0; } public LogCapture getNextCapture() { LogCapture capture = getLogCat(buffer, lastLogTime, keys); if (capture == null || capture.isEmpty()) return null; return capture; } public String toString() { StringBuilder output = new StringBuilder(); for (String data : log) { output.append(data+lineEnding); } return output.toString(); } } /** * Get a list of the known log keys * @return copy only */ public static List getLogKeys() { return logKeys.subList(0, logKeys.size() - 1); } /** * Platform: Android * Get the logcat output in time format from a buffer for this set of static logKeys. * @param oLogBuffer logcat buffer ring * @return A log capture which can be used to make further captures. */ public static LogCapture getLogCat(String oLogBuffer) { return getLogCat(oLogBuffer, null, getLogKeys()); } /** * Platform: Android * Get the logcat output in time format from a buffer for a set of log-keys; since a specified time. * @param oLogBuffer logcat buffer ring * @param oLogTime time at which to start capturing log data, or null for all data * @param oLogKeys logcat tags to capture * @return A log capture; which can be used to make further captures. */ public static LogCapture getLogCat(String oLogBuffer, String oLogTime, List oLogKeys) { try { ListsCommand = new ArrayList(); sCommand.add("logcat"); sCommand.add("-bmain"); sCommand.add("-vtime"); sCommand.add("-s"); sCommand.add("-d"); sCommand.add("-T"+oLogTime); for (String item : oLogKeys) sCommand.add(item+":V"); // log level: ALL sCommand.add("*:S"); // ignore logs which are not selected Process process = new ProcessBuilder().command(sCommand).start(); BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(process.getInputStream())); LogCapture mLogCapture = new LogCapture(oLogBuffer, oLogKeys); String line = ""; long lLogTime = logCatDate.parse(oLogTime).getTime(); if (lLogTime > 0) { // Synchronize with "NO YEAR CLOCK" @ unix epoch-year: 1970 Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date(oLogTime)); calendar.set(Calendar.YEAR, 1970); Date calDate = calendar.getTime(); lLogTime = calDate.getTime(); } while ((line = bufferedReader.readLine()) != null) { long when = logCatDate.parse(line).getTime(); if (when > lLogTime) { mLogCapture.log.add(line); break; // stop checking for date matching } } // continue collecting while ((line = bufferedReader.readLine()) != null) mLogCapture.log.add(line); mLogCapture.close(); return mLogCapture; } catch (Exception e) { // since this is a log reader, there is nowhere to go and nothing useful to do return null; } } /** * "Error" * @param e */ public void failure(Exception e) { Log.e(logKey, Log.getStackTraceString(e)); } /** * "Error" * @param message * @param e */ public void failure(String message, Exception e) { Log.e(logKey, message, e); } public void warning(String message) { Log.w(logKey, message); } public void warning(String message, Exception e) { Log.w(logKey, message, e); } /** * "Information" * @param message */ public void message(String message) { Log.i(logKey, message); } /** * "Debug" * @param message a Message */ public void examination(String message) { Log.d(logKey, message); } /** * "Debug" * @param message a Message * @param e An failure */ public void examination(String message, Exception e) { Log.d(logKey, message, e); } } 

En su proyecto que realiza el registro de actividad:

 Logger log = new Logger("SuperLog"); // perform logging methods 

Cuando desee capturar todo lo que ha registrado a través de “Logger”

 LogCapture capture = Logger.getLogCat("main"); 

Cuando tienes hambre y quieres comer más troncos

 LogCapture nextCapture = capture.getNextCapture(); 

Puede obtener la captura como una cadena con

 String captureString = capture.toString(); 

O puede obtener los elementos de registro de la captura con

 String logItem = capture.log.get(itemNumber); 

No hay un método estático exacto para capturar las claves de registro externas, pero hay una manera, no obstante,

 LogCapture foreignCapture = Logger.getLogCat("main", null, foreignCaptureKeyList); 

Usar lo anterior también le permitirá llamar a Logger.this.nextCapture en la captura extranjera.

  //CLEAR LOGS Runtime.getRuntime().exec("logcat -c"); //LISTEN TO NEW LOGS Process pq=Runtime.getRuntime().exec("logcat v main"); BufferedReader brq = new BufferedReader(new InputStreamReader(pq.getInputStream())); String sq=""; while ((sq = brq.readLine()) != null) { //CHECK YOUR MSG HERE if(sq.contains("send MMS with param")) { } } 

Estoy usando esto en mi aplicación y funciona. Y puede usar el código anterior en Timer Task para que no detenga su hilo principal

  Timer t; this.t.schedule(new TimerTask() { public void run() { try { ReadMessageResponse.this.startRecord();//ABOVE METHOD HERE } catch (IOException ex) { //NEED TO CHECK SOME VARIABLE TO STOP MONITORING LOGS System.err.println("Record Stopped"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { ReadMessageResponse.this.t.cancel(); } } }, 0L); }