먼저 그동안 자바의 스트링 포멧에 대한 이해가 부족했었다.
안드로이드를 써서 euc-kr로 되어있는 한글홈페이지를 접근했었는데....
한글이 모두깨져 나왔다.

그래서 주로 c로 개발을 했던나로써는 바이트 문자열에 접근해서 코드체계를 직접 바꾸려는 시도를 하려고했었다.

그러나 나중에 자바의 스트링은 c언어의 문자열과는 차원이 다르게 고차원이라는것을 알았다.

 
new String("문자열","euc-kr"); 
최초 생성할때 이런식으로 인코딩자체를 지정해줄수도있다.

그래서 깨지는 문자열을

byte[] bytes = str.getBytes("euc-kr");
String newStr = new String(bytes,"utf-8");
TextVw.setText(newStr);

이와 같이 utf-8로 복원을 시키면 어떨까 생각하고 시도를 해봤지만 결과는 카오스.... ㅡ.ㅡ;;

무엇이 잘못됐을까 곰곰히 생각해보니 입력받을 당시에도 코드를 지정할수있다는 것을 발견할수있었다.
입력스트림 대상이 파일건 인터넷 http든 결국 inputstream으로 받아오는데...

InputStreamReader(InputStream in, String enc)
Constructs a new InputStreamReader on the InputStream in.

이런게 있다는 사실 발견!!

그렇다 처음부터 잘못받아온걸 다시 수정하려니 그게 문제였던거다.

그래서 스트림에서 받아올 시점에 아래와같이 두번째 인자를 "euc-kr" 로 줘서 해결 해줬다.

BufferedReader br = new BufferedReader(
new InputStreamReader(Httpconn.getInputStream(),"euc-kr"));

Httpconn 의 데이터 형은 HttpURLConnection이다.

-전체 소스-

public static String DownloadHtml(String addr) {
StringBuilder html = new StringBuilder(); 
try {
URL url = new URL(addr);
//HttpURLConnection conn = (HttpURLConnection)url.openConnection();
HttpURLConnection conn = null; 
            
            if (url.getProtocol().toLowerCase().equals("https")) { 
             //   trustAllHosts(); 
             //   HttpsURLConnection https = (HttpsURLConnection) url.openConnection(); 
              //  https.setHostnameVerifier(DO_NOT_VERIFY); 
              //  conn = https; 
            } else { 
             conn = (HttpURLConnection) url.openConnection(); 
            } 
if (conn != null) {
conn.setConnectTimeout(10000);
conn.setUseCaches(false);
int resultcode = conn.getResponseCode();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
BufferedReader br = new BufferedReader(
new InputStreamReader(conn.getInputStream(),"euc-kr"));
for (;;) {
String line = br.readLine();
if (line == null) break;
html.append(line + '\n'); 
}
br.close();
}
conn.disconnect();
}
catch (Exception ex) {
Log.i("error",ex.getMessage());
return ex.getMessage();
//System.out.println(ex.getMessage());
}
return html.toString();
}
[출처]http://gbox3d.tistory.com/entry/javaeuckr
Posted by 컴투
일반적인 경우, 안드로이드 용 어플리케이션을 작성하게 되면 여러가지 Activity 들을 생성하게 됩니다. 이때, 가장 골치가 아픈 일 중 하나는 바로 Activity 와 Activity 간의 Flow 를 설계하고 이를 적절하게 구현하는 일입니다. (특히 안드로이드를 사용해보지도 않은 UX 팀과 함께 일하게 되는 경우라면 더욱 그러합니다...)

 기본적으로 안드로이드 플랫폼 상에서 Activity 는 또 다른 Activity 를 시작할 수 있고, 각각의 Activity 는 차곡 차곡 Task 라고 불리우는 Activity Stack 에 쌓이게 됩니다. 사용자는 일반적으로 Back 버튼을 이용해서 현재 화면상에 보이는 Activity 를 종료 시키고, 바로 직전에 사용된 Activity 로 돌아갈 수 있습니다. 안드로이드 펍의 회색님의 말을 빌리자면, 인터넷 브라우저를 통해 웹페이지를 검색하는 것과 유사한 방식입니다. 

 하지만 이러한 방법만으로는 효과적인 UX Flow 를 구축하는데 어려움이있습니다. 다행히, 구글에서는 Activity 를 호출할 때 사용되는 Intent 에 적절한 플래그 값을 설정해서 Activity Stack 을 제어할 수 있는 방법을 제공해 줍니다. 이 플래그들은  FLAG_ACTIVITY 라는 접두어를 갖고 있는데, 종류가 다양해 헷갈리는 수도 있는데, 개인적으로 제가 가장 요긴하게 사용하고 있는 FLAG_ACTIVITY 네 가지를 소개해 봅니다. 

 먼저 FLAG_ACTIVITY_SINGLE_TOP 입니다. 우선 간단하게 그림으로 표현해 보았습니다. A 와 B  두 가지 Activity 가 있는 데, A 라는 Activity 는 B 를 B 라는 Activity 는 다시 자기 자신인 B 를 호출 하는 경우라고 가정해 보겠습니다. 
