티스토리 뷰





: 이제 setting은 다 끝났으니 코드만 집어넣으시면 됩니다. 



로그인 버튼 넣기 

 

: 로그인 버튼은 커스텀으로 제작하셔도 상관없는데, 저는 카톡에서 제공해주는 버튼이 이뻐서 그대로 사용해 보겠습니다! 


아래 코드를 activity_main.xml 에 추가해 주세요.


1
2
3
4
5
6
7
8
    <com.kakao.usermgmt.LoginButton
        android:id="@+id/com_kakao_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_marginBottom="30dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"/>
cs


위 코드를 넣으면 이렇게 버튼이 나올겁니다. 확인해 주시고~ 




추가해야할 class들 한눈에 보기

 

: 로그인 기능만해도 들어가야할 클래스들이 꽤 됩니다. 

카카오톡 SDK를 Gradle로 붙여주는 class, Session연결 해주는 class 등 class마다 역할이 있는데요. 


일단 연동 자체에 중점을 맞추고 진행해 보겠습니다. 




위에 보이는 4개의 class들이 로그인을 위해 사용할 class들입니다. 






AndroidManifest.xml

 

: 그 전에 Mainfest에 추가 사항들을 체크하고 가보겠습니다. 


추가해야 할 사항들은 요정도 되겠네요. 

1. Internet permission

2. 각 Activity들

3. <meta data> (아까 받아놨던 네이티브 앱 키를 value값으로 주셔야 합니다! )


( 잘 모르시겠으면 아래 코드 비교해 보시면서 없는 부분만 채우셔도 됩니다~ )




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
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.kbpark.mysnsconnection">
 
    <!-- permission추가 -->
    <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">
 
        <meta-data android:name="com.kakao.sdk.AppKey"
            android:value="f8e9234b9ca079c93c8a6b8b9754cb53" />
 
        <activity android:name=".KakaoSignupActivity"/>
 
        <activity android:name=".SampleLoginActivity">
 
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
 
        </activity>
 
    </application>r
 
</manifest>
cs




Class 소스 추가 (4개) 


: 순서대로 가볼게요. 



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
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package com.example.kbpark.mysnsconnection;
 
import android.app.Activity;
import android.app.Application;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import android.view.Display;
 
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
import com.kakao.auth.KakaoSDK;
 
/**
 * 이미지를 캐시를 앱 수준에서 관리하기 위한 애플리케이션 객체이다.
 * 로그인 기반 샘플앱에서 사용한다.
 *
 * @author MJ
 */
public class GlobalApplication extends Application {
    private static volatile GlobalApplication instance = null;
    private static volatile Activity currentActivity = null;
    private ImageLoader imageLoader;
 
    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;
    }
 
    /**
     * 이미지 로더, 이미지 캐시, 요청 큐를 초기화한다.
     */
    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
 
 
        KakaoSDK.init(new KakaoSDKAdapter());
 
        final RequestQueue requestQueue = Volley.newRequestQueue(this);
 
        ImageLoader.ImageCache imageCache = new ImageLoader.ImageCache() {
            final LruCache<String, Bitmap> imageCache = new LruCache<String, Bitmap>(3);
 
            @Override
            public void putBitmap(String key, Bitmap value) {
                imageCache.put(key, value);
            }
 
            @Override
            public Bitmap getBitmap(String key) {
                return imageCache.get(key);
            }
        };
 
        imageLoader = new ImageLoader(requestQueue, imageCache);
    }
 
    /**
     * 이미지 로더를 반환한다.
     * @return 이미지 로더
     */
    public ImageLoader getImageLoader() {
        return imageLoader;
    }
 
    /**
     * 애플리케이션 종료시 singleton 어플리케이션 객체 초기화한다.
     */
    @Override
    public void onTerminate() {
        super.onTerminate();
        instance = null;
    }
    public static Display mDisplay;
 
    public static void setDisplay(Display display) {
        mDisplay = display;
    }
 
    public static int getDisplayWidth(){
        return mDisplay.getWidth();
    }
 
    public static int getDisplayHeight(){
        return mDisplay.getHeight();
    }
 
    public int resize_Height(int width, int height, int resize_width){
        return (this.getDisplayHeight()*resize_width)/getDisplayWidth();
    }
 
}
 
cs



-----------------------------------------------------------------------------------------------------------



KakaoSKDAdapter.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
package com.example.kbpark.mysnsconnection;
 
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




-----------------------------------------------------------------------------------------------------------



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
package com.example.kbpark.mysnsconnection;
 
/**
 * Created by KBPark on 2016. 6. 1..
 */
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
 
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 형태로 반환
                Logger.d("UserProfile : " + userProfile);
 
                Log.d("test","로그인 성공!");
 
                redirectMainActivity(); // 로그인 성공시 MainActivity로
            }
        });
    }
 
    private void redirectMainActivity() {
        startActivity(new Intent(this, SampleLoginActivity.class));
        finish();
    }
    protected void redirectLoginActivity() {
        final Intent intent = new Intent(this, SampleLoginActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        startActivity(intent);
        finish();
    }
 
}
 
 
cs




-----------------------------------------------------------------------------------------------------------




SampleLoginActivity.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
86
87
88
89
90
91
92
93
package com.example.kbpark.mysnsconnection;
 
 
import android.app.Activity;
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 com.kakao.auth.ISessionCallback;
import com.kakao.auth.Session;
import com.kakao.util.exception.KakaoException;
import com.kakao.util.helper.log.Logger;
 
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
 
/**
 * Created by hp on 2016-01-26.
 */
public class SampleLoginActivity  extends Activity {
 
    private SessionCallback callback;      //콜백 선언
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.activity_main);
 
        try {
            PackageInfo info = getPackageManager().getPackageInfo(
                    this.getPackageName(),
                    PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                Log.d("test", Base64.encodeToString(md.digest(), Base64.DEFAULT));
            }
        } catch (PackageManager.NameNotFoundException e) {
 
        } catch (NoSuchAlgorithmException e) {
 
        }
 
        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() 호출
            Log.d("test""세션연결 성공!! ");
        }
 
        @Override
        public void onSessionOpenFailed(KakaoException exception) {
            if(exception != null) {
                Log.d("test""세션연결 실패했네.. ㅠㅠ");
                Logger.e(exception);
            }
            setContentView(R.layout.activity_main); // 세션 연결이 실패했을때
        }                                            // 로그인화면을 다시 불러옴
    }
 
    protected void redirectSignupActivity() {       //세션 연결 성공 시 SignupActivity로 넘김
        final Intent intent = new Intent(this, KakaoSignupActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        startActivity(intent);
        finish();
    }
 
}
cs



[소스출처] : http://falinrush.tistory.com/4






드디어 완성 했습니다 !






버튼을 클릭하면 위와같이 선택해서 로그인 할 수 있도록 나옵니다! 


궁굼하신점 있으시면 댓글이나 이메일 주세요 ! 






댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함