레이블이 [IT/Android]인 게시물을 표시합니다. 모든 게시물 표시
레이블이 [IT/Android]인 게시물을 표시합니다. 모든 게시물 표시

2014년 8월 15일 금요일

Logcat 이용시 line number 넣기

로그캣 이용시 에러 메시지는 안드로이드가 내뱉기 때문에 더블클릭시에 해당 소스라인으로 바로 점프가 됩니다.

하지만 저희가 입력하는 로그의 경우 그렇지 못하죠.

그래서 저는 별도의 로그를 만들어서 사용합니다.



public static void toLog(String TAG, String STR) {

Log.i(TAG, STR+"("+lineOut()+")");

}

이렇게 사용하게 되면 제가 원하는 태그와 메시지 그리고 그 메시지 뒤에 라인넘버 정보가 나오게 됩니다. 이 정보를 넣게 되면 더블클릭 했을시에 안드로이가 뱉는 에러 메시지 처럼 바로 소스로 접근이 가능하게 되어서 굉장히 편하죠.

lineOut 이라는 함수가 그 주인공인데 그 내부는 다음과 같습니다.



public static String lineOut() {
   int level = 4;
   StackTraceElement[] traces;
   traces = Thread.currentThread().getStackTrace();
   return (" at "  + traces[level] + " ");
}



현재 Thread 의 StackTraceElement 들을 보면 함수를 호출하는 스택을 가지고 있습니다.
이 스택을 보게 되면 아마 여러분도 대충 감이 오실거라 생각됩니다.


위 메시지는 제가 traces level을 0~4 까지 보았을때의 연속적인 Stack 의 메시지를 출력한 결과입니다.
toLog()라는 메시지는 실제로 onStart 라는 함수에서 불려졌지만 이는 StackTraceElement중 4번째에 해당됩니다.

Thread의 StackTrace는 안드로이드의 핵심인 dalvik에서 관리되고 있습니다.

저의 경우 lineOut이라는 함수가 toLog 함수 안에 다시 포함되어지기 때문에 5번째 스택에 들어있지만 여러분의 기호에 맞게 level 을 설정 하셔서 쓰시면 되겠습니다.

StackTrace문장이 한 로그에 하나의 Element 만 있다면 더블 클릭시에 해당 소스 페이지로 넘어가기 때문에 검색을 하거나 찾을 필요가 없어 굉장히 편리합니다~~

나름 꿀팁이랄까... 수고하세요~

2014년 6월 24일 화요일

Eclipse DDMS Logcat 이용시 Log를 통해 line number( 라인 넘버 ) 찍기


 Log.d(TAG, "라인넘버를 넣어봅시다  " + Utils.lineOut());


1
2
3
4
5
6
public static String lineOut() {
    int level = 3;
    StackTraceElement[] traces;
    traces = Thread.currentThread().getStackTrace();
    return (" at "  + traces[level] + " " );
}

함정이 있다면..

Log.d()함수를 다시 재수정 해서 Utils.lineOut()을 넣으려 해도 예를들면

1
2
3
public static void toLog(String str1, String str2) {
    Log.d(str1,str2+Util.lineOut());//여기가 45라인이라 칩시다.
}

// 요렇게 해도 해당 toLog()를 콜한 지점이 아닌 toLog()함수 자체의 라인넘버인
// 45만 나옵니다. 해결법은 아직 찾지 못했습니다..아시는분 댓글 부탁드립니다~

2013년 5월 1일 수요일

VideoView 를 Rotate 할때 깨짐현상 해결법


비디오뷰가 있을때 Orientation을 Rotate 뷰의 크기를 전체화면으로 해야하는데 이때 비디오뷰가 깨지는 현상을 발견하였다. ( 아센기준 ) 
해결법공개

@Override
public void onConfigurationChanged(Configuration newConfig) {

// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
switch (newConfig.orientation) {
case Configuration.ORIENTATION_LANDSCAPE:
toLog("ORIENTATION_LANDSCAPE");

if (videoview.isPlaying()) {
this.videoview.pause();
pause_flag = 1;
}
else {
pause_flag = 0;
}
toLog("pause_flag = " + pause_flag);

this.video_content_total_linear.setWeightSum((float) 1);
this.top_linear.setVisibility(View.GONE);
this.bottom_scroll.setVisibility(View.GONE);
this.top_txt.setVisibility(View.GONE);
this.bottom_linear.setVisibility(View.GONE);

LayoutParams params = video_videoview_linear.getLayoutParams();
Log.i("@#@===MY===@#@", "params.height = " + params.height);
Log.i("@#@===MY===@#@", "params.width =" + params.width);
params.height = android.widget.LinearLayout.LayoutParams.FILL_PARENT;
params.width = android.widget.LinearLayout.LayoutParams.FILL_PARENT;
this.video_videoview_linear.setLayoutParams(params);

toLog("Landscape layout GONE.");
toLog("videoview.getMeasuredHeight() = " + videoview.getMeasuredHeight());
toLog("videoview.getMeasuredWidth() = " + videoview.getMeasuredWidth());
toLog("this.width" + this.width);
toLog("this.height" + this.height);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
videoview.getHolder().setFixedSize(800, 480);
videoview.setMeasureDimensionDIS(800, 480);

if (pause_flag == 1) {
videoview.postInvalidate();
this.videoview.start();

}
// synchronized (videoview) {
// toLog("notifyAll");
// videoview.notifyAll();
// }
break;

case Configuration.ORIENTATION_PORTRAIT:
toLog("ORIENTATION_PORTRAIT");
if (videoview.isPlaying()) {
this.videoview.pause();
pause_flag = 1;
}
else {
pause_flag = 0;
}
toLog("pause_flag = " + pause_flag);

this.video_content_total_linear.setWeightSum(2);
LayoutParams params1 = video_videoview_linear.getLayoutParams();
params1.height = 0;
params1.width = android.widget.LinearLayout.LayoutParams.FILL_PARENT;
this.video_videoview_linear.setLayoutParams(params1);

this.top_linear.setVisibility(View.VISIBLE);
this.bottom_scroll.setVisibility(View.VISIBLE);
this.bottom_linear.setVisibility(View.VISIBLE);
this.top_txt.setVisibility(View.VISIBLE);

toLog("Portrait layout VISIBLE.");
toLog("videoview.getMeasuredHeight() = " + videoview.getMeasuredHeight());
toLog("videoview.getMeasuredWidth() = " + videoview.getMeasuredWidth());
toLog("this.width" + this.width);
toLog("this.height" + this.height);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
videoview.getHolder().setFixedSize(480, 330);
videoview.setMeasureDimensionMEASUR(480, 330);

if (pause_flag == 1) {

videoview.postInvalidate();
this.videoview.start();

}

break;

case Configuration.ORIENTATION_UNDEFINED:
toLog("ORIENTATION_UNDEFINED");
break;

default:
break;
}
}

flag 를 새로 집어넣는 것이 매우 중요!

2013년 4월 14일 일요일

Sky Canvas


Android 4.1.2
S-Pen SDK 2.2.5
Augmented Reality

S-Pen 을 이용한 메모를 실제 지도상 위치에 올릴수 있는 
증강현실 메모

git 
https://github.com/rusakakstp/SkyCanvas

android s-pen AR memo

android s-pen augmented reality memo