< FLAG_ACTIVITY_SINGLE_TOP >

 호출하는 Activity B 가 이미 Task 의 가장 앞에 위치하는 경우, 또 하나의 B 를 생성하는 대신, 기존에 존재하는 B Activity 가 재활용됩니다. 이 때 B 가 재활용된다는 것을 개발자가 알아채고 새롭게 전달되는 Intent 를 사용할 수 있도록 B Activity 의 onPause() / onNewIntent() / onResume() 가 순차적으로 호출됩니다. 별 생각없이 동일한 Activity 를 여러번 생성하는 것은 메모리 사용량과 Activity 시작 속도 양쪽 모두에 악영향을 끼칠 수 있습니다. (특히 이미지가 덕지덕지 붙어 있는 Activity 라면). 이런 경우 FLAG_ACTIVITY_SINGLE_TOP 를 적절하게 활용하면 제법 큰 효과를 볼 수 있습니다.

 두 번째는, FLAG_ACTIVITY_NO_HISTORY 플래그입니다. 우선 간단하게 그림으로 표현해 보았습니다. A 와 B  두 가지 Activity 가 있는 데, A 라는 Activity 는 B 를 B 라는 Activity 는 A 를 호출한 후 에 (A->B->A) 사용자가 Back 키를 누르는 경우를 가정해 보겠습니다.
<FLAG_ACTIVITY_NO_HISTORY>

 말 그대로, FLAG_ACTIVITY_NO_HISTORY 로 설정된 Intent 로 시작된 Activity B 는 Task 에 그 흔적을 남기지 않게 됩니다. B 에서 또다른 A 를 시작한 후, Back 을 누르면 일반적인 경우 이전에 실행되었던 B 가 나타나지만, NO_HISTORY 를 사용하는 경우 맨 처음에 실행 되었던 A 가 화면에 표시됩니다. 몇 가지 주의할 점이 있습니다. 우선 NO_HISTORY 를 사용하게 되면 Task 에 해당 Intent 의 정보가 기록되지 않기 때문에, A->B 인 상황 (그림에서 두 번째 단계...) 에서 홈키등을 눌러 다른 Task 로 전환된 후, 다시 본 Task 로 돌아오게 되면, A Activity 가 화면에 표시됩니다. 또한, B Activity 의 onDestroy() 가 호출되는 시점이 조금 애매합니다.일반적인 예상과는 달리, B 에서 또다른 A Activity 를 호출하는 세 번째 단계에서는 onStop 까지만 호출되고, 이 후에 새롭게 호출된 A Activity 가 사라지는 순간 (네 번째 단계) 에서야 onDestroy() 가 호출 됩니다.

 FLAG_ACTIVITY_NO_HISTORY 는 여러가지로 쓸모가 있는데, 특히 특정한 이벤트에 대한 알람등을 위해 다이얼로그 형태로 화면에 표시되는 Activity 들에 적용하기에 편리합니다. (대게의 경우 팝업은 해당 시점에 한번만 보여주면 되니까.)

 다음으로 굉장히 유용한 플래그 두 가지를 동시에 설명해보고자 합니다. FLAG_ACTIVITY_REORDER_TO_FRONT 와 FLAG_ACTIVITY_CLEAR_TOP 플래그입니다. 우선 간략하게 그림으로 살펴 보겠습니다. A Activity 에서 B Activity 를 그리고 B 에서 A 를 호출하는 상황을 가정해보았습니다. (A->B->A)


 FLAG_ACTIVITY_REORDER_TO_FRONT 는 매우 특이하게도 Task 의 순서 자체를 뒤바꿔 줍니다. 이 플래그를 사용하면, 런치하고자 하는 Activity 가 이미 Task 상에 존재하는 경우 해당 Activity 를 새롭게 생성하는 대신, 아래쪽에 위치한 Activity 의 순서를 Task 의 가장 위로 끌어올려줍니다. 따라서 A->B->A 의 순서로 Activity 호출이 일어날때, 새로운 A 가 생성되는 대신 아래쪽에 위치한 A 가 위로 올라와 최종적으로 B->A 의 형태로 Task 가 구성되게 됩니다. 어떤 Activity 에서 특정 Activity 로 점프하는 형식의 Flow 를 구성해야하는 경우 요긴하게 사용될 수도 있지만, Task 의 순서를 뒤섞는 다는 점에서 사용에 주의를 기울일 필요가 있습니다.  (별 생각없이 남발하게 되면 Back 키가를 누를 때 엉뚱한 Activity 가 표시되어 사용자들이 굉장히 혼란스러워 하는 경우가 있습니다.) 

 마지막으로 소개해 드릴 플래그는 바로 FLAG_ACTIVITY_CLEAR_TOP 입니다. 제가 개인적으로 가장 사랑스럽게 생각하는 녀석입니다. 이 플래그가 사용되는 경우  
