새소식

Android Studio[JAVA]

[Android/Java] 안드로이드 스튜디오(JAVA) - 카카오톡으로 로그인 기능 구현하기 [2022]

  • -

안녕하세요. 오늘은 Android Java에서 '카카오톡으로 로그인 구현하기'를 해보도록 하겠습니다.
Java 로 작성한 글은 구글에도 많이 없고, 옛날 버전으로 올라와 있어서 그런지 글 찾기가 쉽지 않더라구요.
그래서 이번에 제가 직접 경험하면서 느낀 것들, 오류 발생 상황 등을 같이 적어보려고 합니다.

글쓰기에 앞서, 유튜브(홍드로이드 : #46 카카오 로그인) 을 참고하였습니다. 
글보다 자세한 설명과 이해를 원하시면, 해당 유튜브를 검색하셔서 참고하세요!!


1. '카카오 개발자센터' 에서 앱 등록하기

https://developers.kakao.com/

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

해당 페이지에 접속하셔서 본인의 카카오 계정으로 접속합니다.

 

카카오개발자센터 로그인

우측 상단의 '내 어플리케이션' 클릭 후, 애플리케이션 추가하기를 눌러줍시다.

애플리케이션 추가하기

그림과 같은 화면을 보실 수 있습니다.

앱 아이콘은 https://pixabay.com/ko/ 에서 예시를 위해 무료 이미지 아이콘을 간단하게 가져왔습니다.

앱 이름과 사업자 명을 입력하신 후, 저장을 눌러줍니다.

 

내 애플리케이션 - 앱 키 및 플랫폼 확인

이후 sonhskao APP을 들어가보시면, 다음과 같은 화면을 보실 수 있습니다. 저희가 주목해서 보아야 할 것은 '네이티브 앱 키' '플랫폼 설정하기' 입니다!

 

이제 Android Studio에서 Empty Project를 하나 생성해주고, 코드를 작성해보겠습니다.

(※ 필독 : 최신 버전의 Android Studio에서는 많은 오류가 떠서, 저는 좀 더 구버전의 Android Studio (Android 스튜디오 Arctic Fox(2020.3.1)) 로 구현하였습니다. build gradle(app) / build.gradle(project) / settings.gradle ... 등 설정 부분에서 시작 화면 자체가 다르더라구요. 구 버전을 설치하는 방법은 추후에 다시 글을 쓰도록 하겠습니다.)

 

먼저, build.gradle(app) 에서 dependencies 밑에 다음 문구를 추가합니다. 추가한 후, 우측 상단에 Sync now를 꼭 눌러주어야만 동기화가 진행됩니다!!

implementation group: 'com.kakao.sdk', name: 'usermgmt', version: '1.30.7'

 

다음, manifest.xml 로 이동하여 </activity> 와 </application> 사이에 meta-data를 넣어줍니다. 

meta-data에 name은 그대로 써주시고, value는 좀 전의 화면에 있었던 앱 키 - '네이티브 키' 값을 ctrl c+v 해줍니다.

</activity>
        <meta-data
            android:name="com.kakao.sdk.AppKey"
            android:value="d6a86c57a737b3bc824fb10fcfafce7d" />
    </application>

 

이후 다시 카카오개발자센터 홈페이지로 돌아와서, '플랫폼 설정하기' 를 하러 갑시다.

저희는 Android 앱을 만들고 있기 때문에, 'Android 플랫폼 등록' 을 눌러줍니다. 본인이 만들고 있는 Android Studio로 가시면, manifest.xml 이나 MainActivity 에서 본인의 package 명을 확인할 수 있습니다. 이를 화면에 그대로 입력해줍니다. 현재 제 패키지명은 com.sample.kakaologin 입니다. 예시 화면은 다음과 같습니다.

안드로이드 플랫폼 등록

 

2. 키 해시 값 등록하기

카카오톡 로그인을 하기 위해서는 키 해시 값을 구해야 하는데, 이 값은 MainActivity에서 찾을 수 있습니다. 카카오 로그인을 하기 위해서는 본인의 PC/노트북 해시 값을 화면에 입력해주어야 합니다. 저는 MainActivity에서 다음과 같은 코드를 입력하여 키 해시 값을 구했습니다. 이 코드는 onCreate() 함수 밑 부분에 써주시면 됩니다.

/*
* 카카오 로그인 시 필요한 해시키를 얻는 메소드
*/

private void getAppKeyHash()
    {
        try {
            PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md;
                md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                String something = new String(Base64.encode(md.digest(), 0));
                Log.e("Hash key", something);
            }
        } catch (Exception e) {
            Log.e("name not found", e.toString());
        }
    }

