Android 如何在以onCreateView()开头的片段中使用Google SignIn?

Android 如何在以onCreateView()开头的片段中使用Google SignIn?,android,authentication,firebase,firebase-authentication,google-login,Android,Authentication,Firebase,Firebase Authentication,Google Login,我想使用Firebase的Google登录。我的想法是在片段中使用它 为此,我有一个LoginActivity,它以GoogleApi开始一个片段 我调试我的应用程序,如果我点击谷歌登录,谷歌窗口就会打开,我可以选择我的谷歌登录。我得到的请求代码编号为9001和resultCode=-1 firebaseAuthWithGoogle方法启动,在我的帐户对象中,是我的数据。行中: AuthCredential credential = GoogleAuthProvider.getCredenti

我想使用Firebase的Google登录。我的想法是在片段中使用它

为此,我有一个LoginActivity,它以GoogleApi开始一个片段

我调试我的应用程序,如果我点击谷歌登录,谷歌窗口就会打开,我可以选择我的谷歌登录。我得到的请求代码编号为
9001
resultCode=-1

firebaseAuthWithGoogle方法启动,在我的帐户对象中,是我的数据。行中:

AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(),null);
我得到这个错误:

java.lang.IllegalArgumentException: Must specify an idToken or an accessToken.
这是我的密码:

片段:

public class LoginGoogleFragment extends Fragment implements GoogleApiClient.OnConnectionFailedListener {

    ...

    private View rootView;

    /*
    * Google
    * */

    private static final int RC_SIGN_IN = 9001;
    private GoogleApiClient mGoogleApiClient;

    /* Firebase */

    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;


