안녕하세요.
기존에 activity에서는 카카오 로그인 연동 작업이 잘 끝났는데,
이번에 다른 프로젝트에서 fragment 에서 연동하려니 원활히 진행이 되지 않아 문의 드립니다.
일단, [사용자 관리] [로그인] 카카오 로그인이 진행되지 않습니다 이 글과 증상이 100% 동일합니다.
최초에는 onSessionOpened() / onSessionOpenFailed() 어떤 것도 호출이 되지 않았는데,
fragment가 올려져있는 MainActivity 에서
Global Application 의 setCurrentActivity 를 호출하니 그 문제는 해결되었습니다.
public static void setCurrentActivity(Activity currentActivity) {
GlobalApplication.currentActivity = currentActivity;
}
그랬더니 위에 링크한 글의 시나리오 A / B가 모두 나타납니다.
“다른 카카오계정으로 로그인” 할 경우, 정상 처리되지만 1회만 되며 (앱을 껐다 다시 실행해야 가능)
“카카오톡으로 간편로그인” 할 경우, 동의 창이 뜨고 그 이후에는 아무런 반응이 없습니다.
링크한 글을 참고하면 handleActivityResult 가 실행되어야 할 것 같은데,
아래 함수가 포함된 onActivityResult 가 어떤 경우에도 호출되지 않습니다.
( “다른 카카오계정으로 로그인” 하여 성공할 때도 호출되지 않음 )
if (getCurrentSession().handleActivityResult(requestCode, resultCode, data)) {
return;
}
카카오 로그인 버튼이 있는 LoginFragment.java 파일에는
이메일 로그인, 페이스북 로그인이 현재 정상 작동 중이며, 카카오톡 로그인을 추가한 상태입니다.
카카오톡 로그인 관련된 부분만 아래 소스 추가합니다.
@SuppressWarnings("deprecation")
public class LoginFragment extends Fragment {
View view;
private SessionCallback callback;
public LoginFragment() {
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_login, container, false);
try {
PackageInfo info = getActivity().getPackageManager().getPackageInfo(
this.getActivity().getPackageName(),
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
}
} catch (PackageManager.NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
// 테스트 단계라서 그런지, 강제 로그아웃을 시키지 않으면 로그인 버튼 클릭시 어떤 반응도 없음
UserManagement.requestLogout(new LogoutResponseCallback() {
@Override
public void onCompleteLogout() {
}
});
callback = new SessionCallback();
getCurrentSession().addCallback(callback);
getCurrentSession().checkAndImplicitOpen();
return view;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (getCurrentSession().handleActivityResult(requestCode, resultCode, data)) {
return;
}
super.onActivityResult(requestCode, resultCode, data);
// 이하 페이스북 로그인 관련
callbackManager.onActivityResult(requestCode, resultCode, data);
if (requestCode == 100) {
if (resultCode > 0) {
FragmentTransaction trans = getFragmentManager().beginTransaction();
trans.add(R.id.root_frame, new MypageFragment());
trans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
trans.addToBackStack(null);
trans.commit();
((MainActivity) getActivity()).changePage(1);
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
getCurrentSession().removeCallback(callback);
}
private class SessionCallback implements ISessionCallback {
@Override
public void onSessionOpened() {
redirectSignupActivity();
}
@Override
public void onSessionOpenFailed(KakaoException exception) {
if (exception != null) {
Logger.e(exception);
}
}
}
protected void redirectSignupActivity() {
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());
}
@Override
public void onSessionClosed(ErrorResult errorResult) {
}
@Override
public void onNotSignedUp() {
}
@Override
public void onSuccess(UserProfile userProfile) {
// 로그인 성공되었으므로 후속 처리
}
});
}
}
답변 부탁드립니다~
감사합니다.