谷歌登录身份验证失败
我想整合谷歌登录我的应用程序,但它没有追求我到另一个活动,它显示唯一的身份验证在模拟器中失败,但是当我在真实设备上测试它时,应用程序停止点击谷歌标志按钮。这是我下面谷歌登录身份验证失败
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.GoogleAuthProvider;
public class googleact extends AppCompatActivity {
SignInButton button;
FirebaseAuth firebaseauth;
private final static int RC_SIGN_IN=2;
GoogleApiClient mGoogleApiClient;
FirebaseAuth.AuthStateListener mAuthListener;
@Override
protected void onStart() {
super.onStart();
firebaseauth.addAuthStateListener(mAuthListener);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_googleact);
button =(SignInButton) findViewById(R.id.googlebtn);
firebaseauth = FirebaseAuth.getInstance();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
signIn();
}
});
mAuthListener=new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
if (firebaseAuth.getCurrentUser() !=null){
startActivity(new Intent(googleact.this, gprofile.class));
}
}
};
// Configure Google Sign In
GoogleSignInOptions gso = new
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
// Build a GoogleApiClient with access to the Google Sign-In API and
the
// options specified by gso.
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this /* FragmentActivity */, new
GoogleApiClient.OnConnectionFailedListener() {
@Override
public void onConnectionFailed(@NonNull ConnectionResult
connectionResult) {
Toast.makeText(googleact.this,"something went wrong",
Toast.LENGTH_SHORT).show();
}
})
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
}
// Configure Google Sign In
//GoogleSignInOptions gso = new
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
// .requestIdToken(getString(R.string.default_web_client_id))
// .requestEmail()
// .build();
private void signIn() {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Result returned from launching the Intent from
GoogleSignInApi.getSignInIntent(...);
if (requestCode == RC_SIGN_IN) {
GoogleSignInResult result =
Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
// Google Sign In was successful, authenticate with Firebase
GoogleSignInAccount account = result.getSignInAccount();
firebaseAuthWithGoogle(account);
} else {
Toast.makeText(googleact.this,"AUTH WENT WRONG",
Toast.LENGTH_SHORT).show();
}
}
}
private void firebaseAuthWithGoogle(GoogleSignInAccount account) {
AuthCredential credential =
GoogleAuthProvider.getCredential(account.getIdToken(), null);
firebaseauth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in
user's information
Log.d("TAG", "signInWithCredential:success");
FirebaseUser user = firebaseauth.getCurrentUser();
// updateUI(user);
} else {
// If sign in fails, display a message to the user.
Log.w("TAG", "signInWithCredential:failure",
task.getException());
Toast.makeText(googleact.this, "Authentication
failed.",
Toast.LENGTH_SHORT).show();
// updateUI(null);
}
// ...
}
});
}
}
这里下面
代码在logcat的 07-02 13:55:11.367 24547-24547 /? I/art:不是延迟启用-Xcheck:jni (已启用) 07-02 13:55:11.367 24547-24547 /? W /艺术:意外CPU变体用于使用X86 的默认值:86 07-02 13:55:11.793 24547-24547/com.example.roomsarehere.foodishere W /系统: 类加载器引用未知路径: /数据/应用/com.example.roomsarehere.foodishere-1/lib/x86 07-02 13:55:12.086 24547-24571/com.example.roomsarehere.foodishere I/DynamiteModule:考虑本地模块com.google.android.gms。标志:2 和 远程模块com.google.android.gms.flags:0 07-02 13:55:12.086 24547-24571/com.example.roomsarehere.foodishere I/DynamiteModule:选定本地版本com。 google.android.gms.flags 07-02 13:55:12.131 24547-24571/com.example.roo msarehere.foodishere W/System: 类加载器引用未知路径: 07-02 13:55:12.136 24547-24571/com.example.roomsarehere.foodishere W/System: ClassLoader引用未知路径:/ system/priv- app/PrebuiltGmsCore/lib/x86 012/07-02 13:55:12.148 24547-24571/com.example.roomsarehere.foodishere D/ApplicationLoaders:忽略Vulkan图层搜索路径/ system/priv- app/PrebuiltGmsCore/lib/x86:/system/priv- 命名空间0xa787a090 07-02 13:55:12.194 24547-p/app/PrebuiltGmsCore/24547/com.example.roomsarehere.foodishere I/FA:App 测量正在启动,版本:11020 07-02 13:55:12.195 24547-24547/com.example.roomsarehere.foodishere I/FA:至 启用调试日志记录运行:adb shell setprop log.tag.FA VERBOSE 07-02 13:55:12.222 24547 -24571/com.example.roomsarehere.foodishere W/DynamiteModule:找不到本地模块描述符类 com.google.android.gms.crash 未找到。 07-02 13:55:12.265 24547-24547/com.example.roomsarehere.foodishere V/FA: 集启用
GoogleSignInOptions gso = new
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
写这部分的onCreate(外)并运行代码,并再次改写的onCreate相同的代码()评论前一个并运行它可能会做的工作,我面临着同样的问题。
- 在你的Android工作室火力地堡控制台
-
LoginActivity.java启用googleSignIn -
public class LoginActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener{ @BindView(R.id.sign_in_button) SignInButton signInButton; private FirebaseAuth mFirebaseAuth; private GoogleApiClient googleApiClient; private static int RC_SIGN_IN = 1; private DatabaseReference databaseReference; private ProgressDialog progressDialog; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); ButterKnife.bind(this); mFirebaseAuth = FirebaseAuth.getInstance(); databaseReference = FirebaseDatabase.getInstance().getReference().child("Users"); progressDialog = new ProgressDialog(this); GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestIdToken(getString( R.string.default_web_client_id)) .requestEmail() .build(); googleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this, this) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); signInButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient); startActivityForResult(signInIntent, RC_SIGN_IN); } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); progressDialog.setMessage("Signing in..."); progressDialog.show(); if (result.isSuccess()) { GoogleSignInAccount account = result.getSignInAccount(); firebaseAuthWithGoogle(account); } else { progressDialog.dismiss(); Log.e(LoginActivity.this.getClass().getSimpleName(), "Google Sign-In failed."); } } } private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { Log.d(LoginActivity.this.getClass().getSimpleName(), "firebaseAuthWithGooogle:" + acct.getId()); AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); mFirebaseAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { Log.d(LoginActivity.this.getClass().getSimpleName(), "signInWithCredential:onComplete:" + task.isSuccessful()); if (!task.isSuccessful()) { Log.w(LoginActivity.this.getClass().getSimpleName(), "signInWithCredential", task.getException()); Toast.makeText(LoginActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show(); } else { progressDialog.dismiss(); checkUserExist(); } } }); } private void checkUserExist() { if(mFirebaseAuth.getCurrentUser() != null){ final String user_id = mFirebaseAuth.getCurrentUser().getUid(); databaseReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if(dataSnapshot.hasChild(user_id)){ Intent signinIntent = new Intent(LoginActivity.this,SplashActivity.class); signinIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(signinIntent); } else{ Intent setupAccountIntent = new Intent(LoginActivity.this,SetupAccountActivity.class); setupAccountIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(setupAccountIntent); } } @Override public void onCancelled(DatabaseError databaseError) { } }); } } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { Toast.makeText(this, "Connection Failed", Toast.LENGTH_LONG).show(); }
}
所以这里这个活动,当用户点击在Google登录按钮上,它会在Firebase控制台上进行身份验证,然后转到用户可以设置其帐户的设置帐户,例如可以获取用户示例个人资料照片等的详细信息。 检查用户是否设置了帐户那么它会去飞溅活动,这是你的启动屏幕。 获取用户数据并将其保存在“用户”节点的数据库中。
-
SplashActivity。爪哇 - 启动屏幕
public class SplashActivity extends AppCompatActivity { @BindView(R.id.start) Button start; private FirebaseAuth mFirebaseAuth; private FirebaseUser mFirebaseUser; private FirebaseAuth.AuthStateListener mAuthListener; private GoogleApiClient googleApiClient; private DatabaseReference userDatabaseReference; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); ButterKnife.bind(this); mFirebaseAuth = FirebaseAuth.getInstance(); mFirebaseUser = mFirebaseAuth.getCurrentUser(); userDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Users"); mAuthListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(FirebaseAuth firebaseAuth) { if (mFirebaseUser == null) { Intent loginIntent = new Intent(SplashActivity.this,LoginActivity.class); loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(loginIntent); } } }; GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestIdToken(getString(R.string.default_web_client_id)) .requestEmail() .build(); googleApiClient = new GoogleApiClient.Builder(this) .addApi(Auth.GOOGLE_SIGN_IN_API , gso) .build(); checkUserExist(); } private void checkUserExist() { if(mFirebaseAuth.getCurrentUser() != null){ final String user_id = mFirebaseAuth.getCurrentUser().getUid(); userDatabaseReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if(!dataSnapshot.hasChild(user_id)){ Intent setupAccountIntent = new Intent(SplashActivity.this,SetupAccountActivity.class); setupAccountIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(setupAccountIntent); } } @Override public void onCancelled(DatabaseError databaseError) { } }); } } @Override public void onStart() { super.onStart(); googleApiClient.connect(); mFirebaseAuth.addAuthStateListener(mAuthListener); } @Override public void onStop() { if (mAuthListener != null) { mFirebaseAuth.removeAuthStateListener(mAuthListener); } googleApiClient.disconnect(); super.onStop(); } @OnClick(R.id.start) public void onViewClicked() { Intent intent = new Intent(this,MainActivity.class); startActivity(intent); finish(); }
}
因为这是我的发射活动,当用户打开应用程序如果没有的话证实了它会去登录,如果没有设置帐户,然后去帐户设置活动。
我的代码先生呢? –
看起来你正在做同一类2个不同的工作(你可以在我所提供的代码中看到。1.LoginActivity等是作为发射活动SplashActivity) 所以LoginActivity手柄按钮,点击启动器中的谷歌标志活动检查是否进行身份验证,然后继续其他开放LoginActivity – anandwana001
建议在登录类,并在您的MainActivity,这些用户会打开应用程序后,看到部分做谷歌的按键标志,检查是否验证用户身份,然后确定其他用户发送到登录界面 – anandwana001
crash log,please? – jagapathi
先生应用程序在真实设备上崩溃,但内部模拟器显示吐司“身份验证失败”意味着任务未完成。 –