Google+登录onConnected未调用

时间:2013-12-09 12:29:28

标签: android android-fragments google-plus

我正在写一个托管Facebook和Google+登录的登录片段。片段是三个片段的父片段,用户内容在成功登录后使用视图寻呼机调用。我将电子邮件和服务名称存储在共享中从Google或Facebook检索时的首选项,然后如果成功,则会显示包含用户片段的查看分页器。 Facebook登录工作正常,但是当我启动Google+登录时,它无法进入onConnected回调方法。当我切换到其他选项卡并返回登录片段时,它会以某种方式触发,我会收到用户片段。如何在按下Google+登录按钮时触发onConnected方法?

确保调用onActivityResult我在主要活动中添加了这个

MainActivity.java

@Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
    // TODO Auto-generated method stub
    super.onActivityResult(arg0, arg1, arg2);
     LoginFragment lf = (LoginFragment)getSupportFragmentManager().findFragmentByTag("Login");
    if (lf != null) {
        lf.onActivityResult(arg0, arg1, arg2);
    }

}

LoginFragment.java

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);

    // Session class instance
    mSession = new SessionManager(getActivity());

    setupGoogleplus();
    loginButton = (SignInButton) getActivity().findViewById(R.id.sign_in_button);
    loginButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (!mPlusClient.isConnected()) {
                if (mConnectionResult == null) {
                    mConnectionProgressDialog.show();
                } else {
                    try {
                        mConnectionResult.startResolutionForResult(getActivity(), REQUEST_CODE_RESOLVE_ERR);
                    } catch (SendIntentException e) {
                        // Try connecting again.
                        mConnectionResult = null;
                        mPlusClient.connect();
                    }
                }
            }
        }
    });

    setupViewPager();

    if (mSession.isLoggedIn()) {
        onLoged();
    }

}


private void setupViewPager() {
    mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getChildFragmentManager());
    mViewPager = (ViewPager) getActivity().findViewById(R.id.pager);

}

private void setupGoogleplus() {
    // google+ part
    mPlusClient = new PlusClient.Builder(getSherlockActivity(), new ConnectionCallbacks() {

        @Override
        public void onConnected(Bundle connectionHint) {
            String accountName = mPlusClient.getAccountName();
            // new
            // DownloadImageTask(userPicture).execute(mPlusClient.getCurrentPerson().getImage().getUrl());
            // Toast.makeText(getActivity(), accountName + " is connected.",
            // Toast.LENGTH_LONG).show();
            mConnectionProgressDialog.dismiss();
            mSession.createLoginSession(mPlusClient.getCurrentPerson().getName().getGivenName().toString(), mPlusClient.getAccountName(), "Google+");
        }

        @Override
        public void onDisconnected() {
            Log.d(TAG, "disconnected");
        }
    }, new OnConnectionFailedListener() {

        @Override
        public void onConnectionFailed(ConnectionResult result) {
            if (mConnectionProgressDialog.isShowing()) {
                // The user clicked the sign-in button already. Start to
                // resolve
                // connection errors. Wait until onConnected() to dismiss
                // the
                // connection dialog.
                if (result.hasResolution()) {
                    try {
                        result.startResolutionForResult(getActivity(), REQUEST_CODE_RESOLVE_ERR);
                    } catch (SendIntentException e) {
                        mPlusClient.connect();
                    }
                }
            }
            // Save the result and resolve the connection failure upon a
            // user click.
            mConnectionResult = result;
        }
    }).setActions("http://schemas.google.com/AddActivity", "http://schemas.google.com/BuyActivity").build();
    mConnectionProgressDialog = new ProgressDialog(getActivity());
    mConnectionProgressDialog.setMessage("Signing in...");

}

