【问题标题】:Firebase is not saving Facebook user in Auth listFirebase 未在 Auth 列表中保存 Facebook 用户
【发布时间】:2016-12-16 02:24:50
【问题描述】:

我正在为与 Firebase 集成的 Facebook 登录创建单个 Activity。

我已在 Firebase 中激活 Facebook 登录,并在 Facebook 开发者控制台中遵循了所有 firebase 步骤和所有 Facebook 步骤。

我的 Activity 有一个 com.facebook.widget.LoginButton,单击此按钮后会出现 Facebook 登录页面,我可以输入凭据、自动化应用程序和登录。

但是,当我再次进入 App 时,会出现登录按钮,并且 Facebook 登录没有保存(缓存)。

Firebase Auth 用户列表也未保存。

可能出了什么问题。

下面是我的代码。

   @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(getApplicationContext());
    AppEventsLogger.activateApp(this);
    setContentView(R.layout.activity_login);

    mFirebaseUtils = new FirebaseUtils();
    mFirebaseUtils.setFirebase();

    try {
        @SuppressWarnings("rawtypes")
        Class strictModeClass = Class.forName("android.os.StrictMode");
        Class strictModeThreadPolicyClass = Class
                .forName("android.os.StrictMode$ThreadPolicy");
        Object laxPolicy = strictModeThreadPolicyClass.getField("LAX").get(
                null);
        @SuppressWarnings("unchecked")
        Method method_setThreadPolicy = strictModeClass.getMethod(
                "setThreadPolicy", strictModeThreadPolicyClass);
        method_setThreadPolicy.invoke(null, laxPolicy);
    } catch (Exception e) {
    }

    // View Pager
    initData();

    mAuth = mFirebaseUtils.mAuth;
    mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) {
                // User is signed in
                Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
            } else {
                // User is signed out
                Log.d(TAG, "onAuthStateChanged:signed_out");
            }
        }
    };


    mCallbackManager = CallbackManager.Factory.create();
    LoginButton loginButton = (LoginButton) findViewById(R.id.btnLoginFacebook);
    loginButton.setReadPermissions("email", "public_profile");
    loginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            Log.d(TAG, "facebook:onSuccess:" + loginResult);
            handleFacebookAccessToken(loginResult.getAccessToken());

        }

        @Override
        public void onCancel() {
            Log.d(TAG, "facebook:onCancel");


        }

        @Override
        public void onError (FacebookException error){
            Log.d(TAG, "facebook:onError", error);

        }
    });
}


private void handleFacebookAccessToken(AccessToken token) {
    Log.d(TAG, "handleFacebookAccessToken:" + token);
    // [START_EXCLUDE silent]
    //showProgressDialog();
    // [END_EXCLUDE]

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful());

                    // If sign in fails, display a message to the user. If sign in succeeds
                    // the auth state listener will be notified and logic to handle the
                    // signed in user can be handled in the listener.
                    if (!task.isSuccessful()) {
                        Log.w(TAG, "signInWithCredential", task.getException());
                        Toast.makeText(LoginActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                    }

                    // [START_EXCLUDE]
                    //hideProgressDialog();
                    // [END_EXCLUDE]
                }
            });
}


public void signOut() {
    mAuth.signOut();
    LoginManager.getInstance().logOut();
}


public String getAndroidVersion() {
    String release = Build.VERSION.RELEASE;
    int sdkVersion = Build.VERSION.SDK_INT;
    return "Android SDK: " + sdkVersion + " (" + release +")";
}

@Override
public void onStart() {
    super.onStart();
    mAuth.addAuthStateListener(mAuthListener);
    FirebaseUser user = mAuth.getCurrentUser();
}

@Override
public void onStop() {
    super.onStop();
    if (mAuthListener != null) {
        mAuth.removeAuthStateListener(mAuthListener);
    }

}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    mCallbackManager.onActivityResult(requestCode, resultCode, data);
}




@Override
public void onClick(View v) {
    switch (v.getId()) {
        //case R.id.button_facebook_signout:
        //    signOut();
        //    break;
    }
}

【问题讨论】:

    标签: android facebook firebase firebase-authentication


    【解决方案1】:

    不清楚您如何检查用户是否已登录。 recommend method 是使用AuthStateListener。请注意,它不仅会在用户登录或注销时触发,而且会在侦听器注册后立即触发。你有一个,但它只记录调试消息。

    此代码不可靠,因为FirebaseAuth 的实例可能尚未完成初始化:

    @Override
    public void onStart() {
        super.onStart();
        mAuth.addAuthStateListener(mAuthListener);
        FirebaseUser user = mAuth.getCurrentUser(); // not reliable
    }
    

    这在documentation 中突出显示:

    注意:getCurrentUser 也可能返回 null,因为 auth 对象 还没有完成初始化。如果您使用侦听器来跟踪 用户的登录状态,这种情况不需要处理。

    【讨论】:

      【解决方案2】:

      这周我也在做同样的事情,我正在比较你的代码和我的代码。在OnCreate中,相信你缺了

              mAuth = FirebaseAuth.getInstance();
          FirebaseUser mUser = mAuth.getCurrentUser();
      

      另外,请确保您声明

      private FirebaseAuth mAuth;
      

      。你可以看到我的code here

      应用级别的 Gradle 也很重要。它给我带来了很多问题。确保你有

          compile 'com.firebase:firebase-client-android:2.5.2+'
      compile 'com.google.android.gms:play-services-auth:9.2.0'
      compile 'com.firebaseui:firebase-ui:0.4.4'
      

      您不需要 Facebook SDK,因为它已包含在 FireBase UI 中。如果你保留它,它可能会导致一些问题。另外,把

      apply plugin: 'com.google.gms.google-services'
      

      在依赖项的右括号下。

      【讨论】:

        猜你喜欢
        • 2020-08-22
        • 2021-07-13
        • 2019-07-13
        • 2023-03-19
        • 1970-01-01
        • 2018-12-16
        • 1970-01-01
        • 2017-03-10
        • 1970-01-01
        相关资源
        最近更新 更多