카카오 로그인 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
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 시키면 실제 로그인 과정처럼 화면이 넘어가는 것을 확인할 수 있다.
'Android > 기타 지식' 카테고리의 다른 글
[SendBird] SendBird Chat SDK 개발 문서 정리 - 1. 시작 하기 (0) | 2021.07.03 |
---|---|
Android Developer Roadmap (0) | 2021.04.28 |
openSSL로 Key Hash 구하기 (0) | 2020.08.10 |
[Kakao Auth] Android Studio로 카카오 로그인 API 사용하기 - 2. 구현 준비 (0) | 2020.07.31 |
[Kakao Auth] Android Studio로 카카오 로그인 API 사용하기 - 1. 시작하기 (0) | 2020.07.27 |