4

фонОбъединение Facebook и Google AUTH для Firebase Android

Здравствуйте, я новичок с Firebase для Android, и я пытаюсь реализовать Facebook и Google аутентификации/входа в первый раз. Я последовал за эти две обучающие программы для соответствующей аутентификации:

  • Http: // firebase.google.com/docs/auth/android/google-signin
  • Http: // firebase.google.com/docs/ авториз/Android/facebook-Логин

Отдельно FacebookSignInActivity и GoogleSignInActivity работают, как они должны.

Проблема

Проблема заключается в том, что я пытаюсь использовать Google и Facebook AUTH в той же деятельности, но это не будет работать. Как так:

result layout image

То, что я сделал

Я пытался держать FacebookSignInActivity отдельно от GoogleSignInActivity, позволяя им расширить MainActivity и установить макет там.

Но я думаю, что я должен объединить два в одном. Так что я попытался это, но я получаю странное исключение NullPointer:

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.firebase.auth.FirebaseAuth.addAuthStateListener(com.google.firebase.auth.FirebaseAuth$AuthStateListener)' on a null object reference 

Я не знаю, почему объект является недействительным в onCreate, потому что я скопировал тот же код из двух других видов деятельности, которые работают :

Я даже не уверен, что я даже должен объединить их в одну деятельность. Я также проверил эти ссылки:

Но, похоже, что-то еще от того, что я пытаюсь сделать. Если бы кто-то мог указать мне в правильном направлении, он был бы с радостью оценен.

+1

Код, который вы отправили, не является кодом, генерирующим исключение. Исключение возникает, когда вы вызываете 'mAuth.addAuthStateListener (mAuthListener)' и 'mAuth' равно null. Убедитесь, что вы выполнили 'mAuth = FirebaseAuth.getInstance()', прежде чем пытаться добавить слушателя. –

+0

Как и в уроках firebase, строка, на которую вы ссылаетесь: 'mAuth = FirebaseAuth.getInstance()' находится в моем фрагменте кода. Он вызывается в onCreate. «MAuth.addAuthStateListener» (mAuthListener); 'вызывается в onStart. – Tim

ответ

4

Вы можете попробовать этот код:

public class LoginActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener, 
     View.OnClickListener { 

    private static final String TAG = "SignInActivity"; 
    private static final int RC_SIGN_IN = 9001; 

    private GoogleApiClient mGoogleApiClient; 
    private FirebaseAuth mAuth; 
    private FirebaseAuth.AuthStateListener mAuthListener; 

    private CallbackManager mCallbackManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_login); 

     // Facebook Login 
     FacebookSdk.sdkInitialize(getApplicationContext()); 
     mCallbackManager = CallbackManager.Factory.create(); 

     LoginButton mFacebookSignInButton = (LoginButton) findViewById(R.id.facebook_button); 
     mFacebookSignInButton.setReadPermissions("email", "public_profile", "user_birthday", "user_friends"); 

     mFacebookSignInButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() { 
      @Override 
      public void onSuccess(LoginResult loginResult) { 
       Log.d(TAG, "facebook:onSuccess:" + loginResult); 
       firebaseAuthWithFacebook(loginResult.getAccessToken()); 
      } 

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

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

     // Google Sign-In 
     // Assign fields 
     Button mGoogleSignInButton = (Button) findViewById(R.id.google_button); 

     // Set click listeners 
     mGoogleSignInButton.setOnClickListener(this); 

     GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestIdToken(getString(R.string.default_web_client_id)) 
       .requestEmail() 
       .build(); 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
       .build(); 

     // Initialize FirebaseAuth 
     mAuth = FirebaseAuth.getInstance(); 

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

    @Override 
    public void onStart() { 
     super.onStart(); 
     mAuth.addAuthStateListener(mAuthListener); 
    } 

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

    private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { 
     Log.d(TAG, "firebaseAuthWithGooogle:" + acct.getId()); 
     AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); 
     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(); 
         } else { 
          startActivity(new Intent(LoginActivity.this, MainActivity.class)); 
          finish(); 
         } 
        } 
       }); 
    } 

    private void firebaseAuthWithFacebook(AccessToken token) { 
     Log.d(TAG, "handleFacebookAccessToken:" + token); 

     final 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(); 
         } else { 
          startActivity(new Intent(LoginActivity.this, MainActivity.class)); 
          finish(); 
         } 
        } 
       }); 
    } 

@Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.google_button: 
       signIn(); 
       break; 
      default: 
       return; 
     } 
    } 

    private void signIn() { 
     Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
     startActivityForResult(signInIntent, RC_SIGN_IN); 
    } 
    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     mCallbackManager.onActivityResult(requestCode, resultCode, data); 

     // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); 
     if (requestCode == RC_SIGN_IN) { 
      GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
      if (result.isSuccess()) { 
       // Google Sign In was successful, authenticate with Firebase 
       GoogleSignInAccount account = result.getSignInAccount(); 
       firebaseAuthWithGoogle(account); 
      } else { 
       // Google Sign In failed 
       Log.e(TAG, "Google Sign In failed."); 
      } 
     } 
    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
     // An unresolvable error has occurred and Google APIs (including Sign-In) will not 
     // be available. 
     Log.d(TAG, "onConnectionFailed:" + connectionResult); 
     Toast.makeText(this, "Google Play Services error.", Toast.LENGTH_SHORT).show(); 
    } 

} 

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.

