android - 谷歌登录在模拟器中有效,但在手机中无效

标签 android firebase firebase-authentication google-signin

我在使用 Firebase 实现 Google 登录时遇到了一个非常严重的问题。
我可以使用我的模拟器 Android 7.0(为 x86_64 构建的 SDK)登录,
但如果我将我的项目上传到我的手机(Android 6.0),我将无法使用 Google 登录。
我唯一看到的是应用程序关闭。在极少数情况下,如果我快速双击登录按钮,它会登录,但不会获得进一步使用的凭据。
可能是什么问题?

LoginActivity中的代码

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == FirebaseConstants.LOG_IN_REQUEST){

        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        Intent i = new Intent(LoginActivity.this, MainActivity.class);
        startActivity(i);

    }
    if(requestCode == FirebaseConstants.LOG_OUT_REQUEST){
        TastyToast.makeText(this, "Logged out successfully", TastyToast.LENGTH_LONG, TastyToast.SUCCESS);
    }
}

这是 onCreate 方法中的代码(单击按钮):
    btnGoogleSignIn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(NetworkUtil.isNetworkAvailable(LoginActivity.this)){
                googleLogin.logIn(LoginActivity.this);
            }else{
                TastyToast.makeText(LoginActivity.this, "Network is unavailable", TastyToast.LENGTH_LONG, TastyToast.ERROR);
            }
        }
    });

google登录实例
    public class GoogleLogin extends Observable implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener{

        private final GoogleApiClient googleApiClient;
        private final WeakReference<Activity> activityWeakReference;
        private static GoogleLogin googleLogin;

        public GoogleLogin(final Activity activity) {
            activityWeakReference = new WeakReference<>(activity);
            // Configure Google Sign In
            GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestIdToken(activity.getString(R.string.default_web_client_id))
                    .requestEmail()
                    .build();
            googleApiClient = new GoogleApiClient.Builder(activity)
                    .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                    .build();
        }

        @Override
        public void onConnected(@Nullable Bundle bundle) {
        }

        @Override
        public void onConnectionSuspended(int i) {

        }

        @Override
        public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        }

        public static GoogleLogin getInstance(Activity activity) {
            if (null == googleLogin) {
                googleLogin = new GoogleLogin(activity);
            }

            return googleLogin;
        }


        public void logIn(Activity activity){
            Context c = activityWeakReference.get().getApplicationContext();
            googleApiClient.connect();
            if(googleApiClient.isConnected()){
                Intent i = new Intent(c, MainActivity.class);
                googleApiClient.connect();
                activity.startActivity(i); // this wont start an activity
            }else if(!googleApiClient.isConnected()){
                Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
                googleApiClient.connect();
// this wont start an activity either
                activity.startActivityForResult(signInIntent, FirebaseConstants.LOG_IN_REQUEST);



            }
        }

        public void signOut(final Activity activity){
            if(googleApiClient.isConnected()) {
                Auth.GoogleSignInApi.signOut(googleApiClient).setResultCallback(
                        new ResultCallback<Status>() {
                            @Override
                            public void onResult(Status status) {
                                Intent i = new Intent(activity, LoginActivity.class);
                                activity.startActivityForResult(i, FirebaseConstants.LOG_OUT_REQUEST);
                            }
                        });
            }
        }

        public void disconnect(Activity activity){
            activity.getApplicationContext();
            if(googleApiClient.isConnected()){
                googleApiClient.disconnect();
                Intent i = new Intent(activity, LoginActivity.class);
            }
        }


    }

没有你们的帮助,我无法解决这个问题。我真的需要让它工作!

build.gradle 中的依赖关系
compile 'com.google.firebase:firebase-messaging:9.6.1'
compile 'com.google.firebase:firebase-database:9.6.1'
compile 'com.google.firebase:firebase-core:9.6.1'
compile 'com.google.firebase:firebase-auth:9.6.1'
compile 'com.google.android.gms:play-services-auth:9.6.1'
compile 'com.google.firebase:firebase-ads:9.6.1'

在 build.gradle 的底部
apply plugin: 'com.google.gms.google-services'

最佳答案

如果您的调试版本在使用 Google Sign-in 登录 Firebase 时没有抛出任何错误,则可能是证书签名问题。
第一步 (可选的)
在所有 catch block 中创建一条 Toast 消息,这样您就可以看到错误代码是什么。像往常一样构建和签署您的应用程序;然后将其作为封闭或开放轨道发布以进行测试。在线搜索错误代码。 (不要仅依赖 CommonStatusCodes 描述,并搜索其他资源)。
第二步
检查您的发布 apk/bundle 的 SHA-1 证书指纹:
A) 进入 Android Studio 中的 Gradle/:app/Tasks/android/signingReport 并生成报告。从发布变体中复制 SHA1 指纹。
B) 如果您的应用由 Google Play 签名,则在 Google Play 控制台中转到发布管理/应用签名,并从 App 登录证书中复制 SHA-1 证书指纹
然后转到 Firebase 控制台中的项目设置并添加新指纹,这样您就拥有了调试和发布指纹。
第三步
下载 google-services.json 文件并将构建中的现有文件替换为您刚刚下载的文件。构建并签署新版本。

关于android - 谷歌登录在模拟器中有效,但在手机中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41029310/

相关文章:

android - Firebase PhoneAuthProvider OTP

android - Firebase 登录不适用于较低的 Android 版本

android - 单击按钮插入

java - 如何存储对象并保持组合

android - 如何在点击时在textview上制作闪烁效果?

firebase - 带有通配符路径的 Firestore 云功能触发器

javascript - 仅在托管应用程序时出现错误,但在本地主机中则不会出现错误

firebase - 捆绑失败 : SyntaxError: Unexpected end of JSON input in react native

android - Firebase 身份验证 - 电话 - "INVALID_CERT_HASH"

android - 我怎样才能获得 Apk 文件...?