https://developers.kakao.com/docs/latest/ko/getting-started/sdk-android
allprojects {
repositories {
google()
jcenter()
maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/'}
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' }
}
}
dependencies {
implementation "com.kakao.sdk:v2-user:2.11.0" // 카카오 로그인
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sample">
<!-- 인터넷 사용 권한 설정-->
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
...
링크 를 클릭하여 안드로이드 프로젝트를 추가해준다
내 애플리케이션 > 플랫폼 > Android 플랫폼 등록
등록하기 위한 키 해시가 필요하다.
내 애플리케이션 > 카카오 로그인 > 활성화 설정 > ON
// Mac
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android | openssl sha1 -binary | openssl base64
// Windows
keytool -exportcert -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore -storepass android -keypass android | openssl sha1 -binary | openssl base64
// Mac
keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64
// Windows
keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | PATH_TO_OPENSSL_LIBRARY\bin\openssl base64
import com.kakao.sdk.common.util.Utility
import android.util.Log
var keyHash = Utility.getKeyHash(this)
Log.d("Hash", keyHash)
생성된 키 해시를 등록 완료하면 된다.
import android.app.Application
import com.kakao.sdk.common.KakaoSdk
class GlobalApplication : Application() {
override fun onCreate() {
super.onCreate()
// KaKao SDK 초기화
KakaoSdk.init(this, BuildConfig.NATIVE_APP_KEY)
}
}
<application
<!-- android:name 설정 -->
android:name=".GlobalApplication"
...
>
<activity
android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity"
android:exported="true">
<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>
// 카카오 로그인
btnKakao.setOnClickListener{
// 카카오계정으로 로그인 공통 callback 구성
// 카카오톡으로 로그인 할 수 없어 카카오계정으로 로그인할 경우 사용됨
val callback: (OAuthToken?, Throwable?) -> Unit = { token, error ->
if (error != null) {
Log.e("LOGIN", "카카오계정으로 로그인 실패", error)
} else if (token != null) {
Log.i("LOGIN", "카카오계정으로 로그인 성공 ${token.accessToken}")
}
}
// 카카오톡이 설치되어 있으면 카카오톡으로 로그인, 아니면 카카오계정으로 로그인
if (UserApiClient.instance.isKakaoTalkLoginAvailable(context)) {
UserApiClient.instance.loginWithKakaoTalk(context) { token, error ->
if (error != null) {
Log.e("LOGIN", "카카오톡으로 로그인 실패", error)
// 사용자가 카카오톡 설치 후 디바이스 권한 요청 화면에서 로그인을 취소한 경우,
// 의도적인 로그인 취소로 보고 카카오계정으로 로그인 시도 없이 로그인 취소로 처리 (예: 뒤로 가기)
if (error is ClientError && error.reason == ClientErrorCause.Cancelled) {
return@loginWithKakaoTalk
}
// 카카오톡에 연결된 카카오계정이 없는 경우, 카카오계정으로 로그인 시도
UserApiClient.instance.loginWithKakaoAccount(context, callback = callback)
} else if (token != null) {
Log.i("LOGIN", "카카오톡으로 로그인 성공 ${token.accessToken}")
val intent = Intent(mContext, MainActivity::class.java)
startActivity(intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
finish()
}
}
} else {
UserApiClient.instance.loginWithKakaoAccount(context, callback = callback)
}
}
fun kakaoLogout() {
// 로그아웃
UserApiClient.instance.logout { error ->
if (error != null) {
Log.e("Hello", "로그아웃 실패. SDK에서 토큰 삭제됨", error)
} else {
Log.i("Hello", "로그아웃 성공. SDK에서 토큰 삭제됨")
Utils.Toast(mContext, "로그아웃 성공. SDK에서 토큰 삭제됨")
}
}
}
fun kakaoUnlink() {
// 연결 끊기
UserApiClient.instance.unlink { error ->
if (error != null) {
Log.e("Hello", "연결 끊기 실패", error)
} else {
Log.i("Hello", "연결 끊기 성공. SDK에서 토큰 삭제 됨")
Utils.Toast(mContext, "연결 끊기 성공. SDK에서 토큰 삭제 됨")
}
}
finish()
}
안녕하세요 질문이 있습니다. 로그인 구현하는 부분에서 UserApiClient.instance.isKakaoTalkLoginAvailable(context) 중 context는 어떤것을 의미하는지 궁금합니다. 동일하게 소스를 작성했는데 context가 선언이되어있지 않아 오류가 생기네요..
답변 해주시면 감사하겠습니다.