인증되지 않은 애플리케이션을 실행해서 '안드로이드 마켓(최근 'play store'로 명칭 변경)'으로 이동하여 동일한 애플리케이션을 업데이트하려고 하면 위와 같은 팝업이 뜬다. 제거를 눌러서 폰에 설치되어 있는 애플리케이션을 제거하고, 설치하면 간단하게 처리가 된다.


위와 같은 상황이 뜬 것은, 안드로이드앱 업데이트 확인절차(안드로이드 마켓 말고 서비스를 제공하는 운영서버에 등록된 앱버전을 확인)를 걸쳐서 마켓으로 이동을 했을 때 나타나는 현상이다.

현재 구글마켓에서 등록된 앱버전을 확인할 수 있는 방법은 없어보인다.

안드로이드에서 위치정보를 가져오기 위해 사용하는 클래스가 LocationManager이다.

Location location = locationManager.getKnowLastLocation(LocationManager.GPS_PROVIDER);


의 형태로 정보를 가져오게 되는데, 앱을 개발하다가 이 API를 이용해서 위치정보를 가져오지 못하는 상황을 계속 접했다.

위치정보를 내놓지 못하는 폰이 '갤럭시S' 였기 때문에 '갤쓰레기!!'라며 속으로 욕하면서 인터넷 검색을 했지만 사람들은

나와 비슷한 반응을 보이며 안된다고 이야기 하고 있었다.


하지만 폰에 설치된 위치정보 서비스를 제공하는 앱들은 위치정보를 정상적으로 가져오고 있었다. 그럼 왜 그런거지?

혹시나 하는 마음에 무선WiFi를 끄고 3G로 접속한 후에 약간의 인터넷 서핑과 위치정보 앱을 가동시켰다. 이렇게 하면, '위치정보가 저장되지 않을까?'라는 기대를 하면서한 시도였다.

그렇게 한 후에 위의 코드를 다시 실행하니까!!

왠걸!

위치정보를 가져오는 것이다. 이런이런!!

다른 폰들도 확인을 해봤다. 처음에는 위치정보를 가져오지 못했었는데, 3G 로 접속해주고 위치정보 앱 실형시켜주니까

그 이후로는 정상적으로 동작한다.


이 위치정보를 가져오기 위해 무선WiFi에 연결한 상태에서 위치정보 앱을 실행시켰을 때는 그 정보를 가져오지 못했는데...

내가 기대한 바를 보란 듯이 외면해주는 안드로이드.



   정리 
 

1. 안드로이드는 오랫동안 꺼져있다가 켜지면 위치정보를 가지고 있지 않다.

2. WiFi만 연결해서는 네트워크를 이용한 위치정보를 가져오지 못한다.

3. GPS를 켜고 위치정보를 가져올떄까지 기다리는 리스너를 통해서 위치정보를 가져올 수는 있다.

4. 내가 구현한 방식 : GPS를 10초동안 동작시켜서 그동안 위치정보를 가져오면 그 정보를 등록하고, 그렇지 않을 경우에는 네트워크 위치정보를 가져와서 사용하도록 만들었다. 오랫동안 GPS 정보를 가져오는 것을 꺼려했다.

5. 문제의 원인 : 그런데 테스트에 사용된 스마트폰들은 개발 이후 꽤 오랜시간을 꺼져있는 상태로 방치되었던 탓에 이런 위치정보 등이 소거된 상태였을 것이다. 내가 만든 방식과 WiFi 에만 연결된 형태로 인해서 위치정보를 가져올 수가 없었다.

6. 조치방법 : 3G를 켜고 인터넷 서핑과 위치정보 서비스를 이용. 개인적인 생각으로는 '3G'만 켜서 잠시 내버려둬도 될 것이다.


프로젝트에서 하이브리드앱 형태로 해서 모바일웹페이지를 안드로이드의 웹뷰에서 보여주며 동작시키는 앱을 만들었다.

제조사마다 다양한 종류의 디바이스에서 테스트를 해봐야하는 안드로이드 개발은 앞으로도 고역이 될 것 같다.


얼마간 나를 괴롭히던 녀석이 있었다.

로그인을 할때 CookieManager를 이용해서 웹뷰의 쿠키 Sync를 맞춰두고 로그인상태를 유지하도록 만들었다.

이 싱크를 맞추는 작업이 지금까지도 곤혹스럽다. 


갤럭시S는 사용자가 많다. 그런데 가장 이상한 안드로이드폰이 갤럭시S다. 갤럭시S를 제외한 안드로이드폰들에서는

정상적으로 동작하는 앱이 꼭! 갤럭시S에서는 다르게 반응하는 것이다. 후아.

인터넷을 뒤져보다가 이 문제에 대한 해결책을 찾았다.


  
/**
 * Remove all session cookies, which are cookies without expiration date
 */
public void removeSessionCookie() {
    final Runnable clearCache = new Runnable() {
        public void run() {
            synchronized(CookieManager.this) {
                Collection> cookieList = mCookieMap.values();
                Iterator> listIter = cookieList.iterator();
                while (listIter.hasNext()) {
                    ArrayList list = listIter.next();
                    Iterator iter = list.iterator();
                    while (iter.hasNext()) {
                        Cookie cookie = iter.next();
                        if (cookie.expires == -1) {
                            iter.remove();
                        }
                    }
                }
                CookieSyncManager.getInstance().clearSessionCookies();
            }
        }
    };
    new Thread(clearCache).start();
}

위의 소스를 보면 마지막에 new Thread(clearCache).start()가 실행되는 것이 보인다. CookieManager.removeSessionCookie() 가 스레드로 실행되는 것을 확인할 수 있다.