런치하고자 하는 Activity 가 이미 Task 상에 존재하는 경우, 해당 Activity 위에 존재하는 다른 Activity 를 모두 종료시켜 줍니다. 따라서 A->B->A 로 호출이 일어나는 경우, B Activity 가 종료 되고, A Activity 만 Task 에 남게 됩니다. (A->B->C->A 인 경우에도 마찬가지로 B와 C 가 종료되고 A 만 남게 됩니다.)

  이 Flag 는 특정 어플리케이션의 대쉬보드 (혹은 홈) Activity 를 호출할 때 굉장히 유용하게 사용될 수 있습니다. 즉 하나의 어플리케이션이 하나 혹은 두 가지의 주요한 Activity 와 그 외 특정 값을 선택하는등 단순한 일을 수행하기 위한 여러 개의 Sub-Activity 로 구성되어 있다면, 주요 Activity 를 호출하는데 이 Flag 를 사용함으로서 어플리케이션의 홈버튼등을 손쉽게 구현할 수 있습니다. 또 이 Flag 는 FLAG_ACTIVITY_REORDER_TO_FRONT 와는 달린 Task 의 순서를 뒤섞지 않음으로 사용자에게도 큰 혼란을 주지 않습니다. (사용을 적극 권장합니다.)

 한 가지 주의해야할 점은 A->B->A 형태로 Activity 를 호출 하고자 할 때, 단순히 FLAG_ACTIVITY_CLEAR_TOP 만을 사용하게 되면, 기존에 생성되었던 A Activity 가 종료된 후 (onDestroy() 가 호출됨) 새롭게 A 가 생성 (onCreate()) 됩니다. 만일 기존에 사용된 A Activity 가 계속 사용되기를 원한다면, SINGLE_TOP 플래그와 함께 사용해야 합니다.

 휴... 생각보다 내용이 길어졌네요. 대부분 SDK 문서를 읽어보면 잘 나와있는 내용이라 새로운 내용은 없습니다만... 문서 읽기를 게을리한 덕분에 한창을 고생했던 기억이 떠올라 (특히 CLEAR_TOP) 유용하게 사용한 Flag 를 정리하는 겸 작성해 보았습니다~

출처: http://surprisen.egloos.com/2511530
Posted by 컴투
출처 : http://miksnug.pe.kr/24


Android 에서 Multi Touch 를 구현한 Code 입니다.
허접하지만 튜닝하면 좀 더 나아지지 않을까 생각합니다.


