반응형
안녕하세요 여러분~~~ 크리에이트 메이커입니다.~
요즘 개발자가 늘어나면서 자신의 아이템을 사업화를 진행하기 위해 꼭 필요한게 회원기능인데요~
요즘 로그인 알고리즘을 직접만들지 않고 다른 매체 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 함수 부분만 이해하면 쉽게 사용할 수 있습니다~
코틀린 버전은 카카오톡 문서에 잘 나와있어요~
질문은 댓글
반응형