갤럭시S가 다른폰들과 다른 반응을 보인 부분이 이 부분이다.


인터넷에 해결방법이 있을까?


하는 생각으로 인터넷을 뒤적거리다가 해결방법을 찾았다.

jinu's blog : Android webview cookie sync 문제 : http://jinu.info/blog/372

1년 전에 작성된 글인데, 글의 중간에 보면

try { Thread.sleep(500); } catch (Exception e) {}


위의 코드가 핵심이다. 500ms의 강제 대기시간을 주어서 cookieManager가 세션쿠키를 삭제할 수 있는 충분한 시간적인 여유를 부여한 후에 진행되도록 하는 것이다.


<< 위의 내용을 힌트삼아서 수정한 소스 >>

  
public void removeAllCookie() {
        Log.d(LOG_TAG, "webViewHelper removeAllCookie execute.");
        cookieManager.removeAllCookie();
        threadSleep();
        setDefaultCookies();
        CookieSyncManager.getInstance().sync();
    }

    public void removeSessionCookies() {
        Log.d(LOG_TAG, "webViewHelper removeSessionCookies execute.");
        cookieManager.removeSessionCookie();
        threadSleep();
        this.httpClient = null;
        setDefaultCookies();
        CookieSyncManager.getInstance().sync();
    }

    private void threadSleep() {
        try {
            Thread.sleep(500);
        } catch (Exception e) {
            Log.d(LOG_TAG, "thread Exception!");
        }
    }

처럼 처리했다.

안드로이드 프로젝트를 SVN에 등록하고, 소스버전관리를 하다가 작업폴더를 정돈하면서 옮기기 위해 SVN에 있는 Check out으로 내려받았다. 그런데 이클립스 이녀석!!이 내려받은 안드로이드 프로젝트를 제대로 인식하지 않는 것이다. 몇가지 방법을 동원해봤지만 마음에 들지 않는다.

그래서 인터넷 검색을 했다. 그리고 발견했다.


링크 : SVN으로 받은 후 android 프로젝트로 인식시키는 방법



방법 :


1. SVN으로 원하는 안드로이드 프로젝트를 체크아웃(Check Out)하여 소스를 내려받는다.

2. new Project 를 이용해서 새로운 안드로이드 프로젝트를 생성한다.

3. 파일 탐색기등을 이용해서 새로 생성한 안드로이드 프로젝트 폴더 루트에 있는 .classpath, .project 파일 두개를 'SVN으로 내려받은 안드로이드 프로젝트 루트'에 복사한다.

4. F5를 눌러서 프로젝트를 다시 읽는다.

5. 대체적으로 정상적으로 인식 될 것이다.


딱히 이클립스에서 해결할 수 있는 방법은 없는 것으로 보인다. 다음에는 maven을 이용해서 프로젝트 소스와 라이브러리를 관리해볼까한다. 미루지말고 이녀석부터 당장해볼까? ㅡ_-)?

작성자 : 김지헌

작성일 : 2009. 11. 29.

 

Windows 시스템에서 Android SDK 설치하는 과정을 설명하도록 하겠다.

  1. http://developer.android.com/sdk/index.html

    android_sdk_r3-windows.zip 다운로드하기

    android_sdk_01.png

     

  2. android_sdk_r3-windwos.zip 을 특정 위치에서 압축을 푼다.
    android_sdk_02.png

    폴더 내에 보이는 SDK Setup는 안드로이드 SDK와 AVM(안드로이드 가상머신)의 설정을 할 수 있도록 해주는 프로그램이다.

    예 : C:\Program Files 폴더 안에

    C:\Program Files\android-sdk-windows
    폴더로 압축을 해제했다.

     

  3. C:\Program Files\android-sdk-windows 경로를 컴퓨터에서 Path로 설정해주어야 한다.

    C:\Program Files\android-sdk-windows\tools 를 컴퓨터의 Path 마지막에 추가해주어야 한다.

    android_sdk_03.png

    내 컴퓨터 -> 속성 -> 고급 -> 환경변수 -> Path 항목에 C:\Program Files\android-sdk-windows\tools 을 추가한다.

     

  4. http://honeydeveloper.springnote.com/pages/4429375 를 참조하여 Eclipse 에 ADT plug-in을 설치한다.

    android_sdk_04.png

     

  5. Develop tools에 체크를 하고 플러그인을 다운로드 받은 후 이클립스를 다시 시작한다.
  6. 이클립스가 실행되면 다음과 같은 창이 뜰 것이다. 환경설정에서 안드로이드와 관련된 설정을 하라는 내용이다.

    android_sdk_05.png

  7. Preferences -> Android 에서 SDK의 경로를 설정해줘야 한다. 아까 설치했던 경로를 결정한 후 Apply > OK를 누른다.

    android_sdk_06.png

  8. 그후 Windwo > Android SDK and AVM Manger를 선택한다. Available Packages 를 선택한다.

    android_sdk_07.png

    아래에 있는 항목들을 모두 체크하거나, 필요에 따라서 개별적으로 선택을 한다.

  9. Accept All 을 선택하고 Install Accepted를 클릭하여 다운로드를 진행하도록 한다.

    android_sdk_08.png

    android_sdk_09.png

    다운로드가 진행되고 있다.

  10. 다운로드가 완료되면 , Virtual Devices 에서 [New...] 버튼을 클릭한 후에 사용하려고 하는 AVD를 설정해서 생성을 해주면 되겠다.

    android_sdk_11.png

  11. 그런 후에 이클립스에서 Android Project를 생성해주면 안드로이드 애플리케이션을 개발하기 위한 환경을 구축하는 과정은 끝이난다.

이 글은 스프링노트에서 작성되었습니다.

+ Recent posts