코드 작성이 끝나셨으면, 위의 getAppkeyHash() 함수를 onCreate() 함수 마지막에 붙여줍니다. (MainActivity) 

setContentView(R.layout.activity_main);
getAppKeyHash();

이제 실행을 하기에 앞서, 한 가지 추가 설정이 필요합니다.

settings.gradle 가셔서, repositories {} 안에 다음 문장을 삽입해주세요.

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

다음과 같은 창이 뜨는 걸 확인하실 수 있습니다. 현재 저희가 구하고자 하는 것은 키 해시 값입니다. 이 값은 Android Studio 좌측 하단 'Logcat' 선택, 'Verbose'를 'Error'로 바꿔주시면 다음과 같은 화면을 보실 수 있습니다.

제가 가린 곳의 key를 카카오 개발자 센터 키 해시 입력 칸에 ctrl c+v 로 써주시면 되겠습니다. 

한 번 해시 키를 입력했다면, MainActivity의 onCreate()의 getAppKeyHash()는 주석처리 해주세요. 아니면 Logcat의 Error 화면에 계속 빨간 글씨로 써서 보이니까요.

 

3. 카카오개발자센터에서 카카오 로그인 기타 설정하기

성공적으로 '플랫폼 등록하기'를 마쳤다면, 좌측 '제품 설정'에서 '카카오 로그인'을 들어가주세요.

활성화 설정 상태를 'OFF'에서 'ON'으로 바꿔줍니다. 이후 '동의 항목'을 눌러주세요.

카카오로 로그인을 했을 때 볼 수 있는 것들을 권한이 있는 것들 내에서 추가로 설정하여 구현할 수가 있습니다.
저는 이름(닉네임), 프로필 사진, 생일을 카카오로 로그인을 했을 때 볼 수 있도록 구현해보겠습니다.

다음과 같이 적어주었습니다.

닉네임 : 앱 내에서 프로필 생성을 하는데 정보 수집이 필요합니다.

프로필 사진 : 앱 내에서 테스트 서비스를 위해 반드시 필요합니다.

생일 : 테스트 서비스를 위해 반드시 필요합니다.

 

다시 안드로이드 스튜디오로 돌아옵니다.

MainActivity의 layout(xml)파일로 가줍니다.

 

코드 안에 다음을 입력해주세요.

<com.kakao.usermgmt.LoginButton
    android:id="@+id/btn_login"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintBottom_toBottomOf="parent"
    tools:ignore="MissingClass"></com.kakao.usermgmt.LoginButton>

<com.kakao.usermgmt.LoginButton 에 빨간줄이 생길 수도 있는데, 저는 빨간 줄을 없애기 위해 아래 코드를 추가했습니다.

app:layout_constraintBottom_toBottomOf="parent"

이 코드가 붙는 이유는 현재 layout 파일이 다음과 같은 형식으로 되어있기 때문입니다. LinearLayout 등 다른 구조를 쓰고 계시다면 저 한 줄만 그 구조에 맞게 코드를 바꿔서 써주시면 되겠습니다.

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"

 

4. 안드로이드 스튜디오에서 카카오로그인 구현 class 생성

