본문 바로가기
IT기술(코딩)

안드로이드 스튜디오 카카오톡 로그인 연동 API [JAVA ]

by 크리에이트매이커 2021. 7. 18.
반응형

안녕하세요 여러분~~~ 크리에이트 메이커입니다.~

 

요즘 개발자가 늘어나면서 자신의 아이템을 사업화를 진행하기 위해 꼭 필요한게 회원기능인데요~

요즘 로그인 알고리즘을 직접만들지 않고 다른 매체 API를 이용하는게 많잖아요~

 

이번글에는 안드로이드 스튜디오에서 가장 대표적인 카카오톡 로그인 연동 하는방법에 대해 알려드릴게요

 

왜 글을쓰냐면, 카카오톡 로그인 API 문서에는 코틀린에 대한 글밖에 없더라구요~ 그래서 제가 JAVA 버전으로 여기져기 찾아서 공부하고 정리해서 코드를 짜봤습니다.

 

기본적인 환경설정(권한, 카카오 API등록 등등) 과정을 완료 한 상태에서 딱 로그인 기능 코드 부분만 작성해 보도록 하겠습니다~~

 

먼저 코드 뿌려볼게요~!

package 패키지는 본인꺼 

import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.os.Bundle;
import android.os.Handler;
import android.se.omapi.Session;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.view.Window;

import androidx.annotation.Nullable;

import com.kakao.sdk.auth.model.OAuthToken;
import com.kakao.sdk.common.model.ApprovalType;
import com.kakao.sdk.user.UserApiClient;
import com.kakao.sdk.user.model.User;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.attribute.UserPrincipal;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import kotlin.Unit;
import kotlin.jvm.functions.Function1;
import kotlin.jvm.functions.Function2;

import static android.content.ContentValues.TAG;

public class kakaologin extends Activity {
    private View loginbtn, logoutbtn;
    private int logoutflag;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);//이건 팝업창 만들려고 넣은거에요
        setContentView(R.layout.activity_kakaologin); //본인 액티비티 값
        //앱 종료, 다시시작시 자동 로그아웃
        


        getHashKey();//카카오톡 API연동을 위한 해쉬키 출력용 이에요 이거 출력해서 카카오톡  API에 등록해야돼요
        loginbtn = findViewById(R.id.logintn);
        logoutbtn = findViewById(R.id.logoutbtn);
        updatekakaoLoginUi(); //로그인, 로그아웃 버튼 레이아웃 함수에요. 사람에 따라 달라요! 함수 내용보고 맞게 수정해서 쓰세요~


// 여기부터 리얼 로그인 함수에요. 카카오톡  API관련 import나 bundle 추가 다 하셨으면 자동 완성 됩니다.
            Function2<OAuthToken, Throwable, Unit> callback = new Function2<OAuthToken, Throwable, Unit>() {
            @Override
            public Unit invoke(OAuthToken oAuthToken, Throwable throwable) {
                if(oAuthToken != null){
                    Log.d("로그인성공", "로그인 성공");
                    UserApiClient.getInstance().me(new Function2<User, Throwable, Unit>() {
                        @Override
                        public Unit invoke(User user, Throwable throwable) {
                            if (user != null) { //여기 부분이 로그인 성공시 원하는 동작 작동하는 알고리즘 작성하시면 됩니다.
                                Log.d(TAG,"로그인정보 : "+user);
                }
                if(throwable != null){ // 여기부분은 로그인 실패 했을때 입니다.
                    Log.d("로그인에러",throwable.getLocalizedMessage());
                }
                return null;
            }
        };


// 이건 로그인, 로그아웃 버튼 눌렀을때 이벤트 발생 코드 입니다.
        loginbtn.setOnClickListener(new View.OnClickListener() { //로그인 버튼 눌렀을때
            @Override
            public void onClick(View v) { //if문이 무슨의미냐하면, 카카오톡이 깔려있냐 없냐 를 구분하고 
            //있으면 연동, 없으면 카카오톡 인터넷같이 해서 로그인하기 입니다.
  			//로그인이 되거나 오류가 있으면 저기 callback 함수에서 판단하여 위에 Function2 callback 함수가 작동합니다.	
                if(UserApiClient.getInstance().isKakaoTalkLoginAvailable(kakaologin.this)){
                    UserApiClient.getInstance().loginWithKakaoTalk(kakaologin.this,callback);
                }else{
                    UserApiClient.getInstance().loginWithKakaoAccount(kakaologin.this,callback);
                }
            }
        });

        logoutbtn.setOnClickListener(new View.OnClickListener() {//로그아웃 버튼 눌르면 로그아웃 되게 하는 코드 입니다.
            @Override
            public void onClick(View v) {
                UserApiClient.getInstance().logout(new Function1<Throwable, Unit>() {
                    @Override
                    public Unit invoke(Throwable throwable) { //여기다 로그아웃 될때 원하는 이벤트 작성하시면 됩니다.
                        
                        return null;
                    }
                });
            }
        });
    }
    
    //로그인, 로그아웃 버튼 레이아웃 함수인데, UserApiCient 로 로그인 여부를 파악합니다.
    private void updatekakaoLoginUi(){
        UserApiClient.getInstance().me(new Function2<User, Throwable, Unit>() {

            @Override
            public Unit invoke(User user, Throwable throwable) {
            
                if(user != null){ //로그인이 된 상태에서의 레이아웃입니다.
                    loginbtn.setVisibility(View.GONE);
                    logoutbtn.setVisibility(View.VISIBLE);
                }else { // 로그아웃된 상태의 레이아웃입니다.
                    loginbtn.setVisibility(View.VISIBLE);
                    logoutbtn.setVisibility(View.GONE);
                }

                return null;
            }
        });


    }


// 이런 oncrate밖에 위치한 함수로 그냥 카카오톡 API연동을 위한 해쉬값 출력을 위한 함수 입니다.
    private void getHashKey(){
        PackageInfo packageInfo = null;
        try {
            packageInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        if (packageInfo == null)
            Log.e("KeyHash", "KeyHash:null");

        for (Signature signature : packageInfo.signatures) {
            try {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                Log.d("KeyHash", Base64.encodeToString(md.digest(), Base64.DEFAULT));
            } catch (NoSuchAlgorithmException e) {
                Log.e("KeyHash", "Unable to get MessageDigest. signature=" + signature, e);
            }
        }
    }


}

간단합니다.

 

그냥 모든 환경 설정 다하고 , 클래스 새로 하나 만들고 이 코드에서 중요 로그인에 필요한 부분만 복붙하고, alt+enter누르면서 필요한 import 부분 다 임포트 하시고 저기 주석 처리된 부분 읽어보시고 기능 추가 하시면 됩니다~~

 

Function2 callback 함수부분이랑 로그인 버튼 클릭했을때, 로그아웃 버튼 클릭했을때 작동하는 userapiClient 함수 부분만 이해하면 쉽게 사용할 수 있습니다~

 

코틀린 버전은 카카오톡 문서에 잘 나와있어요~

 

질문은 댓글

반응형