BLOG ARTICLE Smart Phone (Mobile)/Android | 11 ARTICLE FOUND

  1. 2010.08.21 Android 간단한 Tip 정리
  2. 2010.08.14 android-opencv 포팅하기 (code.google.com 내용 정리 및 추가) (26)
  3. 2010.07.30 Android GestureDetector 간략한 설명 (1)

Smart Phone (Mobile)/Android 2010.08.21 00:14

* 화면이 자동으로 꺼지는 것을 막는다.
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

* 카메라 줌 설정하기
    "zoom", "taking-picture-zoom" 두가지 설정 방법이 있다. 하드웨어에 따라 달리 사용된다.
    기본적으로 "zoom"을 사용하면 되나, 갤럭시에서는 "taking-picture-zoom"을 사용해야 된다.
    왜 항상 갤럭시는 혼자 저모양인지 모르겠음. (여튼 개발자 최대의 적은 갤럭시인건 분명하다.)
   1. "zoom" parameter 이용
       Camera.Parameters parmeters = camera.getParameters();
       parmeters.set("zoom", String.valueOf(value));
       camera.setParameters(parmeters);
    2. "taking-picture-zoom" parameter 이용
       Camera.Parameters parmeters = camera.getParameters();
       parmeters.set("taking-picture-zoom", String.valueOf(value));
       camera.setParameters(parmeters);

* 카메라 쵀대줌 값 가져오기
    줌 설정과 마찬가지로 "max-zoom", "taking-picture-zoom-max" 두가지 방법이 있다.
    물론 갤럭시는 "taking-picture-zoom-max"을 사용한다. 젠장할~~
    String maxZoomStr = parameters.get("max-zoom");
        또는
    String takingPicMaxZoomStr = parameters.get("taking-picture-zoom-max");

* Intent를 이용한 Web Browser 띄우기
    String webUrl = http://www.google.co.kr;
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(webUrl));
    intent.putExtra(Browser.EXTRA_APPLICATION_ID, AppConstants.APP_ID_TAG);
    context.startActivity(intent);
    
    Extra에 자신 어플리케이션의 ID를 넘기게 되면 동일한 ID에 대해서는 항상 동일한 창에 띄워준다.

* WiFi Mac Address 가져오기
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    String macAddress = wifiInfo.getMacAddress();

    ACCESS_WIFI_STATE 사용 권한을 줘야 한다.
저작자 표시 비영리 동일 조건 변경 허락
신고

Smart Phone (Mobile)/Android 2010.08.14 19:35

Android 어플에서 객체인식 및 특징점 검출, 카메라 핸들링, 이미지 처리 등 많은 부분에서 유용하게 쓰이는 OpenCV가 Android로 포팅이 가능한 android-opencv가 code.google.com에 올라와서 간단히 정리해 본다.
이 내용은 http://code.google.com/p/android-opencv/ 내용을 기반으로 정리한 것이다.

위 code.google.com의 페이지에 보듯이 opencv를 android에 포팅하기 위해서는 미리 준비해야 하는 것들이 있다.
일단 window 환경에서 포팅하는 것으로 정리한다.