다음으로는 로그인 기능을 구현하기 위해 Java class를 하나 추가해주어야 합니다.

그림처럼 class 하나를 만들어줍시다. 저는 CustomApplication이라고 이름을 짓겠습니다.

새로운 class 생성

class 하나가 만들어 지면 다음과 같이 Application을 extends 해줍니다.

public class CustomApplication extends Application

후에 다음과 같은 코드를 작성해줍니다. (CustomApplication.java)

public class CustomApplication extends Application {
    private static volatile CustomApplication instance = null;

    private static class KakaoSDKAdapter extends KakaoAdapter
    {
        // 카카오 로그인 세션을 불러올 때의 설정값을 설정하는 부분.
        public ISessionConfig getSessionConfig() {

            return new ISessionConfig() {
                @Override
                public AuthType[] getAuthTypes() {
                    return new AuthType[] {AuthType.KAKAO_LOGIN_ALL};
                    //로그인을 어떤 방식으로 할지 지정
                    //KAKAO_LOGIN_ALL: 모든 로그인방식을 사용하고 싶을때 지정.
                }

                @Override
                public boolean isUsingWebviewTimer() {
                    return false;
                    // SDK 로그인시 사용되는 WebView에서 pause와 resume시에 Timer를 설정하여 CPU소모를 절약한다.
                    // true 를 리턴할경우 webview로그인을 사용하는 화면서 모든 webview에 onPause와 onResume 시에 Timer를 설정해 주어야 한다.
                    // 지정하지 않을 시 false로 설정된다.
                }

                @Override
                public boolean isSecureMode() {
                    return false;
                    // 로그인시 access token과 refresh token을 저장할 때의 암호화 여부를 결정한다.
                }

                @Override
                public ApprovalType getApprovalType() {
                    return ApprovalType.INDIVIDUAL;
                    // 일반 사용자가 아닌 Kakao와 제휴된 앱에서만 사용되는 값으로, 값을 채워주지 않을경우 ApprovalType.INDIVIDUAL 값을 사용하게 된다.
                }

                @Override
                public boolean isSaveFormData() {
                    return true;
                    // Kakao SDK 에서 사용되는 WebView에서 email 입력폼의 데이터를 저장할지 여부를 결정한다.
                    // true일 경우, 다음번에 다시 로그인 시 email 폼을 누르면 이전에 입력했던 이메일이 나타난다.
                }
            };
        }

        @Override
        public IApplicationConfig getApplicationConfig() {
            return new IApplicationConfig() {
                @Override
                public Context getApplicationContext() {
                    return CustomApplication.getGlobalApplicationContext();
                }
            };
        }
    }

