我正在关注https://firebase.google.com/docs/auth/android/google-signin将 Google 登录包含在我的 Android 应用程序中。但唯一的区别是我在 fragment 中使用登录按钮而不是 Activity 。因此,当我尝试通过单击登录按钮登录用户时,我无法登录。当我调试代码时,我发现 onActivityResult 方法中 Google 身份验证失败。
WelcomeActivity.java
public class WelcomeActivity extends AppCompatActivity {
private static final String TAG = "WelcomeActivity";
private ViewPager welcomeViewPager;
private WelcomePagerAdapter welcomePagerAdapter;
@BindView(R.id.skip) TextView skip;
@BindView(R.id.login) TextView login;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
ButterKnife.bind(this);
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());
finishOnboarding();
} else {
// User is signed out
Log.d(TAG, "onAuthStateChanged:signed_out");
}
//updateUI(user);
}
};
welcomeViewPager = (ViewPager) findViewById(R.id.welcome_viewPager);
welcomePagerAdapter = new WelcomePagerAdapter(getSupportFragmentManager());
welcomeViewPager.setAdapter(welcomePagerAdapter);
InkPageIndicator inkPageIndicator = (InkPageIndicator) findViewById(R.id.indicator);
inkPageIndicator.setViewPager(welcomeViewPager);
}
@Override
public void onStart() {
super.onStart();
mAuth.addAuthStateListener(mAuthListener);
}
@Override
public void onStop() {
super.onStop();
if (mAuthListener != null) {
mAuth.removeAuthStateListener(mAuthListener);
}
}
private void finishOnboarding() {
startActivity(new Intent(this, MainActivity.class));
}
}
我的 fragment ,我放置 Google 登录按钮的地方是
public class OverviewFragment extends Fragment implements GoogleApiClient.OnConnectionFailedListener{
private static final String TAG = "OverviewFragment";
private static final int GOOGLE_RC_SIGN_IN = 9001;
private static final int TWITTER_RC_SIGN_IN = 140;
private GoogleApiClient mGoogleApiClient;
@BindView(R.id.sign_in_button) SignInButton mGoogleSigninButton;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_overview, container, false);
ButterKnife.bind(this, rootView);
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());
finishOnboarding();
} else {
// User is signed out
Log.d(TAG, "onAuthStateChanged:signed_out");
}
//updateUI(user);
}
};
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
.enableAutoManage(getActivity(),this)
.addApi(Auth.GOOGLE_SIGN_IN_API,gso)
.build();
mGoogleSigninButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent signinIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signinIntent, GOOGLE_RC_SIGN_IN);
}
});
return rootView;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//callbackManager.onActivityResult(requestCode,resultCode,data);
if (requestCode == GOOGLE_RC_SIGN_IN){
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
GoogleSignInAccount account = result.getSignInAccount();
handleGoogleAuthentication(account);
} else {
//Google Login Failed
Log.d(TAG, "Google Login Failed "+result.getSignInAccount()+"Status is "+result.getStatus());
}
} else if (requestCode == TWITTER_RC_SIGN_IN) {
//mTwitterLoginButton.onActivityResult(requestCode,resultCode,data);
} else {
//callbackManager.onActivityResult(requestCode,resultCode,data);
}
}
private void handleGoogleAuthentication(GoogleSignInAccount account) {
AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null);
mAuth.signInWithCredential(credential).addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
//Save Credentials in Google Smart Lock
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
//updateUser(user);
} else {
//
Log.d(TAG, "Login failed");
}
}
});
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
private void finishOnboarding() {
startActivity(new Intent(getActivity(), MainActivity.class));
}
}
有人可以告诉我我哪里做错了吗?谢谢。我感谢任何帮助。
最佳答案
请尝试此代码并为我工作
在您的 Activity 的 onCreate 中
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestServerAuthCodegetString(R.string.default_web_client_id)
.requestEmail()
.build();
mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
.enableAutoManage(getActivity(), this)
.addApi(Plus.API, Plus.PlusOptions.builder().build())
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
重写onActivityResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mCallbackManager.onActivityResult(requestCode, resultCode, data);
if (requestCode == mController.RC_GET_TOKEN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
handleSignInResult(result);
}
}
Google+登录按钮的onClick
try {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_GET_TOKEN);
}catch (Exception e){
e.printStackTrace();
}
关于java - 在 Fragment 中使用 Google 登录按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39443637/