kotlin으로 Android Kakao Login(카카오 로그인) api 활용하기✌🏻

이호현·2021년 12월 2일
2

📚 Kotlin 📚

목록 보기
1/2
post-thumbnail

코틀린으로 카카오 로그인 api를 처음 사용해봄으로써 첫글을 시작할겸 정리를 해놓으려한다.

💡 최소 사양

먼저 Android SDK를 사용하기 위한 최소 사양부터 알아보자
- 안드로이드스튜디오 3.6.1 이상
- API 19: Android 4.4(KitKat) 이상
- Java 8 이상

💡 Gradle 설정

프로젝트 생성 후 build.gradle(project) 파일에 Android SDK 레파지토리(Repository)를 설정한다.

maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' }

위 코딩 입력 후 상단에 'Sync Now' 눌러주는 센스는 기본👍🏻

다음으로 build.gradle(module)로 가서 카카오 로그인 모듈을 추가해준다.

implementation "com.kakao.sdk:v2-user:2.0.1"

이때도 'Sync Now' 눌러주는걸 잊지말도록 하자

다음으로는 카카오 api를 통해서 카카오 서버와 통신하기 위해 인터넷 사용 권한을 설정한다.
manifests -> AndroidMainfest.xml 로 이동

<uses-permission android="android.permission.INTERNET" />

💡 키 해시값 구하기

카카오 로그인 api를 사용하기 위해선 키 해시가 필요하다.
MainActivity로 이동해서 아래 코드를 입력해준다.

import com.kakao.sdk.common.util.Utility
import android.util.Log
  val keyHash = Utility.getKeyHash(this)//onCreate 안에 입력해주자
  Log.d("Hash", keyHash)

실행하고나면 logcat에 Hash로 검색을 통해 쉽게 해시키값을 찾을 수 있다.
*뒤 해시키 값은 가려놨습니다 해시 키 값은 저장해주세요😌

💡 Kakao Developers에 애플리케이션 추가하기

https://developers.kakao.com/console/app
위 링크로 들어간 후 카카오 로그인을하고 애플리케이션 추가하기를 클릭해
로그인 api를 사용할 애플리케이션을 추가해준다.

입력해야 할 사항들을 입력하고 성공적으로 생성하였으면 앱 설정 부분에 '플랫폼'에 들어가 Android 플랫폼 등록을 눌러줍니다.

이때 앞에서 구한 키 해시값 그리고 패키지 명이 필요합니다😊

패키지 명ex) com.example.mod_kotlin_project

💡 GlobalApplication 생성

Kakao SDK를 사용하기 위해선 Native App Key로 초기화를 해주어야 합니다.

GlobalApplication라는 이름으로 MainActivity와 같은 위치에 kotlin class파일을 생성합니다.

생성된 class에 아래 코드를 입력하여 줍니다.

import android.app.Application
import com.kakao.sdk.common.KakaoSdk
...
class GlobalApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        KakaoSdk.init(this, "네이티브 앱 키")
    }
}

여기서 "네이티브 앱 키"는 카카오 사이트로 돌아가셔서 앱 설정 부분에 요약 정보에서 알 수 있습니다.

💡 AndroidManifest.xml 설정

앞에서 말한 GlobalApplication을 생성했으면 GlobalApplication 클래스가 사용될 수 있도록 해줘야 합니다.
Mainfset으로 이동해준 뒤

android:name=".GlobalApplication"

위 코드를 application 태그 안에 작성하여 애플리케이션 프로세스가 시작될 때, 애플리케이션의 다른 컴포넌트보다 먼저 실행되게 해줍니다.

계속 해서 Mainfset에 로그인 창이 되는 액티비티를 추가합니다.

<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" />
                <data
                    android:host="oauth"
                    android:scheme="kakao네이티브 앱 키" />
            </intent-filter>
        </activity>

안드로이드:스키마에서 네이티브 앱 키는 앞에서 알아본 네이티브 키를 입력해줍니다.

앞에 kakao를 붙히는 이유는 카카오 로그인 창으로 이동이 안될 수 도 있기 때문입니다😀

💡 카카오 로그인 버튼 만들기

