본문 바로가기

[Android] 카카오톡 로그인 - 2

by 마스터누누 2017. 4. 19.
728x90
반응형

카카오톡 로그인 - 2 



이미 만들어져 있는것을 포스팅하는게 아니라

하면서 포스팅하다보니 삽질에 삽질을 반복한다

삽질과 새벽 하드코딩으로 개발 능력이 강화된다는 명언이 있듯이

나의 헛삽질로 만들어진 포스팅이 내가 기억하려고 올리는 이유가 가장 크지만

(그래서 좀 허접함)

 이걸 보고 누군가에게 도움이 될 수 있으면 참 기쁜일이겠다. 



그럼 저번에 이어서 카카오톡 로그인 소스코드를 살펴보도록 하자

소스코드는 크게 4개로 나뉘며 분석은 없으니 알아서 쓰기 바란다.

단말기에서 테스트 완료하였고 복붙 만으로 실행이 될 것이다.

버전은 2016년 1.1.20 기준이다.



카카오톡 로그인 소스코드(JAVA)



LoginActivity.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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package com.example.anew.kakao;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
 
import com.kakao.auth.ISessionCallback;
import com.kakao.auth.KakaoSDK;
import com.kakao.auth.Session;
import com.kakao.util.exception.KakaoException;
import com.kakao.util.helper.log.Logger;
 
/**
 * Created by hp on 2016-01-26.
 */
public class LoginActivity  extends Activity {
 
    private SessionCallback callback;      //콜백 선언
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.activity_login);
 
        callback = new SessionCallback();                  // 이 두개의 함수 중요함
        Session.getCurrentSession().addCallback(callback);
 
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (Session.getCurrentSession().handleActivityResult(requestCode, resultCode, data)) {
            return;
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Session.getCurrentSession().removeCallback(callback);
    }
 
    private class SessionCallback implements ISessionCallback {
 
        @Override
        public void onSessionOpened() {
            redirectSignupActivity();  // 세션 연결성공 시 redirectSignupActivity() 호출
        }
        @Override
        public void onSessionOpenFailed(KakaoException exception) {
            if(exception != null) {
                Logger.e(exception);
            }
            setContentView(R.layout.activity_login); // 세션 연결이 실패했을때
        }                                            // 로그인화면을 다시 불러옴
    }
 
    protected void redirectSignupActivity() {       //세션 연결 성공 시 SignupActivity로 넘김
        final Intent intent = new Intent(this, KakaoSignupActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        startActivity(intent);
        finish();
    }
 
}
cs


로그인 초기 화면이다.

 액티비티를 로드하고, 가장 중요한 콜백 함수를 등록한다.

또한 세션 연결 시 다음으로 넘어갈 클래스를 호출한다.





KakaoSignupActivity.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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package com.example.anew.kakao;
 
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
 
import com.kakao.auth.ApiResponseCallback;
import com.kakao.auth.ErrorCode;
import com.kakao.network.ErrorResult;
import com.kakao.usermgmt.UserManagement;
import com.kakao.usermgmt.callback.MeResponseCallback;
import com.kakao.usermgmt.response.model.UserProfile;
 
import com.kakao.util.helper.log.Logger;
 
public class KakaoSignupActivity extends Activity{
    /**
     * Main으로 넘길지 가입 페이지를 그릴지 판단하기 위해 me를 호출한다.
     * @param savedInstanceState 기존 session 정보가 저장된 객체
     */
 
    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestMe();
    }
    /**
     * 사용자의 상태를 알아 보기 위해 me API 호출을 한다.
     */
    protected void requestMe() { //유저의 정보를 받아오는 함수
        UserManagement.requestMe(new MeResponseCallback() {
            @Override
            public void onFailure(ErrorResult errorResult) {
                String message = "failed to get user info. msg=" + errorResult;
                Logger.d(message);
 
                ErrorCode result = ErrorCode.valueOf(errorResult.getErrorCode());
                if (result == ErrorCode.CLIENT_ERROR_CODE) {
                    finish();
                } else {
                    redirectLoginActivity();
                }
            }
 
            @Override
            public void onSessionClosed(ErrorResult errorResult) {
                redirectLoginActivity();
            }
            @Override
            public void onNotSignedUp() {} // 카카오톡 회원이 아닐 시 showSignup(); 호출해야함
 
            @Override
            public void onSuccess(UserProfile userProfile) {  //성공 시 userProfile 형태로 반환
                String kakaoID = String.valueOf(userProfile.getId()); // userProfile에서 ID값을 가져옴
                String kakaoNickname = userProfile.getNickname();     // Nickname 값을 가져옴
                String url = String.valueOf(userProfile.getProfileImagePath());
 
                Logger.d("UserProfile : " + userProfile);
                Log.d("kakao""==========================");
                Log.d("kakao"""+userProfile);
                Log.d("kakao", kakaoID);
                Log.d("kakao", kakaoNickname);
                Log.d("kakao""==========================");
                redirectMainActivity(url, kakaoNickname); // 로그인 성공시 MainActivity로
            }
        });
    }
    private void redirectMainActivity(String url, String nickname) {
        Intent intent = new Intent(KakaoSignupActivity.this, MainActivity.class);
        intent.putExtra("url", url);
        intent.putExtra("nickname", nickname);
        startActivity(intent);
        finish();
    }
    protected void redirectLoginActivity() {
        final Intent intent = new Intent(this, LoginActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        startActivity(intent);
        finish();
    }
 
}
 
