java - 在 Fragment 中使用 Google 登录按钮

标签 java android firebase-authentication google-signin

我正在关注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/

相关文章:

reactjs - React Router 用户角色的最佳实践 (Firebase)

java - java eclipse 中的 Activity 之间切换

java - IDP 的 Spring SAML 预授权检查

java - 如何在 Android/Java 中循环显示背景颜色?

java - AlertDialog 不从内部类显示

Firebase - 如何从控制台设置自定义声明

Android FirebaseUI : Showing a button even when only one provider is chosen

java - OpenCSV 解析器无法解析数据中的双引号

从 .jar 文件加载 Java 图像

android - 是否可以通过更新获得已安装应用程序的新权限?