Android

카카오 로그인 ( 2019 .10 .4 )

Machine_웅 2019. 10. 4. 15:14
728x90
반응형

string.xml에 카카오 디벨로퍼에서 제공하는 키값 추가 (네이티브 앱 키 추가하면 됩니다.)

(카카오 디벨로퍼 사이트 가입은 다른 블로그에도 많이 적혀있으므로 참고바랍니다.)

 

 

<build.gradle>  Project 에  maven  추가

 

allprojects {
    repositories {
        google()
        jcenter()

        // kakao
        mavenCentral()
        maven { url 'http://devrepo.kakao.com:8088/nexus/content/groups/public/' }
    }
}

 

<build.gradle> module: app 에 추가

 

 //카카오 로그인
    api group: 'com.kakao.sdk', name: 'usermgmt', version: '1.14.0'

 

<Manifest > 에 인터넷 권한 추가

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

 

< GlobalApplication > 클래스 생성

import android.app.Application;
import android.content.Context;

import com.kakao.auth.ApprovalType;
import com.kakao.auth.AuthType;
import com.kakao.auth.IApplicationConfig;
import com.kakao.auth.ISessionConfig;
import com.kakao.auth.KakaoAdapter;
import com.kakao.auth.KakaoSDK;

public class GlobalApplication extends Application {

    private static volatile GlobalApplication instance = null;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;

        KakaoSDK.init(new KakaoSDKAdapter());
    }

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

    protected static class KakaoSDKAdapter extends KakaoAdapter {
        /**
         * Session Config에 대해서는 default값들이 존재한다.
         * 필요한 상황에서만 override해서 사용하면 됨.
         *
         * @return Session의 설정값.
         */

        @Override
        public ISessionConfig getSessionConfig() {
            return new ISessionConfig() {

                @Override
                public AuthType[] getAuthTypes() {

                    // 로그인시 인증받을 타입을 지정한다. 지정하지 않을 시 가능한 모든 옵션이 지정된다.

                    //1.KAKAO_TALK :  kakaotalk으로 login을 하고 싶을때 지정.
                    //2.KAKAO_STORY : kakaostory으로 login을 하고 싶을때 지정.
                    //3.KAKAO_ACCOUNT :  웹뷰 Dialog를 통해 카카오 계정연결을 제공하고 싶을경우 지정.
                    //4.KAKAO_TALK_EXCLUDE_NATIVE_LOGIN : 카카오톡으로만 로그인을 유도하고 싶으면서 계정이 없을때 계정생성을 위한
                    //버튼도 같이 제공을 하고 싶다면 지정.KAKAO_TALK과 중복 지정불가.
                    //5.KAKAO_LOGIN_ALL : 모든 로그인방식을 사용하고 싶을때 지정.

                    return new AuthType[]{AuthType.KAKAO_TALK};
                }


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

                }
                @Override
                public boolean isSaveFormData() {
                    // Kakao SDK 에서 사용되는 WebView에서 email 입력폼에서 data를 save할지여부를 결정한다. Default true.

                    return true;
                }
            };
        }

        //Application이 가지고있는 정보를 얻기위한 interface.
        @Override
        public IApplicationConfig getApplicationConfig() {
            return new IApplicationConfig() {

                // 현재 최상단에 위치하고 있는 Activity. topActivity가 아니거나 ApplicationContext를 넣는다면
                // SDK내에서의 Dialog Popup등이 동작하지 않을 수 있습니다.


                @Override
                public Context getApplicationContext() {
                    return GlobalApplication.getGlobalApplicationContext();
                }
            };
        }
    }




    /**
     * 애플리케이션 종료시 singleton 어플리케이션 객체 초기화한다.
     */
    @Override
    public void onTerminate() {
        super.onTerminate();
        instance = null;
    }

}

 

< MainActivity >

onCreate

   callback = new SessionCallback();
        Session.getCurrentSession().addCallback(callback);
        Session.getCurrentSession().checkAndImplicitOpen();
 // ----------------------------  카카오  로그인 --------------------------------------------
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (Session.getCurrentSession().handleActivityResult(requestCode, resultCode, data)) {
            return;
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    private class SessionCallback implements ISessionCallback {

        @Override
        public void onSessionOpened() {
            Log.d("@@@@@", "main 세션 연결 성공");
            redirectSignupActivity();
        }

        @Override
        public void onSessionOpenFailed(KakaoException exception) {

            Log.d("@@@@@", "main 세션 연결 실패");
            if (exception != null) {
                Logger.e(exception);
                Log.d("@@@@@@",""+exception.toString());
            }

            // 세션 실패
            setContentView(R.layout.main__menu);
        }
    }

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

    protected void redirectSignupActivity() {
        Log.d("@@@@@", "main 실행");
        is_login = true;

        // 사용자 정보 가지고 오기
        get_userData();
    }
    protected void get_userData(){
        List<String> keys = new ArrayList<>();

        UserManagement.getInstance().me(keys, new MeV2ResponseCallback() {
            @Override
            public void onFailure(ErrorResult errorResult) {
                String message = "@@@@@ failed to get user info. msg=" + errorResult;
                Logger.d(message);

                Log.d("@@@@",""+message);
            }

            @Override
            public void onSessionClosed(ErrorResult errorResult) {
                // 세션이 닫혀있을때.
                Log.d("@@@@",""+errorResult);
            }

            @Override
            public void onSuccess(MeV2Response response) {

                Log.d("@@@@@ user id : " ,""+ response.getId());
                Log.d("@@@@@ user Nick : " ,""+ response.getNickname());
                Log.d("@@@@@ email : " ,""+ response.getKakaoAccount().getEmail());
                Log.d("@@@@@ profile image : " ,""+ response.getKakaoAccount());
                // 가지고 왔을때
            }
        });


    }

 

Xml 에 버튼 추가

    <com.kakao.usermgmt.LoginButton
        android:layout_gravity="center"
        android:id="@+id/com_kakao_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:layout_editor_absoluteX="50dp"
        tools:layout_editor_absoluteY="250dp"
        android:visibility="gone"/>

 

<manifest>에 추가

 

  <!-- 카카오 -->
        <meta-data
            android:name="com.kakao.sdk.AppKey"
            android:value="@string/kakao_app_key" />

+  name 에 GlobalApplication 추가

<application
        android:name=".Main._Main._main_Sub_menu.GlobalApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

 

 

++  카카오 디벨로퍼에서 해쉬키 등록시  해쉬키 가져오기

 

   //카카오 디벨로퍼에서 사용할 키값을 로그를 통해 알아낼 수 있다. (로그로 본 키 값을을 카카오 디벨로퍼에 등록해주면 된다.)
    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) {
            // TODO Auto-generated catch block
            Log.e("name not found", e.toString());
        }
    }

 

 

주의)  카카오 로그인시 엑티비티는 최상단이어야 하는 것 같습니다.

728x90
반응형