#android #authentication #android-intent #google-authentication
#Android #аутентификация #android-намерение #google-аутентификация
Вопрос:
Я пытаюсь создать метод, который аутентифицирует пользователя Google в Firebase.
Я использую этот метод в 3 разных действиях, и я хотел бы очистить код, создающий метод.
Это код, который я пытаюсь создать как статический метод в классе.
private void firebaseAuthWithGoogle(GoogleSignInAccount acct, final Context activity, FirebaseAuth firebaseAuth) {
Log.d("MainACtivity", "firebaseAuthWithGoogle:" acct.getId());
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
firebaseAuth.signInWithCredential(credential)
.addOnCompleteListener(activity, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d("Main", "signInWithCredential:onComplete:" task.isSuccessful());
if (!task.isSuccessful()) {
Log.w("MainAcitivyt", "signInWithCredential", task.getException());
Toast.makeText(activity, "Authentication failed.",
Toast.LENGTH_SHORT).show();
}
else{
startActivity(AccountCreationActivity.newIntent(activity));
}
}
});
}
У меня возникли проблемы с пониманием того, как я могу использовать ‘startActivity’ из другого класса при вызове моих методов.
Или второй вариант, который я также пытался, — это вернуть намерение, но поскольку ‘onComplete’ возвращает void, я полностью потерял, как действовать.
Вот код для моей регистрации в Google, который я хотел бы скопировать в разных действиях и планировал создать его метод в другом классе. Я думаю, что единственный метод, который я не могу извлечь из своей активности регистрации, — это ‘onActivityResult’
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);
// Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
if (requestCode == RC_SIGN_IN) {
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
// Google Sign In was successful, authenticate with Firebase
GoogleSignInAccount account = task.getResult(ApiException.class);
firebaseAuthWithGoogle(account);
} catch (ApiException e) {
// Google Sign In failed, update UI appropriately
Log.w(TAG, "Google sign in failed", e);
// ...
}
}
}
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
Log.d("MainACtivity", "firebaseAuthWithGoogle:" acct.getId());
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
firebaseAuth.signInWithCredential(credential)
.addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d("Main", "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("MainAcitivyt", "signInWithCredential", task.getException());
Toast.makeText(getActivity(), "Authentication failed.",
Toast.LENGTH_SHORT).show();
}
else{
startActivity(AccountCreationActivity.newIntent(getActivity()));
}
}
});
}
Ответ №1:
как я могу использовать ‘startActivity’ из другого класса
Используйте экземпляр Context
для запуска действия. У вас есть Context activity
в параметрах метода, используйте его.
private void firebaseAuthWithGoogle(GoogleSignInAccount acct, final Context activity, FirebaseAuth firebaseAuth) {
Log.d("MainACtivity", "firebaseAuthWithGoogle:" acct.getId());
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
firebaseAuth.signInWithCredential(credential)
.addOnCompleteListener(activity, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d("Main", "signInWithCredential:onComplete:" task.isSuccessful());
if (!task.isSuccessful()) {
Log.w("MainAcitivyt", "signInWithCredential", task.getException());
Toast.makeText(activity, "Authentication failed.",
Toast.LENGTH_SHORT).show();
}
else{
// This line has been changed.
activity.startActivity(AccountCreationActivity.newIntent(activity));
}
}
});
}