Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在片段中使用Google登录按钮_Java_Android_Firebase Authentication_Google Signin - Fatal编程技术网

Java 在片段中使用Google登录按钮

Java 在片段中使用Google登录按钮,java,android,firebase-authentication,google-signin,Java,Android,Firebase Authentication,Google Signin,我将在我的android应用程序中加入Google sign。但唯一的区别是我在片段中使用了Signin按钮,而不是activity。所以,当我试图通过单击登录按钮登录用户时,我无法登录。当我调试代码时,我知道onActivityResult方法中的Google身份验证失败 WelcomeActivity.java public class WelcomeActivity extends AppCompatActivity { private static final String TA

我将在我的android应用程序中加入Google sign。但唯一的区别是我在片段中使用了Signin按钮,而不是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));
    }
} 
而我的片段,我把谷歌sigin按钮放在

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));
    }
}
公共类OverviewFragment扩展片段实现GoogleAppClient.OnConnectionFailedListener{
私有静态最终字符串标记=“OverviewFragment”;
私有静态最终int GOOGLE_RC_SIGN_IN=9001;
私有静态最终整数=140;
私人GoogleapClient MGoogleapClient;
@BindView(R.id.sign_in_按钮)SignInButton mGoogleSigninButton;
私人消防队;
私有FirebaseAuth.AuthStateListener mAuthListener;
@可空
@凌驾
创建视图时的公共视图(LayoutFlater充气机、@Nullable ViewGroup容器、@Nullable Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.fragment\u概述,容器,错误);
ButterKnife.bind(这个,rootView);
mAuth=FirebaseAuth.getInstance();
mAuthListener=new FirebaseAuth.AuthStateListener(){
@凌驾
AuthStateChanged上的公共void(@NonNull FirebaseAuth FirebaseAuth){
FirebaseUser=firebaseAuth.getCurrentUser();
如果(用户!=null){
//用户已登录
Log.d(标记为“+user.getUid()”);
finishOnboarding();
}否则{
//用户已注销
Log.d(标记“onAuthStateChanged:signed_out”);
}
//updateUI(用户);
}
};
GoogleSignenOptions gso=新建GoogleSignenOptions.Builder(GoogleSignenOptions.DEFAULT\u登录)
.requestIdToken(getString(R.string.default\u web\u client\u id))
.requestEmail()
.build();
mgoogleapclient=新的Googleapclient.Builder(getActivity())
.enableAutoManage(getActivity(),this)
.addApi(授权谷歌登录API,gso)
.build();
mGoogleSigninButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
意向符号=Auth.googlesignianpi.getsignient(mgoogleapclient);
startActivityForResult(签名,谷歌注册);
}
});
返回rootView;
}
@凌驾
ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
//callbackManager.onActivityResult(请求代码、结果代码、数据);
if(requestCode==GOOGLE\u RC\u登录){
GoogleSignInResult结果=Auth.GoogleSignInApi.getSignInResultFromIntent(数据);
if(result.issucess()){
GoogleSignInAccount account=result.getSignInAccount();
手簿认证(账户);
}否则{
//谷歌登录失败
Log.d(标记“Google登录失败”+result.getSignInAccount()+“状态为”+result.getStatus());
}
}else if(requestCode==TWITTER\u RC\u登录){
//onActivityResult(请求代码、结果代码、数据);
}否则{
//callbackManager.onActivityResult(请求代码、结果代码、数据);
}
}
私人作废HandlegoogleaAuthentication(谷歌签名帐户){
AuthCredential credential=GoogleAuthProvider.getCredential(account.getIdToken(),null);
mAuth.signInWithCredential(credential).addOnCompleteListener(getActivity(),new OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
//在Google智能锁中保存凭据
FirebaseUser=FirebaseAuth.getInstance().getCurrentUser();
//更新程序(用户);
}否则{
//
Log.d(标记“登录失败”);
}
}
});
}
@凌驾
public void onconnection失败(@NonNull ConnectionResult ConnectionResult){
}
私人无效完成板(){
startActivity(新意图(getActivity(),MainActivity.class));
}
}

有人能告诉我哪里做错了吗?非常感谢。非常感谢您的帮助。

请尝试此代码并为我工作

在创建您的活动时

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();
覆盖ActivityResult上的

@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 plus登录按钮的
onClick

   try {
        Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
        startActivityForResult(signInIntent, RC_GET_TOKEN);
    }catch (Exception e){
        e.printStackTrace();
    }

请尝试此代码并为我工作

在创建您的活动时

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();
覆盖ActivityResult上的

@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 plus登录按钮的
onClick

   try {
        Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
        startActivityForResult(signInIntent, RC_GET_TOKEN);
    }catch (Exception e){
        e.printStackTrace();
    }

Jetpack导航组件和Kotlin的另一个解决方案如下所述。此处无需在活动中添加任何代码:

class SignInFragment : Fragment(R.layout.fragment_signin) {

    companion object {
        const val GOOGLE_SIGN_IN = 1903
    }

    private lateinit var auth: FirebaseAuth
    private lateinit var googleSignInClient: GoogleSignInClient

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        auth = Firebase.auth
        googleSignInClient = GoogleSignIn.getClient(requireContext(), getGSO())
        btnSignIn.setOnClickListener { signIn() }
    }

    private fun signIn() {
        val signInIntent = googleSignInClient.signInIntent
        startActivityForResult(signInIntent, GOOGLE_SIGN_IN)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == GOOGLE_SIGN_IN) {
            val task = GoogleSignIn.getSignedInAccountFromIntent(data)
            try {
                val account = task.getResult(ApiException::class.java)!!
                firebaseAuthWithGoogle(account.idToken!!)
            } catch (e: ApiException) {
                //handle error
            }
        }
    }

    private fun firebaseAuthWithGoogle(idToken: String) {
        val credential = GoogleAuthProvider.getCredential(idToken, null)
        auth.signInWithCredential(credential)
            .addOnCompleteListener(requireActivity()) { task ->
                if (task.isSuccessful) {
                   //handle success
                } else {
                    //handle error
                }
            }
    }

    private fun getGSO(): GoogleSignInOptions {
        return  GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build()
    }
}
xml中的登录按钮:

<com.google.android.gms.common.SignInButton
    android:id="@+id/btnSignIn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:buttonSize="wide">

另一个带有Jetpack导航组件和Kotlin的解决方案如下所述。此处无需在活动中添加任何代码:

class SignInFragment : Fragment(R.layout.fragment_signin) {

    companion object {
        const val GOOGLE_SIGN_IN = 1903
    }

    private lateinit var auth: FirebaseAuth
    private lateinit var googleSignInClient: GoogleSignInClient

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        auth = Firebase.auth
        googleSignInClient = GoogleSignIn.getClient(requireContext(), getGSO())
        btnSignIn.setOnClickListener { signIn() }
    }

    private fun signIn() {
        val signInIntent = googleSignInClient.signInIntent
        startActivityForResult(signInIntent, GOOGLE_SIGN_IN)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == GOOGLE_SIGN_IN) {
            val task = GoogleSignIn.getSignedInAccountFromIntent(data)
            try {
                val account = task.getResult(ApiException::class.java)!!
                firebaseAuthWithGoogle(account.idToken!!)
            } catch (e: ApiException) {
                //handle error
            }
        }
    }

    private fun firebaseAuthWithGoogle(idToken: String) {
        val credential = GoogleAuthProvider.getCredential(idToken, null)
        auth.signInWithCredential(credential)
            .addOnCompleteListener(requireActivity()) { task ->
                if (task.isSuccessful) {
                   //handle success
                } else {
                    //handle error
                }
            }
    }

    private fun getGSO(): GoogleSignInOptions {
        return  GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build()
    }
}
xml中的登录按钮:

<com.google.android.gms.common.SignInButton
    android:id="@+id/btnSignIn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:buttonSize="wide">


什么是mController?什么是mController?