【问题标题】:Show log messages on screen for Android application在 Android 应用程序的屏幕上显示日志消息
【发布时间】:2011-05-13 16:01:49
【问题描述】:

是否可以在 Android 应用程序的屏幕上显示日志消息(我使用 android.util.Log 打印)?

还有其他更好的方法来在屏幕上输出行吗?

类似System.out.println?

【问题讨论】:

  • 令人惊讶的是人们如何不阅读这个问题。显然,OP 想在屏幕上打印文本行,所有答案都指向日志记录解决方案。

标签: android logging


【解决方案1】:

是的零4

您尝试做的是在 android shell 上删除“logcat”命令并将命令输出作为输出流。link 将帮助您。

【讨论】:

    【解决方案2】:

    就像其他人建议的那样,您可以使用 log cat。如果您正在使用模拟器或调试设备,您可以使用adb logcat 来查看消息。在 Eclipse 调试透视图中,有一个窗口可以为您执行此操作。

    另一种不附加调试器的方法是使用CatLog - Logcat Reader 应用程序。

    【讨论】:

    • 这非常有用,但是如果您需要应用程序中包含的日志,那么下面 100rabh 的答案就是您所要求的。 (一种读取android.util.Log并在应用中显示的方法)
    • 另外,CatLog 现在需要 Root。如果您没有可用的 Root,那么到目前为止我发现的唯一方法是从您的应用程序中调用“logcat”作为非 root shell 命令。 (请参阅提供的链接 100rabh 的答案)
    • androidPIT.com 的链接已于 2018 年 1 月 25 日断开
    【解决方案3】:

    我使用“android.widget.Toast.makeText(Context context, CharSequence text, int duration)”来执行您所要求的操作。似乎是在屏幕上获取一些快速消息并使其自动消失的最简单方法(基于最后一个参数)。

    :-)

    【讨论】:

    • 真的吗? Toast 用于消息,而不是像 android.util.Log 这样的日志输出流。尝试在 10 秒内使用 LENGTH_SHORT 进行 50 次 Toast'ing。您将一个接一个地观看 Toasts 5 分钟。另外,您是如何阅读 android.util.Log 的?
    • 在您决定否决投票之前,请参阅问题。他想要一种将日志消息打印到屏幕上的方法。请注意,问题不是如何从日志中读取并写入屏幕,而是在他的代码执行日志本身时控制它。我不是建议用 toast 写他所有的日志(这显然不是一个好主意),但如果他想在屏幕上看到一些关键信息(这是他问题的主要要求),我仍然支持我的“替代” Toast 建议(除了 logcat),除非我看到您的“更好和通用”的解决方案不是 logcat。
    • 我做到了。 “他想要一种将日志信息打印到屏幕上的方法。”不,他想要一种将 android.util.Log 消息打印到屏幕上的方法。如果您需要自己执行此操作(我这样做,这就是我偶然发现这个 SO 问题的原因),您不会建议 Toast,它无助于从应用程序中读取日志,也无助于显示记录到 android.util.Log 的消息类型。日志不仅仅是一种调试方式,而 Toast 是一种替代调试工具。您不能只在应用程序的任何地方吐司,但您可以记录。 A -1 对我来说也会失分。这个答案没有帮助。
    • 公平点。我猜我误解了 Q 并且应该得到 -1 :)
    • 好主意!。我像许多其他人一样丢失了我的 logcat(请参阅:stackoverflow.com/questions/17432358/…)。这是一个很好的解决方法。谢谢
    【解决方案4】:

    嗯,有一个解决方案可以使用this lib 在屏幕上记录您想要的任何内容。它对我不起作用,所以我开发了自己的解决方案,您可以找到它的示例here。真的很简单,在你的项目中添加一个类 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>
    

    这两种解决方案都不会打印当前的日志消息,因此您需要告诉它记录以筛选您今天在当前日志上记录的相同信息。

    工作尚未完成,但可供有需要的人使用。缺少一些有关如何使用的说明。欢迎提出建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多