ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kotlin_ Kakao 로그인 연결하기 2
    Project1 2020. 5. 14. 13:59

    * Android SDK v1 을 사용했습니다 *

     

    오늘 만들 파일 목록

     

     

     

     

    1. res > layout > activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <Button
            android:id="@+id/btn_kakao_login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="36dp"
            android:text="카카오 로그인"
            app:layout_constraintBottom_toTopOf="@+id/btn_kakao_logout"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />
    
        <Button
            android:id="@+id/btn_kakao_logout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="36dp"
            android:text="카카오 로그아웃"
            app:layout_constraintBottom_toTopOf="@+id/btn_kakao_link_out"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />
    
        <Button
            android:id="@+id/btn_kakao_link_out"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="250dp"
            android:text="앱 연결 해제"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>

     

     

     

     

    2. GlobalApplication.kt 파일 생성 후 작성

    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
        }
    }

     

     

     

     

    3. KakaoSDKAdapter.kt 파일 생성 후 작성

    import com.kakao.auth.*
    
    open 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()
            }
        }
    }

     

     

     

     

    4. SessionCallback.kt 파일 생성 후 작성

    import android.util.Log
    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
    
    class SessionCallback : ISessionCallback {
    
        override fun onSessionOpenFailed(exception: KakaoException?) {
            Log.e("Log", "Session Call back :: onSessionOpenFailed: ${exception?.message}")
        }
    
        override fun onSessionOpened() {
            UserManagement.getInstance().me(object : MeV2ResponseCallback() {
    
                override fun onFailure(errorResult: ErrorResult?) {
                    Log.i("Log", "Session Call back :: on failed ${errorResult?.errorMessage}")
                }
    
                override fun onSessionClosed(errorResult: ErrorResult?) {
                    Log.i("Log", "Session Call back :: onSessionClosed ${errorResult?.errorMessage}")
    
                }
    
                override fun onSuccess(result: MeV2Response?) {
                    Log.i("Log", "아이디 : ${result!!.id}")
                    Log.i("Log", "이메일 : ${result.kakaoAccount.email}")
                    Log.i("Log", "프로필 이미지 : ${result.profileImagePath}")
    
                    checkNotNull(result) { "session response null" }
                }
    
            })
        }
    }

     

     

     

    5. MainActivity.kt

    import android.annotation.SuppressLint
    import android.content.Intent
    import android.os.Bundle
    import android.util.Log
    import androidx.appcompat.app.AlertDialog
    import androidx.appcompat.app.AppCompatActivity
    import com.kakao.auth.*
    import com.kakao.auth.StringSet.id
    import com.kakao.kakaostory.StringSet.id
    import com.kakao.kakaotalk.StringSet.id
    import com.kakao.network.ErrorResult
    import com.kakao.usermgmt.UserManagement
    import com.kakao.usermgmt.callback.LogoutResponseCallback
    import com.kakao.usermgmt.callback.UnLinkResponseCallback
    import com.kakao.usermgmt.response.MeV2Response
    import kotlinx.android.synthetic.main.activity_main.*
    
    
    class MainActivity : AppCompatActivity() {
    
        private var callback: SessionCallback = SessionCallback()
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            // Kakao LogIn
            btn_kakao_login.setOnClickListener {
                Session.getCurrentSession().addCallback(callback);
                Session.getCurrentSession().open(AuthType.KAKAO_TALK,this)
            }
    
            // Kakao LogOut
            btn_kakao_logout.setOnClickListener {
                val builder = AlertDialog.Builder(this)
                builder.setMessage("로그아웃 하시겠습니까?")
                builder.setPositiveButton("확인") {
                        dialogInterface, i -> UserManagement.getInstance().requestLogout(object : LogoutResponseCallback() {
                        override fun onCompleteLogout() { }
                    })
                    dialogInterface.dismiss()
                }
                builder.setNegativeButton("취소") {
                        dialogInterface, i -> dialogInterface.dismiss()
                }
                val dialog: AlertDialog = builder.create()
                dialog.show()
    
                Log.i("Log", "로그아웃 아이디 : ${MeV2Response.KEY_NICKNAME}")
                Log.i("Log", "로그아웃 프로필 이미지 : ${MeV2Response.KEY_PROFILE_IMAGE}")
    
            }
    
            // Kakao App Link Out
            btn_kakao_link_out.setOnClickListener {
                val builder = AlertDialog.Builder(this)
                builder.setMessage("앱 연결을 해제하시겠습니까?")
                builder.setPositiveButton("확인"){ dialogInterface, i ->
                    UserManagement.getInstance().requestUnlink(object : UnLinkResponseCallback() {
                        override fun onFailure(errorResult: ErrorResult?) {
                            Log.i("Log",errorResult!!.toString())
                        }
                        override fun onSessionClosed(errorResult: ErrorResult) {
                        }
                        override fun onNotSignedUp() {
                        }
                        override fun onSuccess(userId: Long?) {
                            Log.i("Log",userId.toString())
                        }
                    })
                    dialogInterface.dismiss()
                }
                builder.setNegativeButton("취소") { dialogInterface, i ->
                    dialogInterface.dismiss()
                }
                val dialog: AlertDialog = builder.create()
                dialog.show()
            }
        }
    
        @SuppressLint("MissingSuperCall")
        override fun onDestroy() {
            Session.getCurrentSession().removeCallback(callback);
        }
    
        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)
        }
    }

     

     

     

    6. 결과물

     

     

     

     

     

     

    댓글

Designed by Tistory.