    private void initFirebase(){

        /*
        * Firebase wird Initialisiert
        * */

        mAuth = FirebaseAuth.getInstance();
        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if(user!=null){
                    Log.d(AUTH_FIREBASE,"Benutzer ist angemeldet");
                }else{
                    Log.d(AUTH_FIREBASE,"Benutzer ist nicht angemeldet");
                }
            }
        };

        mAuth.addAuthStateListener(mAuthListener);
    }

    private void initGoogle() {

        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .build();

        //hier hab ich was geändert

        mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
                .enableAutoManage(getActivity(),this)
                .addApi(Auth.GOOGLE_SIGN_IN_API,gso)
                .build();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_login_email,container,false);
        Log.d(LOG_INFO,TAG + ":onCreateView()");

        initFirebase();
        initGoogle();

        signInWithGoogle();

        return rootView;
    }

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

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d("onActivityResult", "requestCode = " + requestCode);

        if(requestCode==RC_SIGN_IN){

            /* Google gibt ein Objekt and die Anwendung zurück */

            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);

            /*
            * Prüfen ob die Anmeldung bei Google erfolgreich war
            * */

            if(result.isSuccess()){

                Log.d(AUTH_GOOGLE,"Google Anmeldung war erfolgreich");

                GoogleSignInAccount account = result.getSignInAccount(); //Gogole Account Objekt

                //saveUserToDatabase(getUserByGoogleUser(account,"nickname_example")); //Google Benutzer wird zu USer

                firebaseAuthWithGoogle(account); //Daten an Firebase weitergeben

            }else{

                Log.d(AUTH_GOOGLE,"Google Anmeldung war nicht erfolgreich!");

            }
        }
    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        Log.d(AUTH_GOOGLE,"Google Anmeldung ist Fehlgeschlagen!");
    }

    /*
    * Google Anmeldung (Externe Activity)
    * */
    private void signInWithGoogle() {
        Log.d(AUTH_GOOGLE,"Anmeldung mit Google wird vorbereitet...");

        Intent signIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
        startActivityForResult(signIntent,RC_SIGN_IN); // Das Google Fragment wird geladen
    }

    /*
    * Google Anmeldung via Firebase
    * */
    private void firebaseAuthWithGoogle(GoogleSignInAccount account) {

        Log.d(AUTH_GOOGLE,"Google Anmeldung an Firebase wird gestartet...");

        AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(),null);

        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        Log.d(AUTH_GOOGLE,"Google Anmeldung an Firebase ist -> " + task.isSuccessful());
                        Intent intent = new Intent(rootView.getContext(), MainActivity.class);
                        startActivity(intent);
                    }
                });
    }

}
公共类LogingLogleFragment扩展片段实现GoogleAppClient.OnConnectionFailedListener{
...
私有视图rootView;
/*
*谷歌
* */
专用静态最终输入RC\U符号\U IN=9001;
私人GoogleapClient MGoogleapClient;
/*火基*/
私人消防队;
私有FirebaseAuth.AuthStateListener mAuthListener;
私有void initFirebase(){
/*
*Firebase wird Initialisert
* */
mAuth=FirebaseAuth.getInstance();
mAuthListener=new FirebaseAuth.AuthStateListener(){
@凌驾
AuthStateChanged上的公共void(@NonNull FirebaseAuth FirebaseAuth){
FirebaseUser=firebaseAuth.getCurrentUser();
如果(用户!=null){
Log.d(认证火基,“Benutzer ist Angeldet”);
}否则{
Log.d(认证火基,“Benutzer ist nicht angemeldet”);
}
}
};
mAuth.addAuthStateListener(mAuthListener);
}
私有void initGoogle(){
GoogleSignenOptions gso=新建GoogleSignenOptions.Builder(GoogleSignenOptions.DEFAULT\u登录)
.requestEmail()
.build();
//他是个天才
mgoogleapclient=新的Googleapclient.Builder(getActivity())
.enableAutoManage(getActivity(),this)
.addApi(授权谷歌登录API,gso)
.build();
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
rootView=inflater.inflate(R.layout.fragment\u login\u email,container,false);
Log.d(日志信息,标记+”:onCreateView()”;
initFirebase();
initGoogle();
使用Google()登录;
返回rootView;
}
@凌驾
公共void onStop(){
super.onStop();
if(mAuthListener!=null){
removeAuthStateListener(mAuthListener);
}
}
@凌驾
ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
Log.d(“onActivityResult”、“requestCode=“+requestCode”);
if(requestCode==RC\u登录){
/*谷歌的目标是什么?谷歌的目标是什么*/
GoogleSignInResult结果=Auth.GoogleSignInApi.getSignInResultFromIntent(数据);
/*
*这场战争是一场战争
* */
if(result.issucess()){
Log.d(AUTH_GOOGLE,“GOOGLE Anmeldung war erfolgreich”);
GoogleSignInAccount account=result.getSignInAccount();//Gogole account Objekt
//saveUserToDatabase(getUserByGoogleUser(帐户,“昵称”\u示例”);//Google Benutzer wird zu用户
Firebase AuthWithGoogle(帐户);//在Firebase weitergeben中添加日期
}否则{
Log.d(AUTH_GOOGLE,“googleanmeldung war nicht erfolgreich!”);
}
}
}
@凌驾
public void onconnection失败(@NonNull ConnectionResult ConnectionResult){
Log.d(AUTH_GOOGLE,“googleanmeldung ist Fehlgeschlagen!”);
}
/*
*Google Anmeldung(外部活动)
* */
私有void signiWithGoogle(){
Log.d(AUTH_GOOGLE,“Anmeldung mit GOOGLE wird vorbereite…”);
Intent-signIntent=Auth.GoogleSignInApi.getsigninent(mgoogleapclient);
startActivityForResult(签名,RC_签名);//这是谷歌的一个片段
}
/*
*通过Firebase搜索Google Anmeldung
* */
私有void firebaseAuthWithGoogle(谷歌登录帐户){
Log.d(AUTH_GOOGLE,“GOOGLE Anmeldung an Firebase wird gestartet…”);
AuthCredential credential=GoogleAuthProvider.getCredential(account.getIdToken(),null);
mAuth.SIGNWITH凭证(凭证)
.addOnCompleteListener(getActivity(),new OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
Log.d(AUTH_GOOGLE,“GOOGLE Anmeldung an Firebase ist->”+task.issusccessful());
Intent Intent=new Intent(rootView.getContext(),MainActivity.class);
星触觉(意向);
}
});
}
}

my account.getIdToken()为空…但为什么哪一行会导致错误?什么是完整的堆栈跟踪?如何写入AuthCredential credential=GoogleAuthProvider.getCredential(account.getIdToken(),null);