private void onSessionStateChange(Session session, SessionState state, Exception exception) {
    if (state.isOpened()) {
        Log.i(TAG, "Logged in...");
        // Request user data and show the results
        Request.newMeRequest(session, new Request.GraphUserCallback() {

            // callback after Graph API response with user object
            @Override
            public void onCompleted(GraphUser user, Response response) {
                // TODO Auto-generated method stub
                if (user != null) {
                    // Display the parsed user info
                    // Set the id for the ProfilePictureView
                    // view that in turn displays the profile picture.
                    // profilePictureView.setProfileId(user.getId());
                    // Set the Textview's text to the user's name.
                    mSession.createLoginSession(user.getName(), user.getProperty("email").toString(), "Facebook");
                    onLoged();
                }
            }
        }).executeAsync();
    } else if (state.isClosed()) {
        Log.i(TAG, "Logged out...");
    }
}

private Session.StatusCallback callback = new Session.StatusCallback() {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
        onSessionStateChange(session, state, exception);
    }
};

@Override
public void onActivityResult(int requestCode, int responseCode, Intent intent) {
    if (requestCode == REQUEST_CODE_RESOLVE_ERR) {
        mConnectionResult = null;
        mPlusClient.connect();
    } else {
        uiHelper.onActivityResult(requestCode, responseCode, intent);
    }
    super.onActivityResult(requestCode, responseCode, intent);
}

private static class MyFragmentPagerAdapter extends FragmentPagerAdapter {

    public MyFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int index) {
        switch (index) {
        case 0:
            return new FirstFragment();
        case 1:
            return new SecondFragment();
        case 2:
            return new ThirdFragment();
        }
        return null;

    }

    @Override
    public int getCount() {

        return NUMBER_OF_PAGES;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
        case 0:
            return "1";
        case 1:
            return "2";
        case 2:
            return "3";
        }
        return null;
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.login_fragment, container, false);
    authButton = (LoginButton) view.findViewById(R.id.authButton);
    authButton.setFragment(this);
    authButton.setReadPermissions(Arrays.asList("email"));
    return view;
}

@Override
public void onResume() {
    super.onResume();
    uiHelper.onResume();
}

@Override
public void onPause() {
    super.onPause();
    uiHelper.onPause();
}

@Override
public void onDestroy() {
    super.onDestroy();
    uiHelper.onDestroy();
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    uiHelper.onSaveInstanceState(outState);
}

@Override
public void onStart() {
    mPlusClient.connect();
    super.onStart();
}

@Override
public void onStop() {
    super.onStop();
    mPlusClient.disconnect();
}

public void googleLogout() {

    if (mPlusClient.isConnected()) {
        mPlusClient.clearDefaultAccount();
        mPlusClient.disconnect();
        mPlusClient.connect();
        mSession.logoutUser();
    }
}

public void onLoged() {

    mViewPager.setAdapter(mMyFragmentPagerAdapter);
    mViewPager.setVisibility(View.VISIBLE);
    authButton.setVisibility(View.INVISIBLE);
    loginButton.setVisibility(View.INVISIBLE);

}

public void onNotLoged() {

    mViewPager.setAdapter(null);
    mViewPager.setVisibility(View.INVISIBLE);
    authButton.setVisibility(View.VISIBLE);
    loginButton.setVisibility(View.VISIBLE);

}}

在onConnected方法中,我调用mySession对象创建(共享首选项)来存储数据,并调用onLoged来显示用户片段。为什么我必须切换选项卡几次才能调用onConnected?

1 个答案:

答案 0 :(得分:2)

由于连接失败的解决方案是使用startIntentSenderForResult和代码REQUEST_CODE_RESOLVE_ERR启动的,因此您需要在Activity.onActivityResult中捕获结果。

protected void onActivityResult(int requestCode, int responseCode, Intent intent) {
    if (requestCode == REQUEST_CODE_RESOLVE_ERR && responseCode == RESULT_OK) {
        mConnectionResult = null;
        mPlusClient.connect();
    }
}

所以在你的情况下,你应该在所有需要的检查后在LoginFragment onActivityResult中调用mPlusClient.connect();