    public static CustomApplication getGlobalApplicationContext() {
        if(instance == null) {
            throw new IllegalStateException("this application does not inherit com.kakao.GlobalApplication");
        }
        return instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
        KakaoSDK.init(new KakaoSDKAdapter());
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
        instance = null;
    }

이는 카카오 로그인을 구현하기 위한 코드입니다. (유튜브 '홍드로이드'를 참고하였습니다.)

이후 manifest.xml 파일에 다음 글을 <application 안에 추가해줍니다.

android:name=".CustomApplication"

 

5. 카카오톡 로그인 성공 시 Activity 만들기

위 이미지의 '새 class 성공' 처럼, 로그인 성공 시 다음 화면을 위한 Activity를 한 개 더 만들어줍시다.

마찬가지로 Empty Activity를 선택하고, 저는 'success' 라는 이름의 Activity를 만들어주었습니다.

6. MainActivity 코드 작성

다음, MainActivity에서 코드를 작성해줍시다.

onCreate()함수 전, 다음 변수를 선언해줍니다.

private ISessionCallback mSessionCallback;

이후 mSessionCallback에 새로운 객체를 만들어주어야 하는데, 이때 (com.kakao.auth)를 import해주면서 가져와야 한다. import는 Alt+Enter를 누르거나 자동완성 기능을 사용하면 정상적으로 처리가 가능합니다.

 

MainActivity class의 코드는 다음과 같습니다. 위의 패키지명과 import 구문은 생략하였습니다.

public class MainActivity extends AppCompatActivity {
    private ISessionCallback mSessionCallback;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //카카오 로그인 기능 시작
        mSessionCallback = new ISessionCallback() {
            @Override
            public void onSessionOpened() {
                // 로그인 요청
                UserManagement.getInstance().me(new MeV2ResponseCallback() {
                    @Override
                    public void onFailure(ErrorResult errorResult) {
                        // 로그인 요청했는데 실패했을 때
                        Toast.makeText(MainActivity.this, "로그인 도중에 오류가 발생했습니다.", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onSessionClosed(ErrorResult errorResult) {
                        // 세션이 닫힘..
                        Toast.makeText(MainActivity.this, "세션이 닫혔습니다.. 다시 시도해주세요.", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onSuccess(MeV2Response result) {
                        // 로그인 성공
                        Intent intent = new Intent(MainActivity.this, success.class);
                        intent.putExtra("name", result.getKakaoAccount().getProfile().getNickname());
                        intent.putExtra("profileImg", result.getKakaoAccount().getProfile().getProfileImageUrl());
                        intent.putExtra("birth", result.getKakaoAccount().getBirthday());
                        startActivity(intent);

                        Toast.makeText(MainActivity.this, "로그인이 완료되었습니다.", Toast.LENGTH_SHORT).show();
                        finish();
                    }
                });
            }

            @Override
            public void onSessionOpenFailed(KakaoException exception) {
                Toast.makeText(MainActivity.this, "세션 열기에 실패하였습니다. 다시 시도해주세요.", Toast.LENGTH_SHORT).show();
            }
        };

        Session.getCurrentSession().addCallback(mSessionCallback);
        Session.getCurrentSession().checkAndImplicitOpen(); //세션 유지
        //getAppKeyHash();
    }
    private void getAppKeyHash()
    {
        try {
            PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md;
                md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                String something = new String(Base64.encode(md.digest(), 0));
                Log.e("Hash key", something);
            }
        } catch (Exception e) {
            Log.e("name not found", e.toString());
        }
    }
}

이 때, 제가 나오는 코드대로 구현하기 위해서는 아래와 같은 과정이 필요합니다.

 UserManagement.getInstance().me(new MeV2ResponseCallback()

{

여기서 ctrl + O 를 누른 후, onFailure를 가져옵니다. 이는 로그인 세션이 닫혔을 때 코드 작성을 위해 필요한 구문입니다.

 

intent.putExtra 는 intent로 화면이 넘겨질 때, 값을 전달하겠다는 뜻입니다.
위의 코드를 보시면 "name", "profileImg", "birth"로 값을 저장한 것을 확인할 수 있습니다.

 

7. success 액티비티 - 레이아웃 (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=".success">

    <ImageView
        android:id="@+id/iv_profile"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="200dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:srcCompat="@tools:sample/avatars" />

    <TextView
        android:id="@+id/tv_birth"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="TextView"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.501"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/iv_profile" />

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="TextView"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tv_birth" />
</androidx.constraintlayout.widget.ConstraintLayout>

 

8.success 액티비티 - 클래스 자바 코드 작성

public class success extends AppCompatActivity {
private String strName, strProfileImg, strBirth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_success);

        Intent intent = getIntent();
        strName = intent.getStringExtra("name");
        strProfileImg = intent.getStringExtra("profileImg");
        strBirth = intent.getStringExtra("birth");

        TextView tv_name = findViewById(R.id.tv_name);
        TextView tv_birth = findViewById(R.id.tv_birth);
        ImageView iv_profile = findViewById(R.id.iv_profile);

        //이름 set
        tv_name.setText(strName);
        //생일 set
        tv_birth.setText(strBirth);
        //프로필 이미지 사진 set
        Glide.with(this).load(strProfileImg).into(iv_profile);
    }

}

위의 Glide 기능을 이용하기 위해 build gradle(app) 부분에 아래 코드를 추가해주고 Sync now를 눌러줍니다.

// Glide 이미지 로드 라이브러리
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'

마지막으로, mainfest.xml에 인터넷 권한 허락 및 기타 네트워크 설정을 해줘야 합니다.

<application 위에 다음 코드를 입력해줍니다.

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

그 이후 <application 아래 다음 코드를 입력합니다.

android:usesCleartextTraffic="true"

드디어 테스트 해볼 시간입니다. 원활한 테스트가 진행되지 않는다면 앱을 삭제 후 다시 실행해 보세요.

다음과 같이 정상적으로 로그인이 되는 것을 확인할 수 있습니다.

 

9. 로그아웃하기

success 액티비티에 로그아웃 기능을 수행하기 위하여 다음과 같은 코드를 추가해줍니다.

//로그아웃하기
findViewById(R.id.btn_logout).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        UserManagement.getInstance().requestLogout(new LogoutResponseCallback() {
            @Override
            public void onCompleteLogout() {
                // 로그아웃 성공 시 수행하는 지점
                finish(); // 현재 액티비티 종료
            }
        });
    }
});

10. MainActivity에 onActivityResult(requestCode:int, resultCode:int ,,,) , onDestroy() 추가

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    if (Session.getCurrentSession().handleActivityResult(requestCode, resultCode, data))
        super.onActivityResult(requestCode, resultCode, data);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    Session.getCurrentSession().removeCallback(mSessionCallback);
}

