개발

Android Java로 Kakao Login V2 이용해 보기

소소ing 2021. 3. 18. 19:00
반응형

Android Java로 구성한 프로젝트에 Kakao Login V2를 적용하려고 보니 Kotlin 연동만 제공을 하고 있었다. 

Java로 구성된 프로젝트에는 그럼 어떻게 적용을 하여야 하는가??

 

적용 방법을 아래와 같이 정리한다. 

1. Android Java Project에 Kotlin을 사용할 수 있도록 연동한다.

- 프로젝트 단위 build.gradle 파일안에 아래 붉은 내용을 추가한다. 

buildscript {
    repositories {
    // kotlin
    mavenCentral()
    // ... 아래 생략 ...  

    }

 

    dependencies {   
        // kotlin
        classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.21'

 

        // ... 아래 생략 ...
    }

}

 

allprojects {
    repositories {
        // kotlin
        mavenCentral()

 

        // ... 아래 생략 ...
     }
}

 

2. Project에 Kakao SDK를 연동한다. 

- 앱 단위 build.gradle 파일안에 아래 붉은 내용을 추가한다. 

dependencies {

    // 카카오로그인
    implementation "com.kakao.sdk:v2-user:2.4.1"

}

- AndroidManifest.xml 파일안 kakao Activity를 정의해 준다. 

   여기에서 kakao{NATIVE_APP_KEY} 이 부분에 Developer kakao 에서 발급 받은 키 값을 넣어준다. 

   Ex) key 값이 1234 라고 가정할때 kakao1234 가 된다. 대괄호({}) 는 제외하고 작성한다.

<activity android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <!-- Redirect URI: "kakao{NATIVE_APP_KEY}://oauth“ -->
        <data android:host="oauth"
        android:scheme="kakao{NATIVE_APP_KEY}" />
    </intent-filter>
</activity>

참고] 위 AndroidManifest.xml 파일에 정의하는 코드는 Kakao 앱 또는 앱 내장 브라우저 인증 방식으로 카카오 계정 로그인 후 다시 앱으로 돌아올때 사용되는 부분으로 해당 코드가 누락될 경우 로그인 후 앱으로 돌아지 않게 된다.

 

3. Application 파일에 Kakao SDK 초기화 하기

- 정의한 Application 파일 onCreate에 아래 코드 정의 

KakaoSdk.init(this, "<Kakao Native App Key>");

 

4. 자체적으로 구성한 카카오 로그인 버튼 클릭 시 

- 먼저 카카오톡 설치 여부 확인 후 카카오톡으로 인증할지 웹뷰 방식의 카카오계정으로 인증할지 선택한다. 

// 카카오톡 설치 여부 확인

if (UserApiClient.getInstance().isKakaoTalkLoginAvailable(this)) {

    // 카카오톡이 설치되어 있으면 카톡으로 로그인 확인 요청
    UserApiClient.getInstance().loginWithKakaoTalk(this, (token, loginError) -> {
        if (loginError != null) {
            // 로그인 실패
        } else {
            // 로그인 성공

            // 사용자 정보 요청
            requestMe();
        }
        return null;
    });
} else {

    // 카카오톡이 설치되어 있지 않은 경우 앱 내장 웹뷰 방식으로 카카오계정 확인 요청
    UserApiClient.getInstance().loginWithKakaoAccount(this, (token, loginError) -> {
        if (loginError != null) {
            // 로그인 실패
        } else {
             // 로그인 성공

            // 사용자 정보 요청
            requestMe();
        }
        return null;
    });
}

- 사용자 정보 요청 및 확인 함수 

// 사용자 정보 요청
private void requestMe() {
    // 사용자 정보 요청
    UserApiClient.getInstance().me((user, meError) -> {
        if (meError != null) {
            DLG.e("사용자 정보 요청 실패 " + meError);
        } else {
            // 사용자 아이디: user.getId());

            Account kakaoAccount = user.getKakaoAccount();
            if (kakaoAccount != null) {
                // 프로필
                Profile profile = kakaoAccount.getProfile();
                if (profile != null) {
                    // nickname: profile.getNickname()
                    // profile image: profile.getProfileImageUrl()
                    // thumbnail image: profile.getThumbnailImageUrl()

                    // 이메일
                    String email = kakaoAccount.getEmail();
                    if (email != null) {
                        // 이메일 획득 가능

                    } else if (kakaoAccount.getEmailNeedsAgreement()) {
                        // 동의 요청 후 이메일 획득 가능
                        // 단, 선택 동의로 설정되어 있다면 서비스 이용 시나리오 상에서 반드시 필요한 경우에만 요청해야 합니다.
                        // 필요한 동의항목의 scope ID (개발자사이트 해당 동의항목 설정에서 확인 가능)
                        List<String> scopes = Arrays.asList("account_email");

                        // 사용자 동의 요청
                        UserApiClient.getInstance().loginWithNewScopes(this, scopes, (ttt, error) -> {
                            if (error != null) {
                                requestMe();
                            } else {

                            }
                            return null;
                        });

                    } else {
                        // 이메일 획득 불가
                        
                } else {
                    // 이메일 획득 불가
                }
            }
        }
        return null;
    });
}

 

 

 

5. 로그아웃 처리

UserApiClient.getInstance().logout(error -> {
    return null;
});

 

 

6. 연결 끊기 - 연결 끊기는 초기 로그인 시 받았던 권한 요청 및 관련 데이터를 초기화 하여 연결 끊기 후 다시 로그인 시 권한 요청을 다시 하게 된다.

UserApiClient.getInstance().unlink(error -> {
    return null;
});

 

 

위 코드를 참고하여 로그인 처리가 가능하다 다만 카카오톡에서는 토큰정보를 활용하여 로그인 상태처리를 진행하도록 추가 함수들을 제공하고 있으니 아래 문서를 확인해 보는것도 좋겠다. 

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

반응형