본문 바로가기
Android/기타 지식

[Kakao Auth] Android Studio로 카카오 로그인 API 사용하기 - 3. 구현

by jaesungLeee 2020. 11. 8.

카카오 로그인 API를 구현하기 위해서는 총 5가지 파일이 필요하다.

  • activity_login.xml
  • GlobalApplication.kt
  • kakaoSDKAdapter.kt
  • SessionCallback.kt
  • LoginActivity.kt 

1. activity_login.xml에 카카오 로그인 버튼 적용하기.

activity_login.xml에서 <com.kakao.usermgmt.LoginButton 이라고만 쳐도 자동으로 완성되지만, 보통의 경우 커스텀 버튼으로 구현하기 때문에 <Button> 태그를 사용한다.

 

커스텀 카카오 로그인 버튼

 

2. GlobalApplication.kt

package com.example.smartice_closet.auth.kakao

import android.app.Application
import com.kakao.auth.KakaoSDK

class GlobalApplication : Application() {
    override fun onCreate() {
        super.onCreate()

        instance = this
        KakaoSDK.init(KakaoSDKAdapter())
    }

    override fun onTerminate() {
        super.onTerminate()
        instance = null
    }

    fun getGlobalApplicationContext() : GlobalApplication {
        checkNotNull(instance) {
            "This Application does not inherit com.kakao.GlobalApplication"
        }
        return instance!!
    }

    companion object {
        var instance : GlobalApplication? = null
    }
}

위의 코드를 작성하고 AndroidManifest.xml을 열어 <application> 태그 안에 다음과 같이 추가해 준다.

<application
        android:name=".auth.kakao.GlobalApplication"

 

3. KakaoSDKAdapter.kt 작성

package com.example.smartice_closet.auth.kakao

import com.kakao.auth.*

class KakaoSDKAdapter : KakaoAdapter() {
    override fun getSessionConfig() : ISessionConfig {
        return object : ISessionConfig {
            override fun getAuthTypes(): Array<AuthType> {
                return arrayOf(AuthType.KAKAO_LOGIN_ALL)
            }

            override fun isUsingWebviewTimer(): Boolean {
                return false
            }

            override fun getApprovalType() : ApprovalType? {
                return ApprovalType.INDIVIDUAL
            }

            override fun isSaveFormData(): Boolean {
                return true
            }

            override fun isSecureMode(): Boolean {
                return true
            }
        }
    }

    override fun getApplicationConfig() : IApplicationConfig {
        return IApplicationConfig {
            GlobalApplication.instance?.getGlobalApplicationContext()
        }
    }
}

AuthType은 기본적으로 5가지의 Type이 있다.

AuthType 설명
KAKAO_TALK 카카오톡 로그인 타입 제공
KAKAO_TALK_ONLY 카카오톡 로그인 타입 제공
KAKAO_ACCOUT 웹뷰를 통해 카카오 계정 연결 제공
KAKAO_STORY 카카오 스토리 로그인 타입 제공
KAKAO_LOGIN_ALL 모든 로그인방식 제공

 

https://developers.kakao.com/sdk/reference/android-legacy/release/com/kakao/auth/AuthType.html

 

Kakao Developers

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

developers.kakao.com

 

4. SessionCallback.kt

package com.example.smartice_closet.auth.kakao

import android.app.Activity
import android.content.Intent
import android.util.Log
import android.widget.Toast
import com.example.smartice_closet.auth.login
import com.example.smartice_closet.main
import com.kakao.auth.ISessionCallback
import com.kakao.network.ErrorResult
import com.kakao.usermgmt.UserManagement
import com.kakao.usermgmt.callback.MeV2ResponseCallback
import com.kakao.usermgmt.response.MeV2Response
import com.kakao.util.exception.KakaoException
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

class SessionCallback (val context: login): ISessionCallback {

    var userToken: String = ""

    private val USERNAME = "USERNAME"
    private val TOKEN = "USERTOKEN"
    private val USERGENDER = "USERGENDER"

    override fun onSessionOpenFailed(exception: KakaoException?) {
        Log.e("Log","Session Call Back :: onSessionOpenFailed: ${exception?.message}")
    }

    override fun onSessionOpened() {
        UserManagement.getInstance().me(object : MeV2ResponseCallback() {
            override fun onSuccess(result: MeV2Response?) {
                Log.i("Log", "ID : ${result!!.id}")
                Log.i("Log", "E-Mail : ${result.kakaoAccount.email}")
                Log.i("Log", "Gender : ${result.kakaoAccount.gender}")

                checkNotNull(result) {
                    "Session Response Null"
                }

                sendToServerKakao(result)
            }

            override fun onSessionClosed(errorResult: ErrorResult?) {
                Log.i("Log", "Session Call Back :: onSessionClosed ${errorResult?.errorMessage}")
            }

            override fun onFailure(errorResult: ErrorResult?) {
                Log.i("Log", "Session Call back :: on failed ${errorResult?.errorMessage}")
            }
        })
    }
}

다양한 User Info를 받아오는 방법은 다음 게시글에서 다룬다.

 

5. LoginActivity.kt

package com.example.smartice_closet.auth

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.example.smartice_closet.auth.kakao.SessionCallback
import com.example.smartice_closet.main
import com.kakao.auth.AuthType
import com.kakao.auth.Session

class login : AppCompatActivity() {

    private var callback : SessionCallback = SessionCallback(this)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        kakao_login_btn.setOnClickListener { kakaoLogin() }
    }

    private fun kakaoLogin() {
        Session.getCurrentSession().addCallback(callback)
        Session.getCurrentSession().open(AuthType.KAKAO_LOGIN_ALL, this)
    }

    override fun onDestroy() {
        super.onDestroy()
        Session.getCurrentSession().removeCallback(callback)
    }

    public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (Session.getCurrentSession().handleActivityResult(requestCode, resultCode, data)) {
            Log.i("Log", "session get current session")
            return
        }

        super.onActivityResult(requestCode, resultCode, data)
    }
}

 

여기까지 구현을 완료하면 카카오 로그인 API를 이용해 사용자의 정보를 받아오는 기능이 완료된다.

LoginActivity에서 다른 Activity로 Intent 시키면 실제 로그인 과정처럼 화면이 넘어가는 것을 확인할 수 있다.