+ MainActivity.java
  1. package kr.pe.miksnug;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.Context;  
  7. import android.graphics.Canvas;  
  8. import android.graphics.Color;  
  9. import android.graphics.Paint;  
  10. import android.os.Bundle;  
  11. import android.os.Vibrator;  
  12. import android.view.MotionEvent;  
  13. import android.view.View;  
  14. import android.widget.FrameLayout;  
  15. import android.widget.TextView;  
  16.   
  17. /** 
  18.  * 안드로이드 멀티터치 입니다.<br/> 
  19.  * <br/> 
  20.  * 프로젝트 실행 Main Activity 클래스 <br/> 
  21.  * Android 2.0 이상 지원 <br/> 
  22.  * <br/> 
  23.  * 1. 멀티터치 감지 (구현상 무한대)<br/> 
  24.  * 2. 터치점에 원형 표시<br/> 
  25.  * 3. 누르는 힘에 따라 색깔 및 크기 변경<br/> 
  26.  * 4. 누르는 힘에 따라 진동 변경<br/> 
  27.  * <br/> 
  28.  *  
  29.  * @author yeongeon 
  30.  *  
  31.  */  
  32. public class MainActivity extends Activity {  
  33.   
  34.     /** 
  35.      * 메인 레이아웃 인스턴스 
  36.      */  
  37.     private FrameLayout m_mainLayout = null;  
  38.   
  39.     /** 
  40.      * 디버그 텍스트 출력용 뷰 
  41.      */  
  42.     TextView m_tvDebugText = null;  
  43.     TextView m_tvDebugText2 = null;  
  44.   
  45.       
  46.     /** 
  47.      * 입력된 이벤트 수 
  48.      */  
  49.     private int m_eventCnt = 0;  
  50.   
  51.     /** 
  52.      * 원 도형 View 클래스 
  53.      *  
  54.      * @author yeongeon 
  55.      */  
  56.     class Ball extends View {  
  57.   
  58.         /** 
  59.          * X 좌표 
  60.          */  
  61.         public float m_x;  
  62.   
  63.         /** 
  64.          * Y 좌표 
  65.          */  
  66.         public float m_y;  
  67.   
  68.         /** 
  69.          * 반지름 
  70.          */  
  71.         private int m_r;  
  72.   
  73.         /** 
  74.          * 페인트 인스턴스 
  75.          */  
  76.         private Paint m_paint = new Paint(Paint.LINEAR_TEXT_FLAG);  
  77.   
  78.         /** 
  79.          * 원 도형 생성자 
  80.          *  
  81.          * @param context 
  82.          * @param x 
  83.          * @param y 
  84.          * @param r 
  85.          * @param color 
  86.          */  
  87.         public Ball(Context context, float x, float y, int r, int color) {  
  88.             super(context);  
  89.             m_paint.setColor(color);  
  90.             this.m_x = x;  
  91.             this.m_y = y;  
  92.             this.m_r = r;  
  93.         }  
  94.   
  95.         /** 
  96.          * 도형 그리는 메소드 
  97.          *  
  98.          * @see android.view.View#onDraw(android.graphics.Canvas) 
  99.          */  
  100.         @Override  
  101.         protected void onDraw(Canvas canvas) {  
  102.             canvas.drawCircle(m_x, m_y, m_r, m_paint);  
  103.             super.onDraw(canvas);  
  104.         }  
  105.   
  106.     }  
  107.       
  108.   
  109.     /** 
  110.      * MyText View 클래스 
  111.      *  
  112.      * @author yeongeon 
  113.      */  
  114.     class FloatingText extends View {  
  115.   
  116.         /** 
  117.          * X 좌표 
  118.          */  
  119.         public float m_x;  
  120.   
  121.         /** 
  122.          * Y 좌표 
  123.          */  
  124.         public float m_y;  
  125.   
  126.         /** 
  127.          * 반지름 
  128.          */  
  129.         private String m_t;  
  130.   
  131.         /** 
  132.          * 페인트 인스턴스 
  133.          */  
  134.         private Paint m_paint = new Paint(Paint.LINEAR_TEXT_FLAG);  
  135.   
  136.         /** 
  137.          * 원 도형 생성자 
  138.          *  
  139.          * @param context 
  140.          * @param x 
  141.          * @param y 
  142.          * @param r 
  143.          * @param color 
  144.          */  
  145.         public FloatingText(Context context, float x, float y, String t, int color) {  
  146.             super(context);  
  147.             m_paint.setColor(color);  
  148.             this.m_x = x;  
  149.             this.m_y = y;  
  150.             this.m_t = t;  
  151.         }  
  152.   
  153.         /** 
  154.          * 도형 그리는 메소드 
  155.          *  
  156.          * @see android.view.View#onDraw(android.graphics.Canvas) 
  157.          */  
  158.         @Override  
  159.         protected void onDraw(Canvas canvas) {  
  160.             canvas.drawText(m_t, m_x, m_y, m_paint);  
  161.             super.onDraw(canvas);  
  162.         }  
  163.   
  164.     }  
  165.   
  166.     /** 
  167.      * 터치 이벤트 개별 노드 클래스 
  168.      *  
  169.      * @author yeongeon 
  170.      */  
  171.     class EventNode {  
  172.         /** 
  173.          * 포인터 아이디 
  174.          */  
  175.         private int m_pointerId = -1;  
  176.   
  177.         /** 
  178.          * 포인터 인덱스 
  179.          */  
  180.         private int m_pointerIndex = -1;  
  181.   
  182.         /** 
  183.          * x 좌표 값 
  184.          */  
  185.         private float m_x = -1;  
  186.   
  187.         /** 
  188.          * y 좌표 값 
  189.          */  
  190.         private float m_y = -1;  
  191.   
  192.         /** 
  193.          * 압력 값 
  194.          */  
  195.         private float m_pressure = -1;  
  196.   
  197.         /** 
  198.          * 도형 인스턴스 
  199.          */  
  200.         private Ball m_ball = null;  
  201.   
  202.         /** 
  203.          * Paint 색 
  204.          */  
  205.         private int m_color = Color.YELLOW;  
  206.           
  207.         /** 
  208.          * 진동 시간 간격 
  209.          */  
  210.         int m_vibrationInterval = 2;  
  211.           
  212.         /** 
  213.          * 반지름 
  214.          */  
  215.         int m_radius = 50;  
  216.           
  217.         /** 
  218.          * 떠다니는 문자 인스턴스 
  219.          */  
  220.         FloatingText m_floatingText = null;  
  221.           
  222.           
  223.         /** 
  224.          * 생성자 입니다. 
  225.          *  
  226.          * @param event 
  227.          * @param idx 
  228.          */  
  229.         public EventNode(MotionEvent event, int idx) {  
  230.             this.m_pointerId = event.getPointerId(idx);  
  231.             this.m_pointerIndex = event.findPointerIndex(this.m_pointerId);  
  232.             this.m_x = event.getX(this.m_pointerIndex);  
  233.             this.m_y = event.getY(this.m_pointerIndex);  
  234.             this.setPressure(event.getPressure(this.m_pointerIndex) );  
  235.             if (this.getPressure() >= 0.1 && this.getPressure() < 0.18) {  
  236.                 this.m_color = Color.GREEN;  
  237.                 this.m_vibrationInterval = 3;  
  238.                 this.m_radius = 60;  
  239.             } else if (this.getPressure() > 0.25) {  
  240.                 this.m_color = Color.RED;  
  241.                 this.m_vibrationInterval = 6;  
  242.                 this.m_radius = 100;  
  243.             } else if (this.getPressure() >= 0.18 && this.getPressure() < 0.25) {  
  244.                 this.m_color = Color.BLUE;  
  245.                 this.m_vibrationInterval = 4;  
  246.                 this.m_radius = 70;  
  247.             } else {  
  248.                 this.m_color = Color.YELLOW;  
  249.                 this.m_vibrationInterval = 2;  
  250.                 this.m_radius = 50;  
  251.             }  
  252.             this.m_ball = new Ball(getApplicationContext(), this.getX(), this  
  253.                     .getY(), this.m_radius, this.getColor());  
  254.               
  255.             this.m_floatingText = new FloatingText(getApplicationContext(), this.getX()-(this.m_radius/2), this  
  256.                     .getY()-this.m_radius, ""this.getPressure(), Color.WHITE );             
  257.               
  258.         }  
  259.           
  260.         public FloatingText getFloatingText(){  
  261.             return m_floatingText;  
  262.         }  
  263.           
  264.         public int getVibrationInterval() {  
  265.             return this.m_vibrationInterval;  
  266.         }  
  267.   
  268.         /** 
  269.          * 정의된 Paint 색 값을 반환하는 메소드입니다. 
  270.          *  
  271.          * @return 
  272.          */  
  273.         public int getColor() {  
  274.             return this.m_color;  
  275.         }  
  276.   
  277.         /** 
  278.          * Paint 색을 할당하는 메소드입니다. 
  279.          *  
  280.          * @param color 
  281.          */  
  282.         public void setColor(int color) {  
  283.             this.m_color = color;  
  284.         }  
  285.   
  286.         /** 
  287.          * 압력 값을 반환하는 메소드입니다. 
  288.          *  
  289.          * @return 
  290.          */  
  291.         public float getPressure() {  
  292.             return this.m_pressure;  
  293.         }  
  294.   
  295.         /** 
  296.          * 압력 값을 정의하는 메소드입니다. 
  297.          *  
  298.          * @param pressure 
  299.          */  
  300.         public void setPressure(float pressure) {  
  301.             this.m_pressure = pressure;  
  302.         }  
  303.   
  304.         /** 
  305.          * 포인터 아이디를 반환하는 메소드입니다. 
  306.          *  
  307.          * @return 
  308.          */  
  309.         public int getPointerId() {  
  310.             return this.m_pointerId;  
  311.         }  
  312.   
  313.         /** 
  314.          * 포인터 인덱스를 반환하는 메소드입니다. 
  315.          *  
  316.          * @return 
  317.          */  
  318.         public int getPointerIndex() {  
  319.             return this.m_pointerIndex;  
  320.         }  
  321.   
  322.         /** 
  323.          * x 좌표값을 반환하는 메소드입니다. 
  324.          *  
  325.          * @return 
  326.          */  
  327.         public float getX() {  
  328.             return this.m_x;  
  329.         }  
  330.   
  331.         /** 
  332.          * y 좌표값을 반환하는 메소드입니다. 
  333.          *  
  334.          * @return 
  335.          */  
  336.         public float getY() {  
  337.             return this.m_y;  
  338.         }  
  339.   
  340.         /** 
  341.          * 도형 인스턴스를 반환하는 메소드입니다. 
  342.          *  
  343.          * @return 
  344.          */  
  345.         public Ball getBall() {  
  346.             return this.m_ball;  
  347.         }  
  348.   
  349.         /** 
  350.          * 각 인스턴스 값을 초기화하는 메소드입니다. 
  351.          */  
  352.         public void setInit() {  
  353.             this.m_pointerId = -1;  
  354.             this.m_pointerIndex = -1;  
  355.             this.m_x = -1;  
  356.             this.m_y = -1;  
  357.             this.m_pressure = -1;  
  358.             this.m_color = Color.GREEN;  
  359.             this.m_ball = null;  
  360.         }  
  361.     }  
  362.   
  363.     /** 
  364.      * 모션 이벤트를 담아두는 ArrayList 인스턴스입니다. 
  365.      */  
  366.     private ArrayList<EventNode> m_aEventNodes = new ArrayList<EventNode>();  
  367.   
  368.     /** 
  369.      * Activity 생성시 접근 메소드 
  370.      *  
  371.      * @see android.app.Activity#onCreate(android.os.Bundle) 
  372.      */  
  373.     @Override  
  374.     public void onCreate(Bundle savedInstanceState) {  
  375.         super.onCreate(savedInstanceState);  
  376.         setContentView(R.layout.main);  
  377.   
  378.         // 레이아웃 인스턴드 할당  
  379.         m_mainLayout = (FrameLayout) this.findViewById(R.id.main);  
  380.   
  381.         // 디버그 텍스트 뷰 인스턴스 할당  
  382.         m_tvDebugText = (TextView) this.findViewById(R.id.debug_text);  
  383.         m_tvDebugText2 = (TextView) this.findViewById(R.id.debug_text2);  
  384.     }  
  385.   
  386.     /** 
  387.      * 터치했을때 반응하는 메소드입니다. 
  388.      *  
  389.      * @see android.app.Activity#onTouchEvent(android.view.MotionEvent) 
  390.      */  
  391.     @Override  
  392.     public boolean onTouchEvent(MotionEvent event) {  
  393.         m_eventCnt = event.getPointerCount();  
  394.   
  395.         m_tvDebugText.setVisibility(View.VISIBLE);  
  396.         m_tvDebugText.setText("Points : " + m_eventCnt  
  397.                 + " / EventNodes : " + m_aEventNodes.size());  
  398.   
  399.         switch (event.getAction()) {  
  400.         // 눌렀을 때  
  401.         case MotionEvent.ACTION_DOWN:  
  402.             drawBall(event);  
  403.             return true;  
  404.   
  405.             // 누르고 이동할 때  
  406.         case MotionEvent.ACTION_MOVE:  
  407.             moveBall(event);  
  408.             return true;  
  409.   
  410.             // 떼었을 때  
  411.         case MotionEvent.ACTION_UP:  
  412.             removeBall();  
  413.   
  414.             m_tvDebugText.setVisibility(View.GONE);  
  415.             return true;  
  416.         }  
  417.   
  418.         return false;  
  419.     }  
  420.   
  421.     /** 
  422.      * 도형 그리는 메소드 
  423.      *  
  424.      * @param event 
  425.      */  
  426.     private void drawBall(MotionEvent event) {  
  427.         removeBall();  
  428.         for (int i = 0; i < m_eventCnt; i++) {  
  429.             EventNode eventNode = new EventNode(event, i);  
  430.             m_aEventNodes.add(eventNode);  
  431.             m_mainLayout.addView(eventNode.getBall());  
  432.             m_mainLayout.addView(eventNode.getFloatingText());  
  433.             ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(eventNode.getVibrationInterval());  
  434.         }  
  435.   
  436.     }  
  437.   
  438.     /** 
  439.      * 도형 이동 처리 메소드 
  440.      *  
  441.      * @param event 
  442.      */  
  443.     private void moveBall(MotionEvent event) {  
  444.         removeBall();  
  445.         drawBall(event);  
  446.     }  
  447.   
  448.     /** 
  449.      * 도형 제거 처리 메소드 
  450.      */  
  451.     private void removeBall() {  
  452.         int nSize = m_aEventNodes.size();  
  453.         for (int i = 0; i < nSize; i++) {  
  454.             m_mainLayout.removeView(m_aEventNodes.get(0).getBall());  
  455.             m_mainLayout.removeView(m_aEventNodes.get(0).getFloatingText());  
  456.             m_aEventNodes.remove(0);  
  457.         }  
  458.     }  
  459.   
  460. }  

