2016-08-09 3 views
1

Я создаю единую активность для входа в Facebook, интегрированную с Firebase.Firebase не сохраняет пользователя Facebook в списке Auth

Я активировал вход в Facebook в Firebase, следил за всеми шагами firebase и всеми шагами Facebook в консоли для разработчиков Facebook.

У моей учетной записи есть com.facebook.widget.LoginButton и после нажатия этой кнопки появляется страница входа в систему Facebook, и я могу ввести учетные данные, авторизовать приложение и логин.

Но, когда я снова вхожу в приложение, появляется кнопка входа в систему и 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; 
    } 
} 

ответ

1

Непонятно, как вы проверяете, включен ли пользователь. recommend method должен использовать AuthStateListener. Обратите внимание, что он срабатывает не только тогда, когда пользователь вводит или выходит из системы, но также сразу после регистрации слушателя. У вас есть один, но он только регистрирует отладочные сообщения.

Этот код не является надежным, так как экземпляр FirebaseAuth не может быть закончена инициализация:

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

Это подчеркивается в documentation:

Примечание: getCurrentUser может также возвращать нуль потому что AUTH объект не завершил инициализацию. Если вы используете прослушиватель для отслеживания статуса входа в систему , вам не нужно обрабатывать этот случай.

0

Я работал над этим же на этой неделе, и я сравниваю ваш код с моим. В OnCreate, я полагаю, вам не хватает

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

также, убедитесь, что вы объявляете

private FirebaseAuth mAuth; 

. Вы можете увидеть мой code here

Пригородок уровня приложения также очень важен. Это вызвало у меня много проблем. Убедитесь, что у вас есть

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' 

Вам не нужен SDK для Facebook, поскольку он уже включен в пользовательский интерфейс FireBase. Если вы его сохраните, это может вызвать некоторые проблемы. Также, положить

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

под закрывающей скобкой зависимостей.

Смежные вопросы