Android ParseFacebookUtils 流程与登录和注销

标签 android parse-platform parsefacebookutils

我使用 ParseFacebookUtils 在我的 Android 应用中实现了 Parse & Facebook 流程。

TL;DR

  1. 使用 Facebook 登录(并链接)后创建了 Parse 用户 (解析FacebookUtils.logIn)
  2. 已注销(ParseFacebookUtils.logOut & 解析用户.logOut)
  3. 再次使用 Facebook 登录会创建一个新的 Parse 用户而不是获取旧用户。

较长版本:登录流程有效 - ParseFacebookUtils.logIn 调用启动 Facebook 对话框,接受后创建新的 Parse 用户并将其链接到用户的 Facebook 帐户。

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

问题:有没有办法启用这样的流程?我是否必须手动获取已创建的用户?

我的MainActivity的代码,其中包含所有登录逻辑:

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();
          }
        }
      }
    });
  }
}

最佳答案

我也遇到了同样的问题。实际上,这是 parse sdk 中的一个错误,问题得到了解决,无需更改任何代码,只需安装最新的 parse android sdk(撰写本文时为 1.8.1)即可。

关于Android ParseFacebookUtils 流程与登录和注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24621998/

相关文章:

objective-c - 从 swift 设置在 objective-c 中声明的位掩码枚举

android - 在不同的 ViewFlipper View 上重新计算 ScrollView?

android - 从没有名称的Android嵌套数组JSON中获取数据

c# - 如何在 MonoGame 中租用纹理?

database-design - 使用 Parse 作为 BaaS 高效存储多个图像

ios - 为什么通过保存 PFUser 对象来保存 PFRelation?

android - 新 Activity 的 TabWidget 问题

parse-platform - CocoaPods 存储库上的 "PFFacebookUtils.framework"在哪里?

ios - 解析Facebook logInInBackgroundWithReadPermissions(快速)

Android Facebook 登录在调试中有效,在已发布的应用程序中无效