티스토리 뷰

안녕하세요. 감자코딩에 감자개발자입니다.


이번에 살펴볼 기능은 안드로이드로 Kakaotalk 로그인연동하기입니다.



1. 가장 첫번째로, https://developers.kakao.com/ 카카오톡 개발자 사이트로 이동합니다.

이동한후, 가장먼저 해야할것은 프로젝트를 등록하고 Hash값을 등록해야합니다.


2. 그런데, 과연 Hash값을 어떻게 얻을까 궁금해 하시는분들이 있을것입니다.

그 방법은 약 2가지 방법이 있으나, 제가 여기서 보여드리는 방법은 안드로이드 코드내에서 소스코드를 추출해보도록 하겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void getHashKey(){
    try {                                                        // 패키지이름을 입력해줍니다.
        PackageInfo info = getPackageManager().getPackageInfo("com.example", PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.d(TAG,"key_hash="+ Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
}
cs

다음의 소스코드를 호출하면, log값으로 자신의 Hash Values를 뽑아내는것을 확인할 수 있습니다.

이렇게 생성된 Hash값으로 모바일 플랫폼안의 Hash값으로 입력해줍니다.


3. 이제 Kakao Developer로 가서 사용자 관리를 OFF -> ON으로 해줍니다.


4. 카카오톡에서 로그인을 사용하기위해서는 카카오톡에서 제공하는 SDK를 추가해줍니다.


위치는 Gradle(Project) 입니다.

1
2
3
4
5
6
7
8
9
10
11
 
allprojects {
    repositories {
        google()
        jcenter()
        //kakao
        mavenCentral()
        maven { url 'http://devrepo.kakao.com:8088/nexus/content/groups/public/'}
 
    }
}
cs



5. 그다음에는 gradle.properties에 값을 추가해줍니다.


1
2
KAKAO_SDK_GROUP=com.kakao.sdk
KAKAO_SDK_VERSION=1.1.7
cs


6. 그다음 module:gradle(app)에 추가 할 내용입니다.


1
2
3
dependencies {
    compile group: project.KAKAO_SDK_GROUP, name: 'usermgmt', version: project.KAKAO_SDK_VERSION
}
cs


7. 이제 서버 통신을 위하여 AndroidManifest.xml 에 추가를 해주겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example">
 
 
        <meta-data
            android:name="com.kakao.sdk.AppKey"            // 자신의 패키지를 쓰는것이 아닙니다. 저렇게 똑같이써줍니다.
            android:value="@string/kakao_app_key" />
 
    </application>
 
</manifest>
cs


8. 여기서부터 이제 JAVA 파일을 생성해주겠습니다. GlobalApplication.java 추가 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class GlobalApplication extends Application {
 
    private static volatile GlobalApplication obj = null;
    private static volatile Activity currentActivity = null;
 
    @Override
    public void onCreate() {
        super.onCreate();
        obj = this;
        KakaoSDK.init(new KakaoSDKAdapter());
    }
 
    public static GlobalApplication getGlobalApplicationContext() {
        return obj;
    }
 
    public static Activity getCurrentActivity() {
        return currentActivity;
    }
 
    // Activity가 올라올때마다 Activity의 onCreate에서 호출해줘야한다.
    public static void setCurrentActivity(Activity currentActivity) {
        GlobalApplication.currentActivity = currentActivity;
    }
}
cs




9.KaKaoSDKAdapter.java를 추가해주도록 하겠습니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class KakaoSDKAdapter extends KakaoAdapter {
    /**
     * Session Config에 대해서는 default값들이 존재한다.
     * 필요한 상황에서만 override해서 사용하면 됨.
     * @return Session의 설정값.
     */
    @Override
    public ISessionConfig getSessionConfig() {
        return new ISessionConfig() {
            @Override
            public AuthType[] getAuthTypes() {
                return new AuthType[] {AuthType.KAKAO_ACCOUNT};
            }
 
            @Override
            public boolean isUsingWebviewTimer() {
                return false;
            }
            @Override
            public ApprovalType getApprovalType() {
                return ApprovalType.INDIVIDUAL;
            }
 
            @Override
            public boolean isSaveFormData() {
                return true;
            }
        };
    }
 
    @Override
    public IApplicationConfig getApplicationConfig() {
        return new IApplicationConfig() {
            @Override
            public Activity getTopActivity() {
                return GlobalApplication.getCurrentActivity();
            }
 
            @Override
            public Context getApplicationContext() {
                return GlobalApplication.getGlobalApplicationContext();
            }
        };
    }
}
cs




10. 이제 이렇게 만든 Java코드를 AndroidManifest.xml 에 추가 할 내용입니다.


1
2
3
4
<application
    android:name=".GlobalApplication" 
 
>  // 다음을 추가해줍니다.
cs


11. 이제 MainActivity.java에 콜백 내부클래스를 추가합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class SessionCallback implements ISessionCallback {
 
        @Override
        public void onSessionOpened() {
 
            UserManagement.requestMe(new MeResponseCallback() {
                @Override
                public void onFailure(ErrorResult errorResult) {
                    String message = "failed to get user info. msg=" + errorResult;
 
                    ErrorCode result = ErrorCode.valueOf(errorResult.getErrorCode());
                    if (result == ErrorCode.CLIENT_ERROR_CODE) {
                        //에러로 인한 로그인 실패
                        // finish();
                    } else {
                        //redirectMainActivity();
                    }
                }
 
                @Override
                public void onSessionClosed(ErrorResult errorResult) {
                }
 
                @Override
                public void onNotSignedUp() {
 
                }
 
                @Override
                public void onSuccess(UserProfile userProfile) {
                    //로그인에 성공하면 로그인한 사용자의 일련번호, 닉네임, 이미지url등을 리턴합니다.
                    //사용자 ID는 보안상의 문제로 제공하지 않고 일련번호는 제공합니다.
    
                // Log.e("UserProfile", userProfile.toString());
                // Log.e("UserProfile", userProfile.getId() + "");
 
 
                    long number = userProfile.getId();
 
 
                }
            });
 
        }
// 세션 실패시
        @Override
        public void onSessionOpenFailed(KakaoException exception) {
          
 
        }
    }
cs

12. 이제 Main에서 콜백클래스를 초기화해주는 역할을 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MainActivity extends AppCompatActivity {
 
    private static final String TAG = "";
    SessionCallback callback;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       // getHashKey();
 
        setContentView(R.layout.activity_main);
        callback = new SessionCallback();
        Session.getCurrentSession().addCallback(callback);
        requestMe();
 
    }
cs



13. 이제 XML파일을 수정해보겠습니다. 카카오톡 버튼이 보이게하려면 필요하겠죠?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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="com.example">
 
  
    <com.kakao.usermgmt.LoginButton
        android:id="@+id/com_kakao_login"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_marginBottom="30dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"/>
 
</android.support.constraint.ConstraintLayout>
cs


14. 이제 유저정보를 가져오는 메소드를 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public void requestMe() {
        //유저의 정보를 받아오는 함수
        UserManagement.requestMe(new MeResponseCallback() {
            @Override
            public void onFailure(ErrorResult errorResult) {
                Log.e(TAG, "error message=" + errorResult);
//                super.onFailure(errorResult);
            }
            @Override
            public void onSessionClosed(ErrorResult errorResult) {
                Log.d(TAG, "onSessionClosed1 =" + errorResult);
            }
            @Override
            public void onNotSignedUp() {
                //카카오톡 회원이 아닐시
                Log.d(TAG, "onNotSignedUp ");
            }
            @Override
            public void onSuccess(UserProfile result) {
                Log.e("UserProfile", result.toString());
                Log.e("UserProfile", result.getId() + "");
            }
        });
    }
cs





15. 이제 마지막으로 res/values 에 xml kakao_string.xml 파일을 추가해줍니다.


1
2
3
<resources>
    <string name="app_name">여기에 Developer에서 발급받은 네이티브 값을 넣어야해요.</string>            // Native Values
</resources>
cs


16. Clean Project를 통해서 프로젝트를 깔끔하게 정리한번해주고 이제 실행을 해봅시다.




이렇게 카카오톡 로그인 연동을 살펴보았습니다.

간단하게 잘써먹을수 있게 코드리뷰형식으로 많이 작성하였습니다.^^


+ 추가로 버튼을 커스텀하기 위해서는 Kakao Developer에 나와있는 로고에 훼손가지 않는선에서 개인이 바꿀 수 있는것으로 알고있습니다. 따라서 커스텀하실 때 이것에 유의해서 작성해주시면 될 것 같습니다.


자세한 사항은 Developer.kakao.com 에 더욱더 자세하게 나와있습니다.

문의해보시는것이 빠르고 정확할 것이라고 생각이 듭니다.

지금까지 감자코딩에 감자개발자였습니다. 감사합니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함