[英]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.