2010-11-22 7 views
13

Android 응용 프로그램의 화면에 로그 메시지 (android.util.Log를 사용하여 인쇄)를 표시 할 수 있습니까?Android 응용 프로그램의 화면에 로그 메시지 표시

화면에 선을 출력하는 더 좋은 방법이 있습니까?

와 비슷한 것 System.out.println?

+9

놀라운 사람들이 어떻게이 질문을 읽지 않는지 놀라운. 분명히 OP는 화면에 텍스트 줄을 인쇄하고 모든 대답은 계속 로깅 솔루션을 가리키고 있습니다.덕분에 – Kyberias

답변

4

다른 사람들이 제안한 것처럼 Log cat을 사용할 수 있습니다. 에뮬레이터를 사용하거나 장치를 디버깅하는 경우 adb logcat을 사용하여 메시지를 볼 수 있습니다. 이클립스 디버그 퍼스펙티브에는, 당신을 위해 할 윈도우가있다.

디버거가 연결되지 않은 또 다른 방법은 CatLog - Logcat Reader 응용 프로그램을 사용하는 것입니다.

+0

logcat reader great works! – n1kh1lp

+0

매우 유용합니다.하지만 앱에 포함 된 로그가 필요하다면 아래에있는 100rabh의 답변이 필요합니다. (android.util.Log를 읽고 앱에 표시하는 방법) – garlicman

+1

또한 CatLog에는 Root가 필요합니다. 루트를 사용할 수 없다면 지금까지 찾은 유일한 방법은 앱에서 루트가 아닌 쉘 명령으로 "logcat"을 호출하는 것입니다. (100rabh의 답변 링크를 참조하십시오.) – garlicman

2

편집

나는 우리가 몇 가지 프레임 워크를 안드로이드에서 사용할 수 있다고 생각합니다. 그것이 작동하는 경우 이러한 링크를 확인하고 볼 마십시오

http://developer.android.com/reference/java/util/logging/Logger.html

http://developer.android.com/reference/java/util/logging/LogManager.html

또한이 프로젝트를 확인하실 수 있습니다 ...

http://code.google.com/p/microlog4android/

+0

. 방금 질문을 편집했습니다. 화면에 인쇄 라인을 유지하는 간단한 방법이 있습니까? – n1kh1lp

+0

시스템에서 로그를 표시하면 문제가 발생하지 않습니다. 나는 당신이 첫 번째 부분에 문제가 있다고 가정합니다 ... 내 업데이트 된 게시물을 확인하십시오 – DeRagan

2

예 zero4

당신이하려고하는 것은 'logcat'comand를 android shell 01에 놓는 것입니다.명령 출력을 출력 스트림으로 얻습니다.이 link이 도움이 될 것입니다.

1

"android.widget.Toast.makeText (Context context, CharSequence text, int duration)"를 사용하여 요청한 것과 같은 작업을 수행합니다. 일부 빠른 메시지를 화면에 표시하고 자동으로 사라지게하는 가장 쉬운 방법 인 것 같습니다 (마지막 매개 변수를 기반으로 함).

:-)

+0

Really? Toast는 android.util.Log와 같은 로그 출력 스트림이 아니라 메시지를위한 것입니다. LENGTH_SHORT (으)로 토스트하기를 10 초 동안 50 번 시도해보십시오. 5 분 동안 토스트를 차례로 볼 수 있습니다. 또한 android.util.Log에서 어떻게 읽으십니까? – garlicman

+0

투표를하기 전에 질문을 참조하십시오. 그는 로그 메시지를 화면에 인쇄하는 방법을 원했습니다. 로그에서 읽거나 화면에 쓰는 방법이 아니라 로그 자체를 코드 할 때 제어하는 ​​것이 문제였습니다. 나는 토스트를 사용하여 그의 모든 로그를 쓰는 것을 제안하지 않았다. (분명히 좋은 생각은 아니다.) 그러나 그가 스크린에서 몇 가지 주요 메시지를 보길 원한다면 (나는 그의 질문에서 주요한 요구 사항이었다.), 나는 여전히 나의 "대체" 토스트 제안 (logcat에 추가), 내가하지 않는 logcat "귀하의"더 나은 일반 "솔루션을 참조하십시오. –

+0

나는했다. "그는 로그 메시지를 화면에 인쇄하는 방법을 원했습니다." 아니, 그는 android.util.Log 메시지를 화면에 인쇄하는 방법을 원했습니다. 만약 당신이 스스로 할 필요가 있다면 (내가 무엇을했는지, 그래서 나는이 우연히 의문을 갖게되었다.) 앱에서 로그를 읽는 데 도움이되지 않는 토스트를 제안하지 않았을 것이다. android.util.Log에 기록되는 종류의 메시지. Log는 Toast가 대체 디버그 툴인 곳을 디버깅하는 방법이 아닙니다. 앱의 어느 곳에서나 토스트 할 수는 없지만 로그 할 수는 있습니다. -1도 나를 위해 점수를 잃는다. 이 대답은 도움이되지 않습니다. – garlicman

0

글쎄, 당신은 this lib 디렉토리를 사용하여 화면에 원하는 모든 것을 기록 할 수있는 솔루션이 있습니다. 그것은 나를 위해 일하지 않았다. 그래서 나는 내 자신의 해결책을 개발했다. 그것의 예를 찾을 수있다. here. 정말 간단합니다, 그냥 예를 들어,

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

다음 프로젝트에 클래스 OnScreenLog을 추가 R.id.content_1이 활동의 ​​주요있는 LinearLayout이나 RelativeLayout의의 이름입니다

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(); 
     } 
    }); 
} 

합니다.

<?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> 

어느 솔루션은 현재 로그 메시지를 인쇄, 그래서 당신은 당신이 당신의 현재 로그에 오늘 기록 같은 정보를 화면에 기록하도록 지시해야합니다.

아직 완료되지 않았지만 도움이 필요한 사람에게 사용할 수 있습니다. 사용법에 대한 몇 가지 지시 사항이 누락되었습니다. 제안을 환영합니다.

관련 문제