2013-12-09 32 views
3

我正在寫一個登錄片段,主持Facebook和Google+登錄。該片段是三個片段的父片段,用戶內容在成功登錄後使用視圖尋呼機調用。我正在存儲電子郵件和服務名稱在共享首選項時從Google或Facebook中檢索,然後如果成功,視圖尋呼機將與用戶片段一起顯示。 Facebook登錄工作正常,但是當我啓動Google+登錄時,它無法訪問onConnected回調方法。當我切換到其他選項卡並返回登錄片段時,它會以某種方式觸發並獲取用戶片段。如何在按下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?

回答

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

你應該所有需要的檢查後,叫mPlusClient.connect();在LoginFragment onActivityResult。

+0

仍然無法連接 –