我正在写一个托管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?
答案 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();
。