+ main.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:id="@+id/main" android:orientation="vertical"  
  4.     android:layout_width="fill_parent" android:layout_height="fill_parent">  
  5.     <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent">   
  6.         <TextView android:id="@+id/debug_text2"   
  7.             android:layout_width="wrap_content"  
  8.             android:layout_height="wrap_content"   
  9.             android:gravity="left" />  
  10.         <TextView android:id="@+id/debug_text"   
  11.             android:layout_width="wrap_content"  
  12.             android:layout_height="wrap_content"   
  13.             android:gravity="right"/>  
  14.     </LinearLayout>  
  15. </FrameLayout>  

+ strings.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <string name="app_name">AndroidMultiTouch</string>  
  4. </resources>  

+ AndroidManifest.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="kr.pe.miksnug"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  7.         <activity android:name=".MainActivity"  
  8.                   android:label="@string/app_name"  
  9.                   android:theme="@android:style/Theme.NoTitleBar.Fullscreen">  
  10.             <intent-filter>  
  11.                 <action android:name="android.intent.action.MAIN" />  
  12.                 <category android:name="android.intent.category.LAUNCHER" />  
  13.             </intent-filter>  
  14.         </activity>  
  15.   
  16.     </application>  
  17. <uses-permission android:name="android.permission.VIBRATE"></uses-permission>  
  18. </manifest>   
