소곤소곤 ad

2015년 2월 24일 화요일

카카오(Kakao) SDK 설치시에 발생하는 오류들 (Eclipse/Android)

카카오(Kakao, 카카오톡, 카톡, Kakaotalk) SDK 설치시에 발생하는 오류들 (Eclipse/Android)


카카오는 여러가지 API들을 공개하고 있는데, https://developers.kakao.com/ 를 방문하면 자세한 정보를 얻을 수 있다. 그런데 여기서 제공하는 SDK를 그냥 설치하면 에러가 쏟아진다. 여기저기를 검색해봐도 이 오류들에 대한 설명도 해결방법도 찾기가 힘들었다.






여러군데서 오류가 발생한다. 오류가 발생한 부분의 소스코드를 살펴봐도 왜인지 잘 모르겠다. 

자, 심호흡을 한번 하고, 이 오류들을 싸그리 없애보자!


1. google_play_service_lib 라이브러리 위치



첫번째 할 일은, google_play_service_lib 의 위치를 제대로 지정해 주는 것이다. 빨갛게 X표시된 것은 카카오 SDK를 만드신분의 개발환경으로 이 라이브러리의 경로가 지정되어 있기 때문에 문제가 생겼음을 알 수 있다. 이것들을 제거하고, 내 개발환경의 google_play_service_lib 프로젝트를 지정해주면 해결. (이 라이브러리를 설치하는 방법에 대한 것은 이 글의 범위를 벗어난다)




2. Eclipse의 TextEncoding 문제

여전히 소스코드 여러곳에서 에러가 발생하는데, 이번 문제는 애매한 코드영역에서 발생한다. 이 문제의 주요한 원인은, 카카오 SDK를 만드신분이 UTF-8코드의 한글로 주석을 달아서이다.  필요충분조건인 또하나의 원인은, 내 개발환경이 UTF-8이 아니기 때문이다. 




UTF-8로 작성된 주석들이 윈도우개발환경에서 코드페이지가 맞지 않는 경우에는 코드들과 섞여버린다. 즉, 주석 다음줄의 코드까지 주석처리되어 버려서 오류들이 발생하는 것.

문제 해결하는 방법은 둘 중 하나이다. 

1) 내 개발환경을 모두 UTF-8로 바꾼다. 


Window - Preference - General - Content Types - Text - Java Source File 을 찾아서 맨 아래 Default encoding 에 "UTF-8"로 적어주고 업데이트 하면 된다. 아니면 더 쉬운 방법이 있다! 그것은 바로... 


2) 카카오 SDK 소스코드내의 한글 주석을 영문으로 바꾸던가 지워버린다. 

(오류나는 부분)

(수정된 소스)

엔터 하나 때려넣고 수정 완료! -_-v


3. WebView와 Android 버전문제


SDK에 포함된 WebView의 일부 기능들은 안드로이드 API 버전 "11" 부터 지원하는데, Kakao SDK의 AndroidManifest.xml에는 

minSdkVersion="10" 

으로 되어 있다. 11로 바꿔준다. 이게 문제가 된다면 빌드가 끝나고 나중에 나중에 슬그머니 10으로 바꿔 놓으면 된다. 카카오 개발자도 이렇게 하지 않았을까 싶다 ㅎㅎ


4. PowerManger.isInteractive() 함수


이 오류가 생긴 이유는 카카오 SDK개발자님이 최신기능을 사용할수 있다고 뽐내려고 했기 때문으로 추정된다. 이 함수는 Android SDK 버전 "20" (롤리팝)부터 지원하는 신기능이다. 킷캣 이전버전에서는 지원하지 않아 오류가 생긴다. sdk의 Build Target을 20이상으로 해줘야 한다. 그런데 그래봤자 구버전에서는 isScreenOn()을 사용하도록 코딩되어 있으므로, 아예 이 부분을 삭제해 버리는것이 낫겠다는 판단. 

(롤리팝의 이 기능을 사용하기 위해 앱빌드 타겟을 20으로 강제하는것보다는, 타겟을 19이하로 하게 내버려두고 동작은 그냥 운영체제에 맡기는게 낫지 않았을까?)

 private boolean isApplicationActive(Context context) {
        try {
            final PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            return powerManager.isScreenOn();

            /*
            if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
                return powerManager.isScreenOn();
            } else {
                return powerManager.isInteractive();
            }
            */
        } catch (Exception e) {
            // nothing to do;
        }

        return true;
    }

이렇게 수정하여 드디어, 오류없이 컴파일 성공!! 야호~


댓글 없음:

댓글 쓰기