안녕하세요! 


오늘도 삽질로 고통받았습니다... 안드로이드가 쉽지가 않네요.


예전에 카카오톡 로그인때문에 고통받았던 제 모습이 생각나서


고통을 조금이라도 일찍 해소해 드리기 위해


쉬지않고 바로 포스팅 달려보도록 하겠습니다!




카카오 로그인을 위해서는 KakaoSDKAdapter 가 있어야 합니다.


고수분들은 필요한것만 골라서 오버라이딩 해서 쓰는것으로 예상되지만 저는 아직 잘 모르기에


통짜로 복붙했습니다.. 허허


package com.example.hp.ee;

/**
* Created by hp on 2016-01-26.
*/

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();
}
};
}
}
 

다음과 같이 KakaoSDKAdapter 를 만들어주면 GlobalApplication 에 빨간 밑줄이 그어져 있을것입니다.


GlobalApplication 도 카카오 로그인에 필요하므로 추가해주어야 합니다.

/**
* 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;
}
}
 


GlobalApplication을 AndroidManifest.xml에 다음과 같이 추가시켜줍니다.


<application
android:name=".GlobalApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"

이 과정들이 끝나면 아름답게 로그인이 될것입니다!


로그인버튼에 ID값으로 onClick을 넣어주지 않아도 LoginButton이 알아서 로그인을 다 해줍니다.


허허 신기하네요... 좀 더 공부한다음 다시 깊게 파보겠습니다!



로그인을 했으면 로그인 한 유저의 정보값을 얻을 수 있는데요


이는 KakaoSignupActivity의 RequestMe()함수에서


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() {
}

@Override
public void onSuccess(UserProfile userProfile) {
String kakaoID = String.valueOf(userProfile.getId()); // userProfile에서 ID값을 가져옴
String kakaoNickname = userProfile.getNickname(); // Nickname 값을 가져옴
Logger.d("UserProfile : " + userProfile);
redirectMainActivity(); // 로그인 성공시 MainActivity
}
});
}

다음과 같이 userProfile.get??() 로 가져올 수 있습니다!!


이거 찾으라 삽질했던 기억이 나네요 ㅋㅋㅋ 


이를 이용해서 DB에 정보를 넣을 수 있을것입니다.


추가적인 정보를 넣는 방법은 카카오 개발 가이드에 자세하게 나와있습니다.



앱 구현 인턴을 하면서 카카오 로그인 기능을 구현하기 위해 이것 저것 뜯어보며 


깨알같이 카카오 로그인을 구현하게 되었습니다.


비록 함수에 대한 설명은 없지만...  콜백에 대해서 더 공부를 하여 무슨 원리로 구동되는지


꼭 공부를 해서 다시 포스팅 해보도록 하겠습니다!


저와 같은 학생들에게 조금이나마 도움이 되었으면 좋겠습니다.



이상 카카오 로그인 포스팅을 끝내겠습니다.


감사합니다!



안녕하세요! 


어제에 이어서 오늘도 달려보겠습니다.


먼저 카카오SDK의 샘플 앱을 보겠습니다.


















안을 살펴보면 OnCreate 안에


1
2
callback = new SessionCallback();
Session.getCurrentSession().addCallback(callback);
cs


이 두가지 매우 중요한 함수들이 있습니다. 이 콜백을 꼭 선언해주어야 합니다.





저는 다음과 같이 LoginActivity 에서 MainActivity로 넘어가도록 구현해 보겠습니다.


LoginActivity의 코드는 다음과 같습니다.  이 코드들은 SampleLoginActivity 에서 얻을 수 있습니다.

package com.example.hp.ee;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

import com.kakao.auth.ISessionCallback;
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();
}

}


현재 구현중이신 LoginActivity 화면에 다음과 같은 코드를 넣어주시면 됩니다!


 

다음으로 kakaoSignupActivity를 보겠습니다.


다음과 같이 Activity를 만들어줍니다.


package com.example.hp.ee;

/**
* Created by hp on 2016-01-26.
*/

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

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 형태로 반환
Logger.d("UserProfile : " + userProfile);
redirectMainActivity(); // 로그인 성공시 MainActivity
}
});
}

private void redirectMainActivity() {
startActivity(new Intent(this, MainActivity.class));
finish();
}
protected void redirectLoginActivity() {
final Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
finish();
}

}
 


다음으로 로그인 버튼을 만들어보겠습니다!


activity_login.xml 파일에 다음과 같은 코드를 추가합니다.


<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"/>




그럼 다음과 같은 친숙한 카카오 로그인 버튼을 볼 수 있습니다.


다음으로는 로그인을 위한 카카오 SDK 와 GlobalApplication 을 구현해보도록 하겠습니다!

안녕하세요! 


오늘은 제가 인턴을 하면서 삽질하며 구현한 ' 카카오톡 로그인 연동 '을 포스팅 해보겠습니다.


카카오 로그인은 https://developer.kakao.com/docs/android 

에 자세히 설명되어 있지만 안드로이드를 처음 만져봤던 저는 봐도 이해를 잘 하지 못했었습니다.


인터넷에서도 고수분들이 포스팅해서 다 알 수 없는 내용뿐들이었어요....



그래서 안드로이드를 처음 시작하는 초보자의 관점에서 이 글을 써보겠습니다!



저는 카카오 로그인 연동을 거의 샘플앱을 복붙해서 구현하였습니다.(ㅋㅋㅋ....)




먼저 안드로이드 스튜디오에 gradle을 이용해 kakao sdk를 추가해보겠습니다!


저는 http://shindowjy.tistory.com/148  

이 블로그를 참조했습니다.




 


build.gradle(Project: ) 에 다음과 같은 코드를 추가해줍니다.


1
2
3
4
5
6
7
allprojects { 
   repositories {    
     jcenter()       
     mavenCentral()       
   }
}
cs


gradle.properties에 다음과 같은 코드를 추가해줍니다.


KAKAO_SDK_GROUP=com.kakao.sdk

KAKAO_SDK_VERSION=1.1.7


버전에는 가장 최신버전의 sdk를 적어줍니다.


build.gladle(Module: )에 다음과 같은 코드를 추가해줍니다.

1
2
3
4
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile group: project.KAKAO_SDK_GROUP, name: 'usermgmt', version: project.KAKAO_SDK_VERSION
}
cs


3번째 줄에 name : 에는 원하는 모듈을 선택적으로 쓸 수 있습니다.


저는 로그인 기능을 구현하므로 usermgmt를 사용하였습니다.



다음으로 AndroidManifest.xml에 카카오 앱 키를 추가합니다.


1
2
<meta-data android:name="com.kakao.sdk.AppKey"    
android:value=" ~~~ " />
cs


앱 키를 받는 방법은 카카오 개발 가이드에 자세하게 나와있으므로 생략하겠습니다.


해시키를 구하는게 조금 귀찮을 수 있는데  가이드에 나온 방법을 사용하려면 open ssl 을 설치하여


환경변수를 설정해준 뒤 cmd에 명령어를 치면 해시키를 얻을 수 있습니다.




이로써 카카오 로그인 연동을 위한 모든 준비를 마쳤습니다!


다음 포스팅에서는 로그인 버튼을 만들고 세션을 얻어오는 방법에 대해 알아보겠습니다.


감사합니다!


+ Recent posts