ctrl + O 를 눌러 onAcitivyResult() 함수와 onDestroy() 함수를 추가해줍니다.

onActivityResult() 는 main액티비티에서 success 액티비티를 호출하여 넘어갔다가, 다시 main 액티비티로 돌아올때 사용되는 기본 메소드입니다.

onDestroy()는 앱이 죽었을 때(강제종료되었을 때), 객체의 해제를 원활하게 해주는 역할을 합니다.

 

다음은 MainActivity 및 success 액티비티의 xml 코드 및 자바코드 전문입니다.

< MainActivity - 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">

    <com.kakao.usermgmt.LoginButton
        android:id="@+id/btn_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        tools:ignore="MissingClass"></com.kakao.usermgmt.LoginButton>

</androidx.constraintlayout.widget.ConstraintLayout>

<MainActivity - Java class>

package com.sample.kakaologin;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

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.util.Base64;
import android.util.Log;
import android.widget.Toast;

import com.kakao.auth.ISessionCallback;
import com.kakao.auth.Session;
import com.kakao.network.ErrorResult;
import com.kakao.usermgmt.UserManagement;
import com.kakao.usermgmt.callback.MeV2ResponseCallback;
import com.kakao.usermgmt.response.MeV2Response;
import com.kakao.util.exception.KakaoException;

import java.security.MessageDigest;