0

Может быть, кто все еще ищет решения:

В деятельности (yourLoginActivity.класс)

* Создать постоянную Int к представляет requestCode для ActivityForResult

// You can change to any Value just be unique 
    private static final int RC_SIGN_IN = 1001; 

-> объявить GoogleApiClient, FirebaseAuth, AuthStateListener и CallbackManager

private static final String TAG = "LoginActivity"; 
private static final int RC_SIGN_IN = 1001; 
private GoogleApiClient mGoogleApiClient; 
private FirebaseAuth mAuth; 
private FirebaseAuth.AuthStateListener mAuthListener; 
private CallbackManager mCallbackManager; 

-> Инициализация переменных, объявленных выше:

mCallbackManager = CallbackManager.Factory.create(); mAuth = FirebaseAuth.getInstance(); 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"); 
     } 
    } }; 

-> Получить ссылку на Si ngInButton и LoginButton:

LoginButton facebookLoginButton = findViewById(R.id.login_facebook_button); 
    SignInButton mGoogleSignInButton = findViewById(R.id.sign_in_button); 

-> Ручка SingInButton и LoginButton:

facebookLoginButton.setReadPermissions("email", "public_profile", "user_birthday"); 
facebookLoginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() { 
    @Override 
    public void onSuccess(LoginResult loginResult) { 
     firebaseAuthWithFacebook(loginResult.getAccessToken()); 
    } 

    @Override 
    public void onCancel() { 
     Toast.makeText(LoginActivity.this, "Succes", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onError(FacebookException error) { 
     Toast.makeText(LoginActivity.this, "Succes", Toast.LENGTH_SHORT).show(); 
    } 
}); 

mGoogleSignInButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     signIn(); 
    } 
}); 

-> Управляйте GoogleSingInOptions и GoogleApiClient

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
     .requestIdToken(getString(R.string.default_web_client_id)) 
     .requestEmail() 
     .build(); 

mGoogleApiClient = new GoogleApiClient.Builder(this) 
     .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) 
     .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
     .build(); 

-> Ручка Facebook Вход

private void authWithFacebook(AccessToken token) { 
    Log.d(TAG, "handleFacebookAccessToken:" + token); 
    final AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken()); 
    if (mAuth.getCurrentUser() != null) { 
     mAuth.getCurrentUser().linkWithCredential(credential) 
       .addOnSuccessListener(new OnSuccessListener<AuthResult>() { 
      @Override 
      public void onSuccess(AuthResult authResult) { 
       Toast.makeText(LoginActivity.this, "Logged IN", Toast.LENGTH_LONG).show(); 
      } 
     }) 

       .addOnFailureListener(new OnFailureListener() { 
        @Override 
        public void onFailure(@NonNull Exception e) { 
         e.printStackTrace(); 
         Log.e(TAG, "onFailure: " + e.getMessage()); 
         mAuth.signInWithCredential(credential).addOnSuccessListener(new OnSuccessListener<AuthResult>() { 
          @Override 
          public void onSuccess(AuthResult authResult) { 
           Toast.makeText(LoginActivity.this, "Logged IN", Toast.LENGTH_LONG).show(); 
          } 
         }); 
        } 
       }); 
    } else { 
     mAuth.signInWithCredential(credential); 
    } 
} 

-> Ручка Google Логин:

pprivate void authWithGoogle(final GoogleSignInAccount acct) { 
    Log.d(TAG, "firebaseAuthWithGooogle:" + acct.getId()); 
    final AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); 
    if (mAuth.getCurrentUser() != null) { 
     mAuth.getCurrentUser().linkWithCredential(credential).addOnSuccessListener(new OnSuccessListener<AuthResult>() { 
      @Override 
      public void onSuccess(AuthResult authResult) { 
       Toast.makeText(LoginActivity.this, "Logged IN", Toast.LENGTH_LONG).show(); 
      } 
     }) 

       .addOnFailureListener(new OnFailureListener() { 
        @Override 
        public void onFailure(@NonNull Exception e) { 
         e.printStackTrace(); 
         Log.e(TAG, "onFailure: " + e.getMessage()); 
         mAuth.signInWithCredential(credential).addOnSuccessListener(new OnSuccessListener<AuthResult>() { 
          @Override 
          public void onSuccess(AuthResult authResult) { 
           Toast.makeText(LoginActivity.this, "Logged IN", Toast.LENGTH_LONG).show(); 
          } 
         }); 
        } 
       }); 
    }else{ 
     mAuth.signInWithCredential(credential); 
    } 
} 

-> Процентовка в onConnectionFailed():

@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
    // An unresolvable error has occurred and Google APIs (including Sign-In) will not 
    // be available. 
    Log.d(TAG, "onConnectionFailed:" + connectionResult); 
    Toast.makeText(this, "Google Play Services error.", Toast.LENGTH_SHORT).show(); 
} 

-> Поющие и вызвать onActivityForResult()

private void signIn() { 
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
    startActivityForResult(signInIntent, RC_SIGN_IN); 
} 

-> Выполнить GoogleApiClient.OnConnectionFailedListener

LoginActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener{ 
.... 
} 

Уверены, что у вас есть ENABLED FACEBOOK SDK Вход с FIREBASE CONSOLE И НАСТРОЙКА ПРАВИЛЬНО!

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

  • Нет связанных вопросов^_^