FB チュートリアルを順を追って実行しましたが、なぜこれが機能しないのかわかりません。
すべてのフラグメントはBaseFragmentから継承します:
public class BaseFragment extends SherlockFragment {
...
protected UiLifecycleHelper _uiHelper;
protected boolean _isResumed = false;
protected static final List<String> PERMISSIONS = Arrays.asList("publish_actions");
protected static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization";
protected boolean _pendingPublishReauthorization = false;
protected Session.StatusCallback _callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
onSessionStateChange(session, state, exception);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_uiHelper = new UiLifecycleHelper(getSherlockActivity(), _callback);
_uiHelper.onCreate(savedInstanceState);
}
protected void onSessionStateChange(Session session, SessionState state, Exception exception) {}
...(all lifecycle stuff)
}
次に、ログイン/ログアウトボタンを含むFacebookLoginFragmentがあります。
public class FacebookLoginFragment extends BaseFragment {
protected LoginButton _authButton;
protected ProgressBar _loadingBar;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.facebook_login, container, false);
_loadingBar = (ProgressBar) view.findViewById(R.id.login_progressBar);
_authButton = (LoginButton) view.findViewById(R.id.authFacebookButton);
_authButton.setFragment(this);
_authButton.setReadPermissions(Arrays.asList("email", "user_birthday"));
return view;
}
@Override
protected void onSessionStateChange(Session session, SessionState state, Exception exception) {
super.onSessionStateChange(session, state, exception);
// LogIn process
}
...
}
最後に、フィードのlistViewを含む NewsFragment があります。各フィードは共有可能です。フィードの共有ボタンをクリックすると、アダプターはNewsFragment.publishFeed(feed)メソッドを呼び出します。
public class NewsFragment extends BaseFragment{
...
protected Feed _feedPendingPublish;
@Override
// => NEVER CALLED
protected void onSessionStateChange(Session session, SessionState state, Exception exception) {
super.onSessionStateChange(session, state, exception);
if (_isResumed) {
if (_pendingPublishReauthorization && state.equals(SessionState.OPENED_TOKEN_UPDATED)) {
_pendingPublishReauthorization = false;
if(_feedPendingPublish != null){
publishFeed(_feedPendingPublish);
_feedPendingPublish = null;
}
}
}
}
public void publishFeed(Feed feed){
if(_pendingPublishReauthorization){
return;
}
Session session = Session.getActiveSession();
if (session != null){
// If permission doesn't exist, ask and return. Otherwise, send request
List<String> permissions = session.getPermissions();
if (!isSubsetOf(PERMISSIONS, permissions)) {
_pendingPublishReauthorization = true;
_feedPendingPublish = feed;
Session.NewPermissionsRequest newPermissionsRequest = new Session
.NewPermissionsRequest(getSherlockActivity(), PERMISSIONS);
session.requestNewPublishPermissions(newPermissionsRequest);
return;
}
// DO stuff
}
}
}
問題は、公開承認後に NewsFragment コールバックが呼び出されないことです。(BaseFragment でも FacebookLogin でもありません)。両方のフラグメントが同じアクティビティに存在することに注意してください。
私はfacebook-android-sdk-3.5.2を使用しています