cs


간단하게 말하면 유저의 정보를 가져오는 클래스이다.

호출 시 유저 정보를 잘 받아오는지 로그에 띄워보았다.




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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package com.example.anew.kakao;
 
/**
 * Created by moonsu on 2016-02-10.
 */
import android.app.Activity;
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;
 
/**
 * @author leoshin on 15. 9. 15.
 */
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_LOGIN_ALL};
            }
 
            @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


SDK에 대한 어댑터 클래스이다.

세션의 설정값이라는데 주석 그대로 필요할때 찾아서 오버라이드 해주도록 하자





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
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
52
53
54
55
package com.example.anew.kakao;
 
/**
 * Created by hp on 2016-01-26.
 */
 
import android.app.Activity;
import android.app.Application;
 
import com.kakao.auth.KakaoSDK;
 
/**
 * 이미지를 캐시를 앱 수준에서 관리하기 위한 애플리케이션 객체이다.
 * 로그인 기반 샘플앱에서 사용한다.
 *
 * @author MJ
 */
public class GlobalApplication extends Application {
    private static volatile GlobalApplication instance = null;
    private static volatile Activity currentActivity = null;
 
    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
 
        KakaoSDK.init(new KakaoSDKAdapter());
    }
 
    public static Activity getCurrentActivity() {
        return currentActivity;
    }
 
    public static void setCurrentActivity(Activity currentActivity) {
        GlobalApplication.currentActivity = currentActivity;
    }
 
    /**
     * singleton 애플리케이션 객체를 얻는다.
     * @return singleton 애플리케이션 객체
     */
    public static GlobalApplication getGlobalApplicationContext() {
        if(instance == null)
            throw new IllegalStateException("this application does not inherit com.kakao.GlobalApplication");
        return instance;
    }
    /**
     * 애플리케이션 종료시 singleton 어플리케이션 객체 초기화한다.
     */
    @Override
    public void onTerminate() {
        super.onTerminate();
        instance = null;
    }
}
cs


이미지와 캐시를 앱수준에서 관리하는 클래스라고 한다.

파악이 잘 안되는 부분이 있지만,

Kakao.init(new KakaoSDKAdapter());

이 부분이 중요하다.


세션을 초기화 하는 코드인데 개발자 페이지에도 initializing 에러로 문의하는 사람이 많았다.

사례가 많은 만큼 trouble shooting 카테고리에서 자세하게 게시했다.


http://blog.naver.com/aufcl4858/220783028488





연동을 위한 자바코드는 이상이다.


다음으로는 메니페스트이다.



AndroidMenifest.xml


 

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
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.anew.kakao">
 
    <uses-permission android:name="android.permission.INTERNET" />
 
    <application
        android:name=".GlobalApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".LoginActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <meta-data
            android:name="com.kakao.sdk.AppKey"
            android:value="@string/kakao_app_key" />
        <activity android:name=".KakaoSignupActivity"/>
        <activity android:name=".MainActivity"/>
 
    </application>
 
</manifest>
 
cs


크게 달라진 것은 없다. 중요한것이라면


1. INTERNET  퍼미션 등록

2. GlobalApplication name 등록

3. 메타 데이터로 네이티브 키 값등록


이정도 인것같은데 2번은 앞서 말한것과 마찬가지로 세션의 초기화를 위하여 꼭 등록해 주도록 하자

GlobalApplication 내부의 Kakao.init(new KakaoSDKAdapter())가 동작하지 않으면

어플리케이션이 시작과 동시에 갑자기 중단된다.


로그인이 완료 되었을 때 호출되는 MainActivity는 본인이 하고 싶은 메인 액티비티를 호출하면 되겠다.

테스트용이라 나도 Hello World를 호출했다.

또한, 로그인 xml에는 1편에서 포스팅한것과 동일하게 로그인 버튼 하나만 설정 해두었다.


동작 되는것만 확인하고 급하게 올리느라 나도 코드에 내용을 정확하게 보지 못했다.

추후에 분석을 통하여 내용을 좀 더 보강 해야겠다.



반응형

'' 카테고리의 다른 글

[일상] 이러고 있다.  (0) 2017.05.09
[일상] 주말 - 남산 한옥 마을  (0) 2017.04.22
[일상] 미로  (0) 2017.04.20
[Android] Baas - Firebase 사용법 1  (0) 2017.04.19
[Android] 카카오톡 로그인 - 1  (0) 2017.04.19

댓글