簡體   English   中英

Android和Facebook SDK:無需登錄按鈕即可獲取用戶數據

[英]Android & Facebook SDK: Obtain user data without Login Button

我迷失了嘗試將Facebook與應用程序集成的想法。 首先,Fb的SDK非常糟糕,自從我加入它以來,一切都崩潰了。 無論如何,我試圖從Facebook獲取用戶數據,只是他/她的姓名,用戶ID和電子郵件; 但是,我不能使用登錄按鈕,因為它不支持嵌套片段,並且使用UiLifecycleHelper來保持會話打開狀態並繼續執行我只想調用一次的回調。

我不需要打開會話; 我會在用戶首次使用該應用程序時偶爾散開會話,如果他/她想發布某些內容(非常罕見)。

到目前為止,我已經嘗試使用“登錄”按鈕,執行一個簡單的“請求”並將兩者結合。 但是,似乎SDK整體上不能與Nested Fragment配合使用。

這是我做此工作的最后一次嘗試(這兩個方法都在Fragment中。一旦按下按鈕,就會執行performFacebookLogin):

public void performFacebookLogin() {
    Session.openActiveSession(getActivity(), true, Arrays.asList("email"), new Session.StatusCallback() {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
            if (session.isOpened()) {
                Log.d("FACEBOOK", "Session has been opened");
                Request.newMeRequest(session, new Request.GraphUserCallback() {
                    @Override
                    public void onCompleted(GraphUser user, Response response) {
                        Log.d("FACEBOOK", "onCompleted");
                        if (user != null) {
                            Log.d("DBG", buildUserInfoDisplay(user));
                        }
                    }
                }).executeAsync();
            }else{
                //TODO: ERROR
                Log.e("FACEBOOK", "Session could not be opened");
            }
        }
    });
}

private String buildUserInfoDisplay(GraphUser user) {
    StringBuilder userInfo = new StringBuilder("");

    userInfo.append(String.format("Name: %s\n\n",
            user.getName()));

    userInfo.append(String.format("Email: %s\n\n",
            user.getProperty("email")));

    userInfo.append(String.format("ID: %s\n\n",
            user.getId()));

    return userInfo.toString();
}

那么,會發生什么呢? 顯示對話框提示,以便使用您的Facebook帳戶登錄。 但是,一旦您按登錄並對話框消失,則什么也不會發生。 LogCat中未顯示任何內容。 我認為onActivityResult方法存在問題,因為從未執行過回調。 我嘗試重新添加UiLifecycleHelper,但最終對回調進行了不必要的調用(我只想調用此方法一次)。

沒錯,您需要將結果傳遞到活動會話中才能激活回調。 在您的活動onActivityForResult方法中,調用活動會話onActivityResult,類似於: https : //github.com/facebook/facebook-android-sdk/blob/master/facebook/src/com/facebook/UiLifecycleHelper.java#L156- 159

    Session session = Session.getActiveSession();
    if (session != null) {
        session.onActivityResult(activity, requestCode, resultCode, data);
    }

這樣可以使您的回調工作。

因此,我設法實現了解決問題的模塊化方法:我創建了一個活動,該活動封裝了與Facebook SDK的連接,並通過onActivityResult返回。 不幸的是,我還沒有找到一種將結果直接返回到嵌套片段的方法。 另外,您可以使活動透明以避免黑屏,並在需要時添加更多權限。 另外,如果要保持會話活動,則可以刪除onStop方法。 這是代碼:

public class FacebookAccessActivity extends ActionBarActivity {
public static final String PARAM_PROFILE = "public_profile";
public static final String PARAM_EMAIL = "email";
public static final String PARAM_FIRSTNAME = "fname";
public static final String PARAM_LASTNAME = "lname";
public static final String PARAM_GENDER = "gender";
public static final String PARAM_BDAY = "user_birthday";
public static final String PARAM_ID = "id";

private static Session session = null;
private List<String> permissions = Arrays.asList(PARAM_EMAIL, PARAM_PROFILE, PARAM_BDAY);

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getSupportActionBar().hide();
    setContentView(R.layout.view_empty);

    session = Session.getActiveSession();

    if (session != null)
        session.closeAndClearTokenInformation();

    Session.openActiveSession(this, true, permissions, new Session.StatusCallback() {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
            if (exception != null || state == SessionState.CLOSED_LOGIN_FAILED) {
                exception.printStackTrace();
                setResult(RESULT_CANCELED);
                finish();
            } else if (session.isOpened()) {
                Request.newMeRequest(session, new Request.GraphUserCallback() {
                    @Override
                    public void onCompleted(GraphUser user, Response response) {
                        if (user != null) {
                            Intent i = new Intent();
                            i.putExtra(PARAM_FIRSTNAME, user.getFirstName());
                            i.putExtra(PARAM_LASTNAME, user.getLastName());
                            i.putExtra(PARAM_ID, user.getId());
                            i.putExtra(PARAM_GENDER, (String) user.getProperty(PARAM_GENDER));
                            i.putExtra(PARAM_BDAY, user.getBirthday());

                            for (String s : permissions)
                                i.putExtra(s, (String) user.getProperty(s));
                            setResult(RESULT_OK, i);
                            finish();
                        }
                    }
                }).executeAsync();
            }
        }
    });
}

@Override
protected void onStop() {
    super.onStop();
    if (session != null)
        session.closeAndClearTokenInformation();
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == RESULT_CANCELED ||
            !Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data)) {
        setResult(RESULT_CANCELED);
        finish();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM