Fragment에서 카카오 로그인시 반응이 없는 오류

안녕하세요.
기존에 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) {  
                // 로그인 성공되었으므로 후속 처리
            }
        });
    }
}

답변 부탁드립니다~
감사합니다.

안녕하세요 답변이 조금 늦어서 죄송합니다^^ 지금 말씀해주신 상황은 onActivityResult를 Fragment에 구현하여서 발생한 상황 같아요. 로그인 버튼은 내부적으로 그 로그인 버튼의 액티비티를 사용하여 startActivityForResult. 그렇게 때문에 이 액티비티에 onActivityResult를 구현해주셔야 해요~ Session.handleActivityResult를 fragment의 onActivityResult에 넣으셨는데 실제로는 전혀 override되어 있지 않은 onActivityResult가 불리기 때문에 반응이 없는 것 같아요! 조만간 프래그먼트와도 번거롭지 않고 자연스럽게 연동이 되도록 로그인 버튼을 개선할 예정입니다. 조금만 기다려주세요!

아직 해결 못 하셨다거나 위의 방법으로 해결이 되지 않는다면 댓글 남겨주세요 :slight_smile:

안녕하세요.
Fragment 을 사용하는 예제는 없나요 ?
답변 부탁 드립니다. 수고하세요…