2

アプリを介してユーザーを Facebook にサインインする次のコードがあります。初めて user.getproperty("email") を null として取得しています。アプリを 2 回目に実行すると、値が取得されます。以下は私のコードです。

プライベートボイド loginToFb() {

    final Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(
            LandingPageActivity.this, Arrays.asList(
                    "user_location", "user_birthday",
                    "user_likes", "email"));
    Session.openActiveSession(this, true, new Session.StatusCallback() {

        // callback when session changes state
        @Override
        public void call(Session session, SessionState state,
                Exception exception) {
            if (session.isOpened()) {
                session.requestNewReadPermissions(newPermissionsRequest);
                // make request to the /me API
                Request request = Request.newMeRequest(session,
                        new Request.GraphUserCallback() {

                            // callback after Graph API response with user
                            // object
                            @Override
                            public void onCompleted(GraphUser user,
                                    Response response) {
                                if (user != null) {
                                    fetchUserFbDetails(user);
                                }
                            }

                        });
                Request.executeBatchAsync(request);

            }

        }
    });

}
4

3 に答える 3

4

自分でセッションを管理する代わりに、FacebookLoginButtonUiLifecycleHelper.

1) UI で LoginButton を宣言します。

<!-- FACEBOOK LOGIN -->
<com.facebook.widget.LoginButton
    android:id="@+id/facebookLoginBtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true" />


2) を作成LoginFragmentし、プライベート メンバーを宣言します。

private UiLifecycleHelper mFacebookLifecycleHelper;


3) Fragment のonCreate()メソッドで、LoginButton を初期化し、フックを追加してユーザーの情報を取得します。

LoginButton facebookLoginButton = (LoginButton) view.findViewById(R.id.facebookLoginBtn);
facebookLoginButton.setFragment(this);

// Intercept the facebook user returned from login
facebookLoginButton.setUserInfoChangedCallback(new LoginButton.UserInfoChangedCallback() {

    @Override
    public void onUserInfoFetched(GraphUser user) {
        mFacebookUser = user;

        if (user != null) {
            LogUtils.LOGFB(TAG, "Got a Facebook user: " + user.getFirstName() +
                    " " + user.getLastName() + ", email: " + user.getProperty("email"));
        }
        else {
            LogUtils.LOGFB(TAG, "No Facebook user");
        }
    }
});

// Set extra read permissions
facebookLoginButton.setReadPermissions(Arrays.asList(
        "email", "user_birthday", ...));


4) Facebook セッション状態の変更をリッスンするコールバックを作成します。

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


// Respond to Facebook session state changes
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
    if (state.isOpened()) {
        LogUtils.LOGFB(TAG, "Logged in using facebook");
        LogUtils.LOGFB(TAG, "Access Token: " + session.getAccessToken());
        // TODO: display authenticated UI
    } else if (state.isClosed()) {
        LogUtils.LOGFB(TAG, "Logged out from facebook");
        // TODO: display the non-authenticated UI
    }
}


5) 次に、フラグメントのすべてのライフサイクル変更に対して lifecycleHelper を呼び出していることを確認します。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Creates the Facebook session and opens it automatically if a cached token is available.
    mFacebookLifecycleHelper = new UiLifecycleHelper(getActivity(), callback);
    mFacebookLifecycleHelper.onCreate(savedInstanceState);
    ...
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    mFacebookLifecycleHelper.onActivityResult(requestCode, resultCode, data);
}

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

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

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    mFacebookLifecycleHelper.onSaveInstanceState(outState);
}
于 2014-01-03T20:17:10.323 に答える
3

問題は、ステータス コールバック内で新しいアクセス許可を要求しているが、新しいアクセス許可の要求が完了する前にすぐに meRequest を作成していることです (すべてのアクセス許可とセッション オープン要求は非同期です)。

読み取り権限のみを要求しているため、個別に権限要求を行う必要はなく、すべてを一度に行うことができます。何かのようなもの:

Session.OpenRequest openRequest = new Session.OpenRequest(LandingPageActivity.this);
openRequest.setPermissions(Arrays.asList...);
openRequest.setCallback(new Session.StatusCallback() {
    // callback when session changes state
    @Override
    public void call(Session session, SessionState state,
            Exception exception) {
        if (session.isOpened()) {
            // make request to the /me API
            Request request = Request.newMeRequest(session,
                    new Request.GraphUserCallback() {

                        // callback after Graph API response with user
                        // object
                        @Override
                        public void onCompleted(GraphUser user,
                                Response response) {
                            if (user != null) {
                                fetchUserFbDetails(user);
                            }
                        }

                    });
            request.executeAsync();

        }
});
Session session = new Session(LandingPageActivity.this);
Session.setActiveSession(session);
session.openForRead(openRequest);
于 2013-11-06T00:36:08.330 に答える
-1

このコードを試してください。

      String  email = user.getProperty("email").toString();
      String  safeEmail = user.asMap().get("email").toString();
于 2013-11-05T20:03:43.730 に答える