1. android-opencv 포팅을 위한 사전 준비
    - android-sdk : 기본으로 준비해야 함. 
        www.android.com에서 다운받아서 설치하면 된다.
    - android-ndk : crystax ndk r4 이용
        code.google.com의 android-opencv는 Android의 기본 NDK로는 build가 되지 않는다.
        Down : http://www.crystax.net/android/ndk-r4.php
    - cygwin
        windows에서 가상 리눅스 환경을 만들어준다.
        Down : http://www.cygwin.com/
    - android-opencv source
        SVN을 이용하여 checkout 받는다. (http://android-opencv.googlecode.com/svn/trunk/)
        SVN에 접속하면 opencv, samples 모두 사용한다. 먼저 opencv를 빌드 한후에 samples를 빌드하여
        테스트한다.

2. cygwin 설치
    - 먼저 android-opencv를 빌드하기 위해 리눅스 환경을 만들기 위해 다운로드 후 설치한다.
    - 설치하는 절차는 간략히 설명한다. 부족하면 검색하면 좋은 자료가 많다.
    - [Choose A Download Site] 화면이 나올때 까지는 기본 설정 또는 경로만 변경하고 지나가면 된다.
    - [Choose A Download Site]도 적당한 사이트를 선택하고 Next (난 ftp://ftp.kaist.ac.kr을 선택했음.)
    - 다음 화면이 중요하다. 리눅스 환경에서 android-opencv를 빌드 시 필요한 패키지를 선택하여
      설치하는 부분이다.
       너무 걱정하지 말자. 모두 설치 후 필요한 패키지는 다시 설치파일을 실행하여 똑같이 진행해서 이 화면에서
       다시 선택하여 설치가 가능하다.
       설치 할 항목
            Devel : gcc-core, gcc-g++, make, swig
            Editor : vim    
    - 그 다음부터는 그냥 두면 설치가 된다.
    - 설치 완료 후 실행하게 되면 리눅스 환경의 콜솔 창이 하나 뜨고 최초 실행 시 window 로그인 계정으로
       /home/[user] 형식으로 폴더가 생성이된다. 기본 사용 쉘은 bash shell 이다.

3. crystax ndk r4 
    - 해당 사이트에서 다운로드 받아 적당한 곳에 압축을 풀면된다.
    - 압축을 푼 후 cygwin이 설치 된 /home/[user]/ 아래 복사를 한다. cygwin 환경에서 빌드를 진행하기 위함.
    - 저의 빌드 환경에서의 패스는 /home/ukzzang/android-ndk-r4-crystax 임.

4. android-opencv source
    - svn을 이용하여 checkout 받은 뒤 체크 받은 소스를 cygwin이 설치 된 /home/[user]/ 아래에
       android-opencv로 복사한다. 경로를 변경해도 무방하다.

이로써 android-opencv를 빌드하기 위한 사전 준비 작업은 끝났다.

5. android-opencv build
    5.1. cygwin 환경 설정
        - windows 환경에서 패스 설정
            [바탕화면 컴퓨터] -> [설정] -> [고급 시스템 설정] -> [환경변수]의 path 부분에
            C:\cygwin\home\ukzzang\android-ndk-r4-crystax;C:\cygwin\bin; 추가한다.
        - cygwin 실행 후 bash 환경 파일 수정 (.bashrc 파일 수정 후 적용)
            vi ~/.bashrc 실행 (사용자 home 경로에서 실행)
        - 아래 내용을 추가한다.
            export PATH=$PATH:/home/ukzzang/android-ndk-r4-crystax
            export ANDROID_NDK_ROOT=/home/ukzzang/android-ndk-r4-crystax
            source ~/.bashrc 환경 설정 정보 재적용
    5.2. android-opencv build
        - cd /home/ukzzang/android-opencv/opencv 로 이동
        - sh build.sh
        - 뭐 빌드는 아주 간단하죠 ... build 하는데 시간이 꽤 걸리는 편이다. 천천히 기다리자
        - 빌드가 완료되면 ....../opencv/android/libs/armeabi 아래에 libopencv.so 파일이 생성된다.

여기까지로 android-opencv 빌드가 끝났다 ... 그럼 다음올 svn에서 받은 samples의 CVCamera를 빌드하여
실행해서 테스트 해보겠다.

6. android-opencv test
    6.1. CVCamera Sample Build
        - 테스트는 samples 안에 있는 CVCamera Project를 이용하여 진행하겠다.
        - 먼저 CVCamera Project를 NDK로 빌드한다. android-opencv 빌드와 동일하다.
        - ......./samples/CVCamera로 경로 이동
        - sh build.sh 실행하면 빌드 된다.
           혹시 경로부분에서 오류가 발생하면 jni 폴더의 Android.mk 파일을 vi로 열어서 수정하고 다시 빌드.
        - 위 화면처럼 빌드가 완료되면 libs/armeabi 아래에 libcvcamera.so 파일이 생성되어 있다.
        - 프로젝트 빌드 끝 ... 이제 Eclipse에서 프로젝트를 생성하고 실행만 해보면 된다.
    6.2. Eclipse Project Create & Test
        - Eclipse에 Android Project를 생성하고 cygwin에서 빌드한 CVCamera를 Import 한다.
        - 빌드 한 android-opencv 밑에 가면 android로 빌드하면서 생성 된 폴더가 있는데 안의 jni 밑의 Java 
           파일들도 Import 한다. 그리고 당연히 libandroid-opencv.so 파일도 프로젝트의 libcvcamera.so가 있는
           위치에 복사한다.
        - 프로젝트를 폰이나 에뮬에서 테스트하면 된다.
        - 카메라 뷰가 보이며, 뷰에 보이는 영상이 메뉴에서 선택한 알고리즘에 따라 특징 점들이 추출되어 보이게 된다.

이걸로 정말 끝 ...
       
저작자 표시 비영리 동일 조건 변경 허락
신고

Smart Phone (Mobile)/Android 2010.07.30 23:01

어플리케이션에서 모션 이벤트 중의 하나로 제스쳐라는 것이 있다.
일반적인 터치 이벤트는 DOWN - MOVE - UP의 단계를 거치면서 사용자가 어떤 동작을 입력하는지 감지 할 수 있다.
그럼 이 일련의 사용자 모션들을 조합하여 사용자가 입력하였다면 그 조합이 어떠한 동작인지 알 수도 있다.
이때 사용자의 조합된 모션(제스쳐)를 쉽게 판별하기 위해서 Android에서 제공하는 것이 GestureDetector 클래스 입니다.

GestureDetector는 두 가지 Listener를 가지고 있습니다.
    - interface GestureDetector.OnDoubleTapListener
    - interface GestureDetector.OnGestureListener
자세한 설명은 Reference를 보시면 됩니다.
    - http://developer.android.com/reference/android/view/GestureDetector.html
OnDoubleTapListener는 이름 그대로 두번 터치 했을 때, OnGestureListener는 일반적인 제스쳐들, 한번 터치나 스크롤 관련 Listener입니다.
그리고 저 두 가지 interface를 모두 가진 녀석이 있습니다.
    - class GestureDetector.SimpleOnGestureListener
보통 SimpleOnGestureListener만 extends 하면 모든 제스쳐를 다 사용 할 수 있습니다.

사용법도 매우 간단합니다. GestureDetector를 만들기만 하면 됩니다.
    // GestureDetector를 만들 때 GestureListener를 등록 
    mGestureDetector = new GestureDetector(this, new SimpleGestureListener());
    // 감시할 MotionEvent를 onTouchEvent에 넣어 주면 GetstureListener가 호출이 된다.
    mGestureDetector.onTouchEvent(event);

각 제스쳐의 이벤트는 아래와 같이 정의되어 있습니다.
    - public boolean onDoubleTap(MotionEvent e)
        두 번 터치입니다. onDoubleTap은 두 번 터치하면 이벤트가 더 이상 발생 되지 않는다.
    - public boolean onDoubleTapEvent(MotionEvent e)
        DOWN, MOVE, UP 이벤트를 모두 포함 합니다. 
    - public boolean onDown(MotionEvent e)
        터치하려고 손을 대기만 해도 발생되는 이벤트, 모든 제스쳐의 시작
    - public boolean onFling(MotionEvent e1, MotionEvent e2, float vX, float vY)
        onScroll에서 끝을 살짝 튕기는 동작에서 발생하는 이벤트
    - public void onLongPress(MotionEvent e)
        스크롤 시에 발생하는 이벤트
    - public boolean onScroll(MotionEvent e1, MotionEvent e2, float dX, float dY)
        길게 눌렀을 때 발생 하는 이벤트
    - public void onShowPress(MotionEvent e)
        onLongPress보다는 좀 더 짧은 시간동안 누르고 있으면 발생 하는 이벤트
    - public boolean onSingleTapConfirmed(MotionEvent e)
        한 번 터치 했을 때 발생하는 이벤트
    - public boolean onSingleTapUp(MotionEvent e) 
        한 번 터치 하고 다음에 다시 터치 이벤트가 들어오지 않았을 때, 한 번 터치가 확실 하다고 확인 시켜주는 이벤트

1. 아주 살짝 터치
    onDown : ACTION_DOWN
    onSingleTapUp : ACTION_UP
    onSingleTapConfirmed : ACTION_DOWN
일단 손을 대면 무조건 onDown 이벤트 발생입니다.
살짝 터치를 하게 되면 보통 30~60ms 정도 후에 손이 떨어지게 됩니다.
손이 떨어 지면 onSingleTapUp 이벤트가 발생하며, onDown이벤트 발생 후 약 300ms 안에 다시 onDown 이벤트가 발생 하지 않는다면 onSingleTapConfirmed 이벤트가 발생하여 확실히 한 번 터치 되었다는 이벤트를 발생 시킵니다.

2. 살짝 터치
    onDown : ACTION_DOWN
    onShowPress : ACTION_DOWN
    onSingleTapUp : ACTION_UP
    onSingleTapConfirmed : ACTION_DOWN
역시나 onDown 이벤트 부터 시작입니다.
1번 보다는 살짝 길게, 약 90~100ms 정도 터치되면 onShowPress 이벤트가 발생합니다. 172ms 이후에 손을 떼었으며, 역시나 300ms 정도 지나면 onSingleTapConfirmed 이벤트가 발생 됩니다.

3. 약간 길게 터치
    onDown : ACTION_DOWN
    onShowPress : ACTION_DOWN
    onSingleTapUp : ACTION_UP
2번보다 좀 더 길지만, LongPress는 아닌 상황입니다.
역시 이 때도 약 100ms 정도에 onShowPress 이벤트가 발생하긴 하지만 300ms 이후에 손을 떼었기 때문에 onSingleTapConfirmed 이벤트가 먹히는 현상이 일어납니다.

4. 아주 길게 터치
    onDown : ACTION_DOWN
    onShowPress : ACTION_DOWN
    onLongPress : ACTION_DOWN
LongPress가 발생 하는 상황입니다.
100ms 정도에 onShowPress 이벤트가 발생 하며, 약 590~600ms 정도에 onLongPress 이벤트가 발생 합니다.
이때 onSingleTapUp 이벤트는 발생 하지 않습니다.
두 번 터치 하는 경우에는 이벤트가 두 가지이기 때문에, 두 가지 조합의 경우 모두 살펴 보겠습니다.

5. 두 번 터치 (onDoubleTap)
    onDown : ACTION_DOWN
    onSingleTapUp : ACTION_UP
    onDoubleTap : ACTION_DOWN
    onDown : ACTION_DOWN (지연 될 수 있음)
먼저 onSingleTapUp 이벤트가 발생 합니다.
그리고 onSingleTapConfirmed 가 발생 하기 전에 다시 onDown 이벤트가 들어오게 되면 onDoubleTap 이벤트가 발생 합니다.
참고로 두번째 들어오는 onDown 이벤트는 onDoubleTap 이벤트보다 늦게 들어 올 수 있습니다.
(항상 같이 들어 오는게 아니라 onDoubleTap이 먼저 발생 합니다.)

6. 두 번 터치 (onDoubleTapEvent)
    onDown : ACTION_DOWN
    onSingleTapUp : ACTION_UP
    onDoubleTapEvent : ACTION_DOWN
    onDown : ACTION_DOWN (지연 될 수 있음)
    onDoubleTapEvent : ACTION_UP
onDoubleTap 이벤트와의 차이는 DOWN, MOVE, UP 이벤트까지 모두 캐치된다는 점이며, 마지막에 onDoubleTapEvent에 UP 액션이 들어오는 것을 확인 할 수 있습니다.
(위의 경우, 190ms 이후에 두번째 터치에서 손이 떨어졌다는 것을 확인 할 수 있습니다.)

7. 두 번 터치 (onDoubleTap + onDoubleTapEvent)
    onDown : ACTION_DOWN
    onSingleTapUp : ACTION_UP
    onDoubleTap : ACTION_DOWN
    onDoubleTapEvent : ACTION_DOWN (지연 될 수 있음)
    onDown : ACTION_DOWN (지연 될 수 있음)
    onDoubleTapEvent : ACTION_UP
같이 사용 하게 되면 onDoubleTap, onDoubleTapEvent 이벤트 둘 다 발생하며, 항상 onDoubleTap 이벤트가 먼저 발생 하게 됩니다. (결과적으로 onDoubleTap - onDoubleTapEvent - onDown 순서로 발생 합니다.)

8. 두 번 터치, 두 번째 터치시 스크롤 (onDoubleTapEvent)
    onDown : ACTION_DOWN
    onSingleTapUp : ACTION_UP
    onDoubleTapEvent : ACTION_DOWN
    onDown : ACTION_DOWN (지연 될 수 있음)
    onDoubleTapEvent : ACTION_MOVE
    onShowPress : ACTION_DOWN
    ...
    onDoubleTapEvent : ACTION_MOVE
    ...
    onLongPress : ACTION_DOWN
    onDoubleTapEvent : ACTION_UP
평소에 절대 나올법한 제스쳐지만 onDoubleTapEvent의 특성을 살펴보기 위한 제스쳐 입니다.
두 번째 onDown 이벤트 이후에 MOVE 이벤트가 들어 오는 것을 확인 할 수 있으며, 한가지 특이한 점은 계속 스크롤 되지 않고 onLongPress 이벤트가 발생하면 끝난다는 점입니다.
손을 뗄 수 밖에 없는 상황이 오게 되죠.
위에서 보시다 시피, 조금 길게 눌러짐에 따라 onShowPressonLongPress가 도중에 발생 할 수도 있습니다.

9. 스크롤
    onDown : ACTION_DOWN
    onScroll : ACTION_DOWN, ACTION_MOVE   
스크롤 이벤트는 간단 합니다.
최소 30ms 이후 부터는 onScroll 이벤트가 발생 할 수 있으며, 플링시키지 않고 살며시 손을 떼면 끝까지 onScroll 이벤트만 연속으로 발생 합니다.

10. 플링
    onDown : ACTION_DOWN
    onScroll : ACTION_DOWN, ACTION_MOVE 
    ...
    onFling : ACTION_DOWN, ACTION_UP
마지막에 손가락을 슬며시 튕기는 플링 동작입니다. 스크롤 이벤트와 비슷하지만, 마지막에 UP 액션과 함께 onFling 이벤트가 동작합니다. 스크롤과 플링 제스쳐 모두 시간에 따라 onShowPress 이벤트가 발생 할 수 있습니다.

지금까지 Android에서 기본적으로 제공하는 GestureDetector에 대해서 간략하게 알아봤다. GestureDetector가 모든 사용자들의 제스쳐를 판별할 수는 없다. 어플리케이션의 성격과 기능에 따라 점더 섬세하고 세세한 GestureDetector가 필요할 수도 있다.

저작자 표시 비영리 변경 금지
신고

티스토리 툴바