1

facebook sdk로 firebase 인증과 android에서 "user/password"옵션으로 로그인하려고합니다. MainActivity를 시작하기 전에 사용자가 어떤 종류의 인증을 사용했는지 알아야합니다.실행 순서 firebase auth

일 전 코드가 잘 작동하는데 사용되었지만 firebase 프로젝트를 지워야했습니다. 오늘은 firebase/facebook SDK를 구성했으며 작동합니다. 하지만 이제 코드의 실행 순서가 다릅니다 (저는 매우 이상합니다).

전에 onComplete 메서드 (작업이 성공하면 유효성을 검사 할 때)가 먼저 실행 된 다음 onAuthStateChanged이 실행됩니다. 그러나 먼저 먼저 onAuthStateChanged 메서드가 실행되고 다른 작업이 시작된 다음 작업이 성공하면 유효성이 검사됩니다. 디버그 모드에서 동작을 참조하십시오. 여기

는 코드 예제 내가 어떤 도움 사전에 감사

fbLoginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 
     @Override 
     public void onSuccess(LoginResult loginResult) { 
      //Inicio de sesion con facebook exitoso 
      handleFacebookAccessToken(loginResult.getAccessToken()); 
     } 

     @Override 
     public void onCancel() { 
      //Inicio de sesion con facebook cancelado 
      Toast.makeText(getApplicationContext(),R.string.cancel_fb_log,Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public void onError(FacebookException error) { 
      //Inicio de sesion con facebook erroneo 
      Toast.makeText(getApplicationContext(),R.string.error_fb_log,Toast.LENGTH_SHORT).show(); 
     } 
    }); 



private void handleFacebookAccessToken(AccessToken accessToken) { 
    relativeLayout.setVisibility(View.GONE); 
    relativeLayout1.setVisibility(View.VISIBLE); 
    AuthCredential credential = FacebookAuthProvider.getCredential(accessToken.getToken()); 
    //Iniciar sesión con una credencial 
    firebaseAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
     //metodo que se ejecuta al terminar el proceso 
     @Override 
     public void onComplete(@NonNull Task<AuthResult> task) { 
      if (!task.isSuccessful()){ 
       //Ocurrio un error al realizar el logueo a firebase con facebook 
       Utilities.exceptionFirebaseAdministrator(LoginActivity.this, task, LOG_TAG); 
       LoginManager.getInstance().logOut(); 
      }else{ 
       pref.edit().putBoolean(getString(R.string.pref_logged_with_facebook),true).apply(); 
       pref.edit().putBoolean(getString(R.string.pref_logged_with_firebase),false).apply(); 
      } 
      relativeLayout.setVisibility(View.VISIBLE); 
      relativeLayout1.setVisibility(View.GONE); 
     } 
    }); 
} 

fireAuthStateListener = new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
      FirebaseUser user = firebaseAuth.getCurrentUser(); 

      if(user != null){ 

//I try use SharedPreference and validate if is facebook login or other 
        startMainActivity(); 

      } 

     } 
    }; 

@Override 
public void onStart() { 
    super.onStart(); 
    //Cuando la clase empieza a "escuchar" 
    firebaseAuth.addAuthStateListener(fireAuthStateListener); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    //Cuando la clase deja de "escuchar" 
    firebaseAuth.removeAuthStateListener(fireAuthStateListener); 
} 

답변

0

코드에서이 변화를 수행, authstate 완성하지만이 onConplete 코드가 실행되지해야 할 때

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
     // this is the login layout change it to yours. 
    setContentView(R.layout.activity_login); 

    // START initialize_auth 
    mAuth = FirebaseAuth.getInstance(); 
    // START auth_state_listener 
    mAuthListener = new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
      FirebaseUser user = firebaseAuth.getCurrentUser(); 
       //check if user is not null 
      if (user != null) { 

// below code will triggers as soon as your facebook login task is successful     


     // this will return provider as facebook,google,twitter,email ,etc 

       String provider = user.getProviders().get(0) ; 

        pref.edit().putBoolean(getString(R.string.pref_logged_with_facebook), true).apply(); 
        pref.edit().putBoolean(getString(R.string.pref_logged_with_firebase), false).apply(); 
    //I try use SharedPreference and validate if is facebook login or other 
       startMainActivity(); 


      } else { 
       // User is signed out 
       Log.d(LOG_TAG, "user signed_out"); 
       // logout user and open login page . 
      } 
     } 
    }; 


} 