public class MainActivity extends AppCompatActivity {
    private ISessionCallback mSessionCallback;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //카카오 로그인 기능 시작
        mSessionCallback = new ISessionCallback() {
            @Override
            public void onSessionOpened() {
                // 로그인 요청
                UserManagement.getInstance().me(new MeV2ResponseCallback() {
                    @Override
                    public void onFailure(ErrorResult errorResult) {
                        // 로그인 요청했는데 실패했을 때
                        Toast.makeText(MainActivity.this, "로그인 도중에 오류가 발생했습니다.", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onSessionClosed(ErrorResult errorResult) {
                        // 세션이 닫힘..
                        Toast.makeText(MainActivity.this, "세션이 닫혔습니다.. 다시 시도해주세요.", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onSuccess(MeV2Response result) {
                        // 로그인 성공
                        Intent intent = new Intent(MainActivity.this, success.class);
                        intent.putExtra("name", result.getKakaoAccount().getProfile().getNickname());
                        intent.putExtra("profileImg", result.getKakaoAccount().getProfile().getProfileImageUrl());
                        intent.putExtra("birth", result.getKakaoAccount().getBirthday());
                        startActivity(intent);

                        Toast.makeText(MainActivity.this, "로그인이 완료되었습니다.", Toast.LENGTH_SHORT).show();
                        finish();
                    }
                });
            }

            @Override
            public void onSessionOpenFailed(KakaoException exception) {
                Toast.makeText(MainActivity.this, "세션 열기에 실패하였습니다. 다시 시도해주세요.", Toast.LENGTH_SHORT).show();
            }
        };

        Session.getCurrentSession().addCallback(mSessionCallback);
        Session.getCurrentSession().checkAndImplicitOpen(); //세션 유지
        //getAppKeyHash();
    }
    private void getAppKeyHash()
    {
        try {
            PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md;
                md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                String something = new String(Base64.encode(md.digest(), 0));
                Log.e("Hash key", something);
            }
        } catch (Exception e) {
            Log.e("name not found", e.toString());
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if (Session.getCurrentSession().handleActivityResult(requestCode, resultCode, data))
            super.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Session.getCurrentSession().removeCallback(mSessionCallback);
    }
}

<success 액티비티 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=".success">

    <ImageView
        android:id="@+id/iv_profile"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_marginTop="200dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:srcCompat="@tools:sample/avatars" />

    <TextView
        android:id="@+id/tv_birth"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="TextView"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.501"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/iv_profile" />

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="TextView"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tv_birth" />

    <Button
        android:id="@+id/btn_logout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="100dp"
        android:text="로그아웃"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

< success.java 코드 >

package com.sample.kakaologin;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.kakao.usermgmt.UserManagement;
import com.kakao.usermgmt.callback.LogoutResponseCallback;

import org.w3c.dom.Text;

public class success extends AppCompatActivity {
private String strName, strProfileImg, strBirth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_success);

        Intent intent = getIntent();
        strName = intent.getStringExtra("name");
        strProfileImg = intent.getStringExtra("profileImg");
        strBirth = intent.getStringExtra("birth");

        TextView tv_name = findViewById(R.id.tv_name);
        TextView tv_birth = findViewById(R.id.tv_birth);
        ImageView iv_profile = findViewById(R.id.iv_profile);

        //이름 set
        tv_name.setText(strName);
        //생일 set
        tv_birth.setText(strBirth);
        //프로필 이미지 사진 set
        Glide.with(this).load(strProfileImg).into(iv_profile);

        //로그아웃하기
        findViewById(R.id.btn_logout).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "로그아웃이 완료되었습니다.", Toast.LENGTH_SHORT).show();
                UserManagement.getInstance().requestLogout(new LogoutResponseCallback() {
                    @Override
                    public void onCompleteLogout() {
                        // 로그아웃 성공 시 수행하는 지점
                        finish(); // 현재 액티비티 종료
                    }
                });
            }
        });
    }

}

이상입니다.

추가로, 구현하면서 카카오 로그인 버튼을 특정 값 입력 시 버튼 클릭이 활성화되게 구현해보려 했는데, 카카오톡 로그인 버튼이 카카오에서 커스텀해서 만든 버튼이라 따로 setEnabled = false 같은 코드가 안 먹히더라구요 ㅠㅠ

전체 코드 보고 싶으신 분은 아래 사이트로 이동해주세요.
https://github.com/hyunseokSon/kakaoLogin.git

 

GitHub - hyunseokSon/kakaoLogin: 안드로이드 스튜디오 카카오톡 로그인 연동

안드로이드 스튜디오 카카오톡 로그인 연동. Contribute to hyunseokSon/kakaoLogin development by creating an account on GitHub.

github.com

공감은 큰 힘이 됩니다!! 
감사합니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.