首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带登录和注销的Android ParseFacebookUtils流

带登录和注销的Android ParseFacebookUtils流
EN

Stack Overflow用户
提问于 2014-07-08 00:31:47
回答 1查看 2.1K关注 0票数 2

我使用ParseFacebookUtils在我的安卓应用程序中实现了Parse & Facebook。

TL;博士

  1. 使用Facebook (ParseFacebookUtils.logIn)登录(并链接)后创建一个分析用户
  2. 注销(ParseFacebookUtils.logOut & ParseUser.logOut)
  3. 再次登录Facebook将创建一个新的Parse用户,而不是旧的用户。

更长版本的:登录流起作用-- ParseFacebookUtils.logIn调用启动Facebook对话框,并在接受新的Parse用户后被创建并链接到用户的Facebook帐户。

这些问题是在注销(ParseFacebookUtils.logOut和ParseUser.logOut)并试图重新登录到同一个Parse用户之后出现的。Facebook对话框会简短地显示出来,然后我将被重定向到应用程序(因为它已经为Facebook用户授权了),但似乎正在创建一个新的Parse用户,而不是为相关的Facebook用户找到上一个应用程序。

问题:有什么方法可以启用这样的流吗?我必须手动获得已经创建的用户吗?

所有登录逻辑驻留在其中的MainActivity,的代码:

代码语言:javascript
复制
public class MainActivity extends Activity {

  private ProgressBar progressBar;
  private Button loginButton;

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

    progressBar = (ProgressBar) findViewById(R.id.splash_loading_spinner);
    loginButton = (Button) findViewById(R.id.splash_facebook_login);
    loginButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        onLoginButtonClicked();
      }
    });

    ParseAnalytics.trackAppOpened(getIntent());

    // Check if there is a currently logged in user
    // and they are linked to a Facebook account.
    ParseUser currentUser = ParseUser.getCurrentUser();
    if ((currentUser != null) && ParseFacebookUtils.isLinked(currentUser)) {
      // load data from Parse user and launch the next activity immediately
      retrieveData();
    } else {
      failedLoggingIn();
    }
  }

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    ParseFacebookUtils.getSession().onActivityResult(this, requestCode, resultCode, data);
  }

  // this method will link the current ParseUser to the used Facebook account if needed
  private boolean linkFacebookUser() {
    ParseUser user = ParseUser.getCurrentUser();

    // save fb_id and email to the parse user
    Request.newMeRequest(ParseFacebookUtils.getSession(), new Request.GraphUserCallback() {
      @Override
      public void onCompleted(GraphUser fbUser, Response response) {
        if (fbUser == null) {
          Log.e("Facebook Me Request", "Failed fetching user Facebook Graph object.");
        } else {
          Log.d("Facebook Me Request", "Received Facebook graph object for "+fbUser.getId()+"("+fbUser.getProperty("email").toString()+")");

          ParseUser.getCurrentUser().put("fb_id", fbUser.getId());
          ParseUser.getCurrentUser().setEmail(fbUser.getProperty("email").toString());
          ParseUser.getCurrentUser().setUsername(fbUser.getProperty("email").toString());
          ParseUser.getCurrentUser().setPassword(UUID.randomUUID().toString());
          ParseUser.getCurrentUser().signUpInBackground(new SignUpCallback() {
            @Override
            public void done(ParseException e) {
              if (e == null) {
                Log.d("Parse signup user", "Successfully saved a new Parse-Facebook user!");
                retrieveData();
              } else {
                Log.e("Parse signup user", "FAILED saving a new Parse-Facebook user. Error: " + e.getMessage());
                e.printStackTrace();
              }
            }
          });
        }
      }
    }).executeAsync();

    return true;
  }

  private void retrieveData() {
    // fetch data needed to show movie recommendations
    Log.d("Parse Facebook Login Info", "fb_id=" + ParseUser.getCurrentUser().get("fb_id"));

    startActivity(new Intent(this, BrowseMoviesActivity.class));
    finish();
  }

  private void failedLoggingIn() {
    ParseUser.logOut();
    progressBar.setVisibility(View.GONE);
    loginButton.setVisibility(View.VISIBLE);
  }

  private void onLoginButtonClicked() {
    Log.d("UI", "Clicked the Facebook login button");
    progressBar.setVisibility(View.VISIBLE);
    loginButton.setVisibility(View.GONE);

    List<String> permissions = Arrays.asList(
      "public_profile",
      "user_friends",
      "user_actions.video",
      ParseFacebookUtils.Permissions.User.EMAIL,
      ParseFacebookUtils.Permissions.User.ABOUT_ME,
      ParseFacebookUtils.Permissions.User.RELATIONSHIPS,
      ParseFacebookUtils.Permissions.User.BIRTHDAY,
      ParseFacebookUtils.Permissions.User.LOCATION
    );

    ParseFacebookUtils.logIn(permissions, this, new LogInCallback() {
      @Override
      public void done(ParseUser user, ParseException err) {
        MainActivity.this.progressBar.setVisibility(View.GONE);
        if (user == null) {
          Log.d("ParseFacebookLogin", "Uh oh. The user cancelled the Facebook login.");
          if (err != null) {
            Log.d("ParseFacebookLogin",  "Error: " + err.getLocalizedMessage());
          }

          failedLoggingIn();
        } else if (user.isNew()) {
          Log.d("ParseFacebookLogin", "User signed up and logged in through Facebook!");
          // we should probably use this scenario to set fb id to the Parse user
          linkFacebookUser();
        } else {
          Log.d("ParseFacebookLogin", "User logged in through Facebook!");
          if (user.get("fb_id") == null) {
            linkFacebookUser();
          } else {
            retrieveData();
          }
        }
      }
    });
  }
}
EN

回答 1

Stack Overflow用户

发布于 2015-01-12 09:59:24

我也有同样的问题。实际上,它是parse中的一个bug,只要安装最新的(在编写本文时为1.8.1),这个问题就得到了解决,而且没有更改我的任何代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24621998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档