티스토리 뷰

android kakaoLogin((카카오 로그인) 2편


안녕하세요!! 어제에 이어서 오늘마저 카카오 로그인을 포스팅 하겠습니다!! 


만약 1편을 안보신 분이계시다면!!


꼭 보고 와주세요 !!!


카카오 로그인 1편


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

어제에 이어서 마저시작하겠습니다.


어제 마지막으로, Manifest 를 추가하고 끝낫습니다. Manifest 의 전체적 코드는 


<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=".MainActivity">
<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" />

</application>

위의 코드와 같겟죠??? 헌데 지금은 

android:name=".GlobalApplication"

이부분에서 오류가 생기실거에요~ 왜냐하면 추가를 안했기 때문인데요~ 마저 추가하도록합시다!!


위의 두개의 클래스를 생성할것입니다.

1. KakaoSDKAdapter 를 만들어줍시다.


package 본인의 패키지명.;

import android.content.Context;
import com.kakao.auth.*;

/**
* Created by Junho on 2017-04-07.
*/

public class KakaoSDKAdapter extends KakaoAdapter {

/**
* 로그인을 위해 Session을 생성하기 위해 필요한 옵션을 얻기위한 abstract class.
* 기본 설정은 KakaoAdapter에 정의되어있으며, 설정 변경이 필요한 경우 상속해서 사용할 수 있다.
*/
@Override
public ISessionConfig getSessionConfig() {
return new ISessionConfig() {
@Override
public AuthType[] getAuthTypes() {
return new AuthType[] {AuthType.KAKAO_TALK}; //여기서타입을 변경가능합니다~
}
// 로그인시 인증받을 타입을 지정한다. 지정하지 않을 시 가능한 모든 옵션이 지정된다.

//1.KAKAO_TALK : kakaotalk으로 login을 하고 싶을때 지정.
//2.KAKAO_STORY : kakaostory으로 login을 하고 싶을때 지정.
//3.KAKAO_ACCOUNT : 웹뷰 Dialog를 통해 카카오 계정연결을 제공하고 싶을경우 지정.
//4.KAKAO_TALK_EXCLUDE_NATIVE_LOGIN : 카카오톡으로만 로그인을 유도하고 싶으면서 계정이 없을때 계정생성을 위한
//버튼도 같이 제공을 하고 싶다면 지정.KAKAO_TALK과 중복 지정불가.
//5.KAKAO_LOGIN_ALL : 모든 로그인방식을 사용하고 싶을때 지정.

@Override
public boolean isUsingWebviewTimer() {
return false;
}

@Override
public boolean isSecureMode() {
return false;
}
// SDK 로그인시 사용되는 WebView에서 pause와 resume시에 Timer를 설정하여 CPU소모를 절약한다.
// true 를 리턴할경우 webview로그인을 사용하는 화면서 모든 webview에 onPause와 onResume
// 시에 Timer를 설정해 주어야 한다. 지정하지 않을 시 false로 설정된다.

@Override
public ApprovalType getApprovalType() {
return ApprovalType.INDIVIDUAL;
}
//일반 사용자가 아닌 Kakao와 제휴된 앱에서 사용되는 값으로, 값을 채워주지 않을경우 ApprovalType.INDIVIDUAL 값을 사용하게 된다.

@Override
public boolean isSaveFormData() {
return true;
}
// Kakao SDK 에서 사용되는 WebView에서 email 입력폼에서 data를 save할지여부를 결정한다. Default true.
};
}

//Application이 가지고있는 정보를 얻기위한 interface.
@Override
public IApplicationConfig getApplicationConfig() {
return new IApplicationConfig() {

// 현재 최상단에 위치하고 있는 Activity. topActivity가 아니거나 ApplicationContext를 넣는다면
// SDK내에서의 Dialog Popup등이 동작하지 않을 수 있습니다.


@Override
public Context getApplicationContext() {
return GlobalApplication.getGlobalApplicationContext();
}
};
}
}


2. GlobalApplication 을 만들어줍시다.


package 본인의 패키지명;

import android.app.Activity;
import android.app.Application;

import com.kakao.auth.KakaoSDK;

/**
* Created by Junho on 2017-04-07.
*/

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


여기 까지하셨다면 기본적인 세팅이 끝난겁니다... 메인코드는 나오지두 않았네용...


1. 카카오 로그인버튼을 보여줄 xml 폴더에서 

<com.kakao.usermgmt.LoginButton
android:id="@+id/btn_kakao"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

카카오 로그인버튼을 달아줍시다.


2. 카카오 로그인에 필요한 코드만 적도록하겠습니다!!

먼저 콜백함수를 만들어줘야합니다~

2-1 콜백함수

private class SessionCallback implements ISessionCallback {
@Override
public void onSessionOpened() {

KakaorequestMe();
}

@Override
public void onSessionOpenFailed(KakaoException exception) {
if (exception != null) {
Log.d("ErrorSession", exception.getMessage());
}
}
}



2-2 KakaorequestMe(); 함수

public void KakaorequestMe() {


UserManagement.requestMe(new MeResponseCallback() {

@Override
public void onFailure(ErrorResult errorResult) {
Log.d("Error", "오류로 카카오로그인 실패 ");
}
@Override
public void onSessionClosed(ErrorResult errorResult) {
Log.d("Error", "오류로 카카오로그인 실패 ");
}
@Override
public void onNotSignedUp() {
}
@Override
public void onSuccess(UserProfile userProfile) {
//로그인에 성공하면 로그인한 사용자의 일련번호, 닉네임, 이미지url등을 리턴합니다.
//사용자 ID는 보안상의 문제로 제공하지 않고 일련번호는 제공합니다.


//이곳에서 로그인이 완료될시 실행시킬 동작을 추가시켜주시면 됩니다 ~

Log.e("UserProfile", userProfile.toString());

}
});
}


2-3 이제 카카오 로그인을 해봅시다!


public class MainActivity extends AppCompatActivity {

private com.kakao.usermgmt.LoginButton btnKakao;
private SessionCallback callback; //위의 콜백함수를 만들어주셔야 사용가능합니다. 위의 함수를 만들어주세요~~


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);


callback = new SessionCallback(); //세션콜백을 부르고
Session.getCurrentSession().addCallback(callback); // 추가시키면 끝입니다!!



btnKakao = (com.kakao.usermgmt.LoginButton) findViewById(R.id.btn_kakao);


//com.kakao.auth.Session.getCurrentSession().checkAndImplicitOpen();

//한번이라도 로그인한 기록이있다면 위의함수에서 알아서 재로그인을 해줄것이다~

}