https://developers.kakao.com/tool/resource/login
링크로 이동하면 카카오 로그인 버튼 이미지를 받을 수 있습니다:)

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">
    <ImageButton
        android:id="@+id/kakao_login_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/kakao_login_medium_wide"
        android:background="@android:color/transparent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginBottom="40dp"
        />
</androidx.constraintlayout.widget.ConstraintLayout>

그 다음 MainActivity에 로그인 코드를 작성 해줍니다.

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.ImageButton
import android.widget.Toast
import com.kakao.sdk.auth.LoginClient
import com.kakao.sdk.auth.model.OAuthToken
import com.kakao.sdk.common.util.Utility
import com.kakao.sdk.common.model.AuthErrorCause.*
import com.kakao.sdk.user.UserApiClient
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // 로그인 정보 확인
        UserApiClient.instance.accessTokenInfo { tokenInfo, error ->
            if (error != null) {
                Toast.makeText(this, "토큰 정보 보기 실패", Toast.LENGTH_SHORT).show()
            }
            else if (tokenInfo != null) {
                Toast.makeText(this, "토큰 정보 보기 성공", Toast.LENGTH_SHORT).show()
                val intent = Intent(this, SecondActivity::class.java)
                startActivity(intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
                finish()
            }
        }     
        val callback: (OAuthToken?, Throwable?) -> Unit = { token, error ->
            if (error != null) {
                when {
                    error.toString() == AccessDenied.toString() -> {
                        Toast.makeText(this, "접근이 거부 됨(동의 취소)", Toast.LENGTH_SHORT).show()
                    }
                    error.toString() == InvalidClient.toString() -> {
                        Toast.makeText(this, "유효하지 않은 앱", Toast.LENGTH_SHORT).show()
                    }
                    error.toString() == InvalidGrant.toString() -> {
                        Toast.makeText(this, "인증 수단이 유효하지 않아 인증할 수 없는 상태", Toast.LENGTH_SHORT).show()
                    }
                    error.toString() == InvalidRequest.toString() -> {
                        Toast.makeText(this, "요청 파라미터 오류", Toast.LENGTH_SHORT).show()
                    }
                    error.toString() == InvalidScope.toString() -> {
                        Toast.makeText(this, "유효하지 않은 scope ID", Toast.LENGTH_SHORT).show()
                    }
                    error.toString() == Misconfigured.toString() -> {
                        Toast.makeText(this, "설정이 올바르지 않음(android key hash)", Toast.LENGTH_SHORT).show()
                    }
                    error.toString() == ServerError.toString() -> {
                        Toast.makeText(this, "서버 내부 에러", Toast.LENGTH_SHORT).show()
                    }
                    error.toString() == Unauthorized.toString() -> {
                        Toast.makeText(this, "앱이 요청 권한이 없음", Toast.LENGTH_SHORT).show()
                    }
                    else -> { // Unknown
                        Toast.makeText(this, "기타 에러", Toast.LENGTH_SHORT).show()
                    }
                }
            }
            else if (token != null) {
                Toast.makeText(this, "로그인에 성공하였습니다.", Toast.LENGTH_SHORT).show()
                val intent = Intent(this, SecondActivity::class.java)
                startActivity(intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
                finish()
            }
        }
        val kakao_login_button = findViewById<ImageButton>(R.id.kakao_login_button) // 로그인 버튼
        kakao_login_button.setOnClickListener {
            if(LoginClient.instance.isKakaoTalkLoginAvailable(this)){
                LoginClient.instance.loginWithKakaoTalk(this, callback = callback)
            }else{
                LoginClient.instance.loginWithKakaoAccount(this, callback = callback)
            }
        }
    }
}

여기까지 잘 해왔으면 이제 로그인 후 다음 페이지인 액티비티를 하나 만들어줘야 합니다.

MainActivity와 같은 위치에 자신이 원하는 이름으로 kotlin class파일을 만들어 줍니다(여기서는 SecondActivity로 이름을 정하겠습니다.)

둘을 연결하려면 manifest에

 <activity android:name=".SecondActivity" />

위 코드를 application 태그 안에 추가해줘야 합니다👍🏻

다음 글에서는 로그아웃 버튼, 회원 탈퇴 버튼생성을 추가하는 글을 정리해보려합니다.

감사합니다:)
profile
# HoHo.log :)

0개의 댓글