저작자 표시

추가
--------------------------------------------------------------------
안드로이드 데브가이드 사이트에서 매니페스트에 
<uses-permission android:name="android.hardware.touchscreen.multitouch"/>
이 퍼미션도 주란다..
Posted by 컴투
프로젝트 폴더를 정리하다보니 갑자기 이클립스 설정이 초기화 되어서 이전에 만들었던 프로젝트를 import 시켰더니
Android requires .class compatibility set to 5.0. Please fix project properties. 이런 에러가 발생했다..
이럴때는 아래의 사진처럼 Fix Project Propertiess 를 실행시켜주면 문제 해결!


Posted by 컴투

Hello Android 프로젝트를 하면서 프로젝트 생성시 발생하는 두 개의 에러를 해결하기 위한 방법이다.

프로젝트의 Property 대화상자에서 Java Build Path 의 내용 중 프로젝트에 해당하는 Android 버전을 가장 상위로 올려 준다.

그러면 두 개의 에러가 사라진다.


출처 : http://neodreamer.tistory.com/

Posted by 컴투
아침에 출근해서 집에서 수정해서 가지고 온 프로젝트를 그대로 엎어서(?) 실행을 했더니
갑자기 아래의 글과 함께 에뮬이 실행되지 않는다.

Re-installation failed due to different application signatures.
You must perform a full uninstall of the application. WARNING: This will remove the application data!
Please execute 'adb uninstall com.example.uimain' in a shell.
Launch canceled!

