Java 在片段中使用Google登录按钮
我将在我的android应用程序中加入Google sign。但唯一的区别是我在片段中使用了Signin按钮,而不是activity。所以,当我试图通过单击登录按钮登录用户时,我无法登录。当我调试代码时,我知道onActivityResult方法中的Google身份验证失败 WelcomeActivity.javaJava 在片段中使用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
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?