android studio

안드로이드 스튜디오 카카오 로그인 구현

공부짱짱열심히하기 2023. 3. 24. 12:32

https://developers.kakao.com/console/app/873668/config/platform

 

카카오계정

 

accounts.kakao.com

 

 

 

2) 동의항목 설정

 

내 애플리케이션 > 제품 설정 > 카카오 로그인 > 동의항목

 

카카오 로그인 구현 시에 카카오 서비스에 등록할 사용자의 정보를 가지고 올 수 있습니다.

ex) 프로필 정보, 성별, 이메일

 

이번 경우엔 프로필 정보를 필수동의, 이메일을 선택동의로 설정하겠습니다.

* 이메일은 비즈 앱인 경우에만 필수 동의가 가능합니다.

 

 

 

플랫폼 등록

 

oncreate에서

       Log.d("getKeyHash", "" + getKeyHash(MainActivity.this));

 

함수만들어주기

 public static String getKeyHash(final Context context) {
        PackageManager pm = context.getPackageManager();
        try {
            PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);
            if (packageInfo == null)
                return null;

            for (Signature signature : packageInfo.signatures) {
                try {
                    MessageDigest md = MessageDigest.getInstance("SHA");
                    md.update(signature.toByteArray());
                    return android.util.Base64.encodeToString(md.digest(), android.util.Base64.NO_WRAP);
                } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
                }
            }
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

 

얻은 hash값 

 

등록후

안드로이드 기본세팅

 

모듈 설치

https://developers.kakao.com/docs/latest/ko/getting-started/sdk-android

 

Kakao Developers

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

developers.kakao.com

필요한거 grdle에 추가

 

 

인터넷 권한설정(매니페스트)

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

 

자바8확인(gradle)

 

 

 

 


로그인 

1. 초기화 코드

Android SDK를 사용하기 위해선 가장 먼저 네이티브 앱 키로 초기화를 해야 합니다.

GlobalApplication.java 에 초기화 코드를 추가해줍니다.

AndroidManifest.xml 의 'application'에도 Kakao SDK 초기화를 수행한 클래스의 이름을 설정해야 합니다.

클래스에서 초기화를 했으므로 아래와 같이 추가해줍니다.

 

<activity android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity">
  <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_APP_KEY}"/>
  </intent-filter>
</activity>

이런식으로

 

코드 작성

 btnKakao.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(UserApiClient.getInstance().isKakaoTalkLoginAvailable(LoginActivity.this)){
                    login();
                    Intent intent2 = new Intent(LoginActivity.this, MainActivity.class);
                    startActivity(intent2);
                    finish();
                }
                else{
                    accountLogin();
                }
            }
        });

    }

연결된 함수 2개 작성(login() 과 accountLogin())

어플로로그인

 private void login() {
        String TAG = "login()";
        UserApiClient.getInstance().loginWithKakaoTalk(LoginActivity.this,(oAuthToken, error) -> {
            if (error != null) {
                Log.e(TAG, "로그인 실패", error);
            } else if (oAuthToken != null) {
                Log.i(TAG, "로그인 성공(토큰) : " + oAuthToken.getAccessToken());
                getUserInfo();
            }
            return null;
        });
        
    }

 

어플이 없을때 계정으로 로그인

    private void accountLogin() {

        String TAG = "accountLogin()";
        UserApiClient.getInstance().loginWithKakaoAccount(LoginActivity.this, (oAuthToken, error) -> {
            if (error != null) {
                Log.e(TAG, "로그인 실패", error);
            } else if (oAuthToken != null) {
                Log.i(TAG, "로그인 성공(토큰) : " + oAuthToken.getAccessToken());
                getUserInfo();


                SharedPreferences prefs = getSharedPreferences(Config.PREFERENCE_NAME, MODE_PRIVATE);
                SharedPreferences.Editor editor = prefs.edit();
                editor.putString(Config.ACCESS_TOKEN, oAuthToken.getAccessToken());
                editor.apply();

                // MainActivity로 화면 전환
                Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                startActivity(intent);
                Log.d(TAG,"토큰확인후 이동");
                finish();
            }
            return null;
        });


    }

 

getuserinfo(내가 동의한 유저 정보함수)

  private void getUserInfo() {

        String TAG = "getUserInfo()";
        UserApiClient.getInstance().me((user, meError) -> {
            if (meError != null) {
                Log.e(TAG, "사용자 정보 요청 실패", meError);
            } else {
                System.out.println("로그인 완료");
                Log.i(TAG, user.toString());
                {
                    Log.i(TAG, "사용자 정보 요청 성공" +
                            "\n회원번호: "+user.getId() +
                            "\n이메일: "+user.getKakaoAccount().getEmail());
                }
                Account user1 = user.getKakaoAccount();
                System.out.println("사용자 계정" + user1);

            }
            return null;
        });
        
    }

main에서 쉐어드프리퍼런스에 넣어라

   SharedPreferences sp = getSharedPreferences(Config.PREFERENCE_NAME, MODE_PRIVATE);
        String accessToken = sp.getString(Config.ACCESS_TOKEN, "");
        if(accessToken.isEmpty()){
            Intent intent = new Intent(MainActivity.this, LoginActivity.class);
            startActivity(intent);
            finish();
            return;
        }