// [START on_start_add_listener] 
@Override 
public void onStart() { 
    super.onStart(); 
    mAuth.addAuthStateListener(mAuthListener); 
} 

// [START on_stop_remove_listener] 
@Override 
public void onStop() { 
    super.onStop(); 
    if (mAuthListener != null) { 
     mAuth.removeAuthStateListener(mAuthListener); 
    } 
} 


private void handleFacebookAccessToken(AccessToken accessToken) { 
    relativeLayout.setVisibility(View.GONE); 
    relativeLayout1.setVisibility(View.VISIBLE); 
    AuthCredential credential = FacebookAuthProvider.getCredential(accessToken.getToken()); 
    //Iniciar sesión con una credencial 
    firebaseAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
     //metodo que se ejecuta al terminar el proceso 
     @Override 
     public void onComplete(@NonNull Task<AuthResult> task) { 
      if (!task.isSuccessful()) { 

       // If sign in fails, log message or go back to login page.   
       //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. 

       Utilities.exceptionFirebaseAdministrator(LoginActivity.this, task, LOG_TAG); 
       LoginManager.getInstance().logOut(); 
      } 
       // this will execute no matter whats happens , 
      relativeLayout.setVisibility(View.VISIBLE); 
      relativeLayout1.setVisibility(View.GONE); 
     } 
    }); 
} 

} 
+1

그 다른 형태이며, 덕분에 작동합니다 (어떻게 지금 내가 위쪽 화살표를 클릭하여 피드백을 투표 할 수 있습니다)하지만 실행 시간 순서가 onComplete 이상 나중에 onAuthStateChanged 매우 이상한 것 같습니다. 사용자가 Facebook 또는 이메일/비밀번호 단계를 사용하여 등록하는 경우 onAuthStateChanged 메소드에서 알 수있는 방법이 있습니까? –

+0

예 user.getProviders()를 사용하여 공급자를 확인할 수 있습니다. get (0), 반환 유형이 문자열 인 경우 if (user! = null)에서 사용하십시오. 위의 편집 된 답변을 참조하십시오 –

+1

OK 설탕을 많이 주셔서 감사합니다! –

0

FirebaseAuth 않는 까다로운 작업, 당신은 사용자가 로그인 한 경우 응용 프로그램 중포 기지 AuthStateListener 어떤 상태를 즉, 변경보고 처음 실행 시작할 때 로그인 또는 로그 아웃.
코드에 AuthStateListener를 추가하면 시작될 때마다 앱이 시작될 때마다 다른 메서드가 재정의되고 AuthStateListener가 먼저 실행됩니다. 시작시 AuthStateListener를 추가하고 firebase 엔지니어가 권장하는 중지 방법에서이를 제거하는 것이 좋습니다. 사용자 인증을 요구하는 응용 프로그램에서 사용자 상태를 항상 확인한 다음 해당 사용자에게 할당 된 모든 작업을 수행해야합니다.

 Override 
    public void onStart() { 
super.onStart(); 
//Cuando la clase empieza a "escuchar" 
firebaseAuth.addAuthStateListener(fireAuthStateListener); 

}

+0

그러나이 onComplete를 방법의 블록 코드가 실행될 때 그것은 트리거는 authstatechanged 완료? –

+0

당신의 활동의 onCreate 메소드에서 firebaseAuthsatateListner 메소드를 작성하십시오. 귀하의 활동이 firebasauthstatListener를 열 때마다 Listner는 사용자의 상태를 점검합니다. 사용자가 페이스 북을 사용하여 로그인을 시도 할 때 작업이 성공하면 인증 상태 수신기에 알리고 로그인 한 사용자를 처리하는 논리를 리스너에서 처리 할 수 ​​있습니다. –

+0

실행의 흐름은 다음과 같습니다 ... firebase authStateListener (이번에는 상태 사용자가 null 임) - 페이스 북 로그인 완료 메소드 (작업이 성공한 경우) - 다시 firebsaeauthstateListner. (이번에는 상태가 사용자! = null) –