이후 카카오톡로그인을하면.. 알아서 로그인이 잘됩니다 : )


여기서 제가 겪은 오류를 말씀드리겠습니다.


1. 카카오톡로그인 버튼에 OnClickListener추가.


기본지원하는 카카오톡 로그인에 onClick을 사용하셔두 구현한 행동이 진행되지않습니다.


이유는 로그인버튼의 클래스를 확인해봐야겠죠???


KakaoLoginButton class

@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
inflate(getContext(), R.layout.kakao_login_layout, this);
setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
// 카톡 또는 카스가 존재하면 옵션을 보여주고, 존재하지 않으면 바로 직접 로그인창.
final List<AuthType> authTypes = getAuthTypes();
if(authTypes.size() == 1){
Session.getCurrentSession().open(authTypes.get(0), (Activity) getContext());
} else {
onClickLoginButton(authTypes);
}
}
});
}

위의함수가 존재하기떄문에... 제코드는 먹통이되고 궁금하여서 질문을 했습니다.


카카오 개발자(kevin.kang)님께서 이런답변을 달아주셨습니다.


아마 액티비티의 onCreate에서 setOnClickListener를 설정하시면 동작이 안될거에요. 지금 현재 LoginButton의 OnClickListener는 onAttachedToWindow라는 메소드 안에서 불리고 있어요. 액티비티와 그 안의 뷰의 lifecycle을 보시면 onCreate()이 로그인 버튼의 onAttachedToWindow 보다 먼저 불리게 되죠~ 그렇기 때문에 onCreate에서 setOnClickListener를 부르셔도 안에 내용은 무시가 될겁니다. 그렇기 때문에 OnClickListener를 다르게 사용하실려면 onAttachedToWindow 메소드가 불린 후에 원하시는 코드를 호출하시던지 아니면 LoginButton을 사용하지 않고 독자적인 버튼을 사용하셔야 할 것 같아요. 


결론은!!!! 제가 onCreate 에서 onClick을 달아도 그이후에 onAttached 가 불려지기떄문에 onClick이 무시가되는거죠....ㅠㅠ 

저는 그런줄도모르고 onClick시 세션을달려고하니 로그인이 안되는 경우가 생기드라구요...ㅠㅠ


이글을 보시는분들은 그런오류를 안겪으시면 좋겟네용 ㅎㅎㅎ



2. 위에서 Session.getCurrentSession().checkAndImplicitOpen(); 


위의 함수를 사용한게있습니다.


/**
* Session 의 상태를 체크후 Login을 시도한다.
* 요청에 대한 결과는 {@link KakaoAdapter}의 {@link ISessionCallback}으로 전달이 된다.
*/
public boolean checkAndImplicitOpen() {
if (isClosed() || implicitOpen() == false) {
return false;
}

return true;
}

저는 여기서 boolean 이길래.. 세션체크를 해주는구나 하고.. 그함수뒤의 제가하고싶은 동작을 추가하였죠..


문제는 제가 한글을 제대로안읽었나봐요.....하하..... 


주석부분에.. 세션체크후 로그인을 시도 한다라는 말이있는데 저는 그것도모르고 액티비티가 두번띄어지는 황당한 경험을하여서 


저와같이 멍청한짓을 하지않기 바랍니다.. 글을역시 끝까지 읽어야합니당ㅎㅎㅎㅎ



이만.. 카카오톡 로그인에대한 포스팅을 마치겠습니다 :)


읽어주셔서 감사합니다! 또한 궁금한점이 있을시에는 제가 아는선에서 최대한 답변해드리겠습니다~!

Recent Comments