위와 관련글을 찾아보니 사람들이 상세히 설명해 놓았다.
 에뮬레이터에 프로그램을 컴파일하고 인스톨이 되는데, 프로그램 소스의 변화가 심할경우 (예를 들어 AndroidManifest.xml을 건드리거나 맵뷰의 apikey 설정)을 건드릴 경우, 에뮬상의 프로그램하고  시그너쳐 (그러니까 프로그램을 식별할 수 있는 값)가 달라져서 에러가 발생한다는 것이다 .해결방법은 이렇다.

1.   c:\Documents and Settings\<사용자디렉토리>\Local Settings\Application Data\Android\SDK-1.1 이 디렉토리 밑에 userdata-qemu.img  파일을 삭

2. Please execute 'adb uninstall com.example.uimain' in a shell. 라는 메세지 대로 쉘에서 'adb uninstall com.example.uimain' 라고 친다

3. 실행된 에뮬레이터에서 Settings -> Applications -> Manageapplications -> 해당 App 을 직접 Uninstall 시킨다.

3가지중 한가지를 선택해서 실행하면 된다..
Posted by 컴투

안드로이드 개발을 하게 되면서...
웹과의 통신을 하거나.. 스트리밍을 하게 될 때 처음에 이런 에러를 접하게 될 경우가 있습니다.
머 그냥 간단하게 permission 설정을 해주지 않아서 생긴 에러입니다. 이것을 해결 하게 위해서는
manifest파일에 android.permission.INTERNET을 추가해 주면 됩니다.

에러 화면은 이렇습니다. LogCat에 나와 있는 상태가

이런 모습으로 보일 것이고... permission 설정은


현재 진행중인 프로젝트에서 AndroidManifest.xml파일을 열어줍니다.
그리고 나서는


Permissions 탭을 선택하고 나서


Add버튼을 투르게 되면 다이얼로그 창이 하나 나타나게 됩니다.


Uses Permission을 선택하고 OK를 누르고 나갑니다.


마지막으로 Name의 콤보박승에서 android.permission.INTERNET을 선택하고 저장하게 되면 됩니다.
xml파일의 내용을 확인하게 되면

이런식으로 추가된 내용을 확인할 수 있습니다.

이렇게 되면 문제 없이 원하는 대로 실행이 될 것입니다.

출처 : http://drcarter.tistory.com/
Posted by 컴투