티스토리 뷰
: 이제 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
드디어 완성 했습니다 !
버튼을 클릭하면 위와같이 선택해서 로그인 할 수 있도록 나옵니다!
궁굼하신점 있으시면 댓글이나 이메일 주세요 !
'개발자 배배 > Android' 카테고리의 다른 글
[Android] Retrofit의 동기/비동기 시행착오 (2) | 2017.02.01 |
---|---|
[Android] 안드로이드 폰에서 db파일 접근하기 (SQLite) (0) | 2016.08.04 |
[Android] 안드로이드 카카오톡 연동 - (2). Gradle 설정 (0) | 2016.06.02 |
[Android] 안드로이드 카카오톡 연동 - (1). App설정 (1) | 2016.06.02 |
[멀티채팅] 4. Server 구현하기 (3) | 2016.05.31 |
- Total
- Today
- Yesterday
- Beacon
- kakaotalk
- kakao oven
- startService
- fragment 겹침
- 책 집필
- 행복의 상대성
- Retrofit
- Android
- SQLPro
- 카톡
- layout_weight
- KAKAO
- server ip
- nodejs
- call back
- 카카오톡 연동
- 카카오톡
- tabLayout
- 비콘
- wegith
- RECO beacon
- stopService
- 안드로이드
- call back 뺏아오기
- ranging
- 연동
- monitoring
- 수업교재
- eddystone
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |