본문 바로가기
프로그래밍/Kotlin

[Kotlin] 카카오 API를 이용해 공유하기

by Youngs_ 2021. 12. 22.

app의 build.gradle

dependencies {
...

    implementation "com.kakao.sdk:v2-user:2.8.4" // 카카오 로그인
    implementation "com.kakao.sdk:v2-talk:2.8.4" // 친구, 메시지(카카오톡)
    implementation "com.kakao.sdk:v2-story:2.8.4" // 카카오스토리
    implementation "com.kakao.sdk:v2-link:2.8.4" // 메시지(카카오링크)
    implementation "com.kakao.sdk:v2-navi:2.8.4" // 카카오내비
}

 

setting.gradle

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
        maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/'}
    }
}

 

MainActivity.kt

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.kakao.sdk.common.KakaoSdk
import android.app.Application
import android.content.Context
import android.content.res.Resources
import android.util.Log
import android.widget.Toast
import com.example.kakaoapitest.databinding.ActivityMainBinding
import com.kakao.sdk.link.LinkClient
import com.kakao.sdk.template.model.Content
import com.kakao.sdk.template.model.FeedTemplate
import com.kakao.sdk.template.model.Link
import com.kakao.sdk.user.model.User

class MainActivity : AppCompatActivity(), KakaoLogin.IKLoginResult {
    lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater,null,false)
        setContentView(binding.root)

        KakaoSdk.init(this, "네이티브 앱 키")
        kakaoLogin()

        binding.button.setOnClickListener()
        {
            kakaoLink(this)
        }




    }
    private fun kakaoLogin() {
        KakaoLogin.instance.listener = this
        KakaoLogin.instance.login(this)
    }

    fun kakaoLink(context : Context) {

        val defaultFeed = FeedTemplate(
            content = Content(
                title = "테스트",
                description = "테스트 내용",
                imageUrl = "http://k.kakaocdn.net/dn/Q2iNx/btqgeRgV54P/VLdBs9cvyn8BJXB3o7N8UK/kakaolink40_original.png",
                link = Link(
                    webUrl = "https://developers.kakao.com",
                    mobileWebUrl = "https://developers.kakao.com"
//                                androidExecParams = mapOf("1" to "안드로이드 폰 링크"),
//                        iosExecParams = mapOf("1" to "ios 폰 링크")
                )
            )
        )
        LinkClient.instance.defaultTemplate(context, defaultFeed) { linkResult, error ->
            if (error != null) {
                Log.e("TAG", "카카오링크 보내기 실패", error)
            }
            else if (linkResult != null) {
                context.startActivity(linkResult.intent)

                // 카카오링크 보내기에 성공했지만 아래 경고 메시지가 존재할 경우 일부 컨텐츠가 정상 동작하지 않을 수 있습니다.
                Log.w("TAG", "Warning Msg: ${linkResult.warningMsg}")
                Log.w("TAG", "Argument Msg: ${linkResult.argumentMsg}")
            }
        }
    }

    override fun onKakaoLoginResult(user: User?) {
        Toast.makeText(this, "로그인성공",Toast.LENGTH_SHORT).show()
    }

}

 

kakaoLogin.kt

import android.content.Context
import android.util.Log
import com.kakao.sdk.auth.model.OAuthToken
import com.kakao.sdk.user.UserApiClient
import com.kakao.sdk.user.model.User

class KakaoLogin
{
    interface IKLoginResult
    {
        fun onKakaoLoginResult(user: User?)
    }
    var user:User? = null
    var listener:IKLoginResult? = null

    // 로그인 callback 구성
    val callback: (OAuthToken?, Throwable?) -> Unit = { token, error ->

        if (error != null) {
            Log.e("TAG", "로그인 실패", error)
            if(listener != null)
                listener!!.onKakaoLoginResult(null)
        }
        else if (token != null)
        {
            Log.i("TAG", "로그인 성공 ${token.accessToken}")

            UserApiClient.instance.me { user, error ->

                if (error != null)
                {
                    Log.e("TAG", "사용자 정보 요청 실패", error)
                }
                else if (user != null)
                {
                    Log.i("TAG", "사용자 정보 요청 성공" +
                            "\n회원번호: ${user.id}" +
                            "\n이메일: ${user.kakaoAccount?.email}" +
                            "\n닉네임: ${user.kakaoAccount?.profile?.nickname}" +
                            "\n프로필사진: ${user.kakaoAccount?.profile?.thumbnailImageUrl}")

                    this.user = user

                    if(listener != null)
                        listener!!.onKakaoLoginResult(user)
                }
            }
        }
    }
    fun login(context: Context)
    {
        // 카카오톡이 설치되어 있으면 카카오톡으로 로그인, 아니면 카카오계정으로 로그인

        if (UserApiClient.instance.isKakaoTalkLoginAvailable(context))
            UserApiClient.instance.loginWithKakaoTalk(context, callback = callback)
        else
            UserApiClient.instance.loginWithKakaoAccount(context, callback = callback)
    }

    //로그아웃
    fun onLink() {
        UserApiClient.instance.unlink { error ->
            if (error != null) {
                Log.e("TAG", "연결 끊기 실패", error)
            }
            else {
                Log.i("TAG", "연결 끊기 성공. SDK에서 토큰 삭제 됨")

            }
        }
    }

    companion object {
        @JvmStatic
        val instance by lazy { KakaoLogin() }
    }
}

 

KOE004 에러가 나온다면 https://developers.kakao.com/console/app/682679/product/login/easySignUp 에서 카카오 로그인을 활성화해준다.

 


공식문서

https://developers.kakao.com/docs/latest/ko/kakaologin/android#before-you-begin

 

댓글