Android-дисплей Logcat в TextView

Приложение, которое я создаю, имеет root-доступ к Android. Я хочу показать информацию журнала Logcat в одном из TextView, чтобы он отображался на экране во время отладки.

Может ли кто-нибудь дать мне некоторые идеи, какую библиотеку / функцию я могу вызвать для доступа к этим журналам?

благодаря

Вот блог, который делает именно то, что вам нужно для этого. Он содержит полный пример кода о том, как отображать содержимое журнала Logcat. Вот код:

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; class ReadLogDemo extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); 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) { // Handle Exception } } } 

Просто чтобы уточнить, это не мой ответ, вот оригинал

Ну, есть решение для регистрации всего, что вы хотите использовать, используя эту библиотеку. Это не сработало для меня, поэтому я разработал свое собственное решение, и вы можете найти его пример. Это действительно просто, просто добавьте класс OnScreenLog в свой проект

 package br.com.ideiageni.onscreenlogSample; import android.app.Activity; import android.graphics.Color; import android.os.Handler; import android.view.MotionEvent; import android.view.View; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; /** * Created by ariel on 07/07/2016. */ public class OnScreenLog { private static int timeoutTime = 1000; private static TextView tvLog; private static int logCount = 0; private static int logCountMax = 30; private static String[] logs = new String[logCountMax]; private static int cntClicks = 0; private static boolean visibility = false; private static Activity activity; private int maxClicks = 5; public OnScreenLog(){} public OnScreenLog(Activity activity, int ViewID){ OnScreenLog.activity = activity; tvLog = new TextView(activity.getApplicationContext()); maintainLog("Log is working"); tvLog.setLayoutParams(new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT)); tvLog.setTextColor(Color.BLACK); tvLog.setBackgroundColor(Color.LTGRAY); tvLog.setAlpha((float) 0.4); View v = null; LinearLayout linearLayout; RelativeLayout relativeLayout; try { linearLayout = (LinearLayout) activity.findViewById(ViewID); } catch (ClassCastException e) {linearLayout = null;}; try { relativeLayout = (RelativeLayout) activity.findViewById(ViewID); } catch (ClassCastException e) {relativeLayout = null;}; if(linearLayout != null) { linearLayout.addView(tvLog); v = linearLayout; } else if(relativeLayout != null) { relativeLayout.addView(tvLog); v = relativeLayout; } if(v != null) { v.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: cntClicks++; timerHandler.removeCallbacks(rTimeout); timerHandler.postDelayed(rTimeout, timeoutTime); if (cntClicks > maxClicks-1) { setLogVisible(!visibility); timerHandler.removeCallbacks(rTimeout); cntClicks = 0; } break; } return false; } }); } } public void log (String text){ String logText = text; maintainLog(logText); } public void log (int text){ String logText = String.valueOf(text); maintainLog(logText); } public void log (int[] text){ StringBuilder builder = new StringBuilder(); for (int i : text) { builder.append(i); builder.append("-"); } String logText = builder.toString(); maintainLog(logText); } public void log (byte[] text){ StringBuilder builder = new StringBuilder(); for (int i : text) { builder.append(i); builder.append("-"); } String logText = builder.toString(); maintainLog(logText); } private void maintainLog(String newText){ String logText = ""; if(logCount<logCountMax) logCount++; for(int i=logCount-1; i>0; i--){ logs[i] = logs[i-1]; } logs[0] = newText; for(int i=0; i<logCount; i++){ if(i<logCount-1) logText+=logs[i]+System.getProperty("line.separator"); else logText+=logs[i]; } tvLog.setText(logText); } public void clearLog(){ tvLog.setText(""); } public void setLogVisible(boolean visibility){ if(visibility) tvLog.setVisibility(View.VISIBLE); else tvLog.setVisibility(View.INVISIBLE); OnScreenLog.visibility = visibility; } public static int getLogCountMax() { return logCountMax; } public static void setLogCountMax(int logCountMax) { OnScreenLog.logCountMax = logCountMax; logs = new String[logCountMax]; } public int getMaxClicks() { return maxClicks; } public void setMaxClicks(int maxClicks) { this.maxClicks = maxClicks; } Handler timerHandler = new Handler(); Runnable rTimeout = new Runnable() { @Override public void run() { cntClicks = 0; } }; } 

То, например:

 public class Activity1 extends AppCompatActivity { private OnScreenLog log; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_1); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); log = new OnScreenLog(this, R.id.content_1); log.log("Started log on Activity 1"); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(getApplicationContext(), Activity2.class); startActivity(intent); log.log("Starting Activity 2"); Snackbar.make(view, "Starting Activity 2", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); } 

Где R.id.content_1 – это имя основного LinearLayout или RelativeLayout вашей деятельности.

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/content_1" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="br.com.ideiageni.onscreenlogSample.Activity1" tools:showIn="@layout/activity_1"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Activity 1!" /> </RelativeLayout> 

Работа еще не закончена, но может быть использована для всех, кто в ней нуждается. Отсутствуют некоторые указания по использованию. Предложения приветствуются.

Если вы хотите очистить вывод вышеприведенного ответа немного до определенной темы, то вот одно из решений:

** Двоеточие может не работать в зависимости от того, как отформатирован ваш журнал **

 while ((line = bufferedReader.readLine()) != null) { CharSequence cs = "Mqtt:"; //topic string (the colon helps cut out false positives) if (line.contains(cs)) { log.append(line.substring(line.indexOf("Mqtt:"),line.length())); // Cuts out the junk at the beginning of the log log.append("\n"); // makes log print line by line like normal } } 

Спасибо @Dawid за отличную ссылку на хороший ответ!