Lisez logcat programmatically within application

Je souhaite lire et réagir aux journaux Logcat dans ma application.

J'ai trouvé le code suivant:

  • Comment activer le clavier physique sur Emulator dans Android Studio? (Travaillait)
  • SeekBar avec des valeurs décimales
  • Le son continue à jouer après la fermeture de la force
  • Forme Le gradient rayé uniquement fonctionne en pixels. N'est-ce pas inutile? % De valeurs ne fonctionnent pas
  • Dessinez le bitmap dans Custom ImageView et obtenez les coordonnées de ImageView indépendamment de l'appareil
  • Refaire un jeton OAuth en utilisant Retrofit sans modifier tous les appels
  • 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) {} 

    Ce code renvoie effectivement les journaux de logcat effectués jusqu'à l'ouverture de l'application –

    Mais est-il possible d'écouter en permanence même de nouveaux logs de logcat?

  • Précision de MediaPlayer.seekTo (int msecs)
  • Superposition de contenu au-dessus d'AppBarLayout en utilisant la nouvelle conception de matériaux
  • Renommer un fichier dans le stockage interne
  • Pourquoi utiliser les gestionnaires alors que runOnUiThread fait de même?
  • Comment supprimer ou échapper des balises html dans Android
  • Différents arômes avec GCM
  • 5 Solutions collect form web for “Lisez logcat programmatically within application”

    Vous pouvez continuer à lire les journaux, simplement en supprimant le drapeau "-d" dans votre code ci-dessus.

    Le drapeau "-d" indique à logcat de montrer le contenu du journal et de quitter. Si vous supprimez le drapeau, le logcat ne se terminera pas et continuera d'envoyer une nouvelle ligne ajoutée.

    Il suffit de penser que cela peut bloquer votre application si elle n'est pas correctement conçue.

    bonne chance.

    Vous pouvez effacer votre logcat avec cette méthode que j'utilise pour effacer après avoir écrit le fichier logcat dans un fichier pour éviter les doubles lignes:

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

    Le drapeau "-c" efface le tampon.

    -c Efface (efface) le journal complet et sort.

    Voici une mise en place rapide qui peut être utilisée pour capturer tous les éléments de journal actuels ou tout neuf (depuis une dernière demande).

    Vous devez modifier / étendre cela, car vous pourriez vouloir renvoyer un flux continu plutôt qu'un LogCapture.

    Le «Manuel» d'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.List; /** * Created by triston on 6/30/17. */ public class Logger { public static String lineEnding = "\n"; private final String logKey; private static List<String> logKeys = new ArrayList<String>(); 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<String> log, keys; LogCapture(String oLogBuffer, List<String>oLogKeys) { 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<String> 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<String> oLogKeys) { try { List<String>sCommand = new ArrayList<String>(); sCommand.add("logcat"); sCommand.add("-b"+oLogBuffer); sCommand.add("-vtime"); if (oLogTime != null) { // dump-from-date-to-now sCommand.add("-t"); sCommand.add(oLogTime); } else { // dump-to-now and exit sCommand.add("-d"); } for (String item : oLogKeys) { // for each key/tag select sCommand.add(item+":I"); // log level "info" and higher } 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 = ""; 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); } } 

    Dans votre projet qui effectue l'enregistrement des activités:

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

    Lorsque vous souhaitez capturer tout ce que vous avez connecté à "Logger"

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

    Lorsque vous avez faim et que vous voulez grignoter sur plus de bûches

     LogCapture nextCapture = capture.getNextCapture(); 

    Vous pouvez obtenir la capture en tant que chaîne avec

     String captureString = capture.toString(); 

    Ou vous pouvez obtenir les éléments de journal de la capture avec

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

    Il n'y a pas de méthode statique exacte pour capturer des clés de journal étrangères mais il y a un moyen néanmoins

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

    L'utilisation de ce qui précède permettra également d'appeler Logger.this.nextCapture sur la capture étrangère.

      //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")) { } } 

    Je l'utilise dans mon application et ça marche. Et vous pouvez utiliser le code ci-dessus dans Timer Task afin qu'il n'arrête pas votre thread 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); } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.