GoogleSignInClient 在物理设备上总是 return null

GoogleSignInClient always return null on physical devices

我发现了很多类似的问题,但我已经实现了一切,但还是不行。在 Android 9、10 和 11 的虚拟设备上,它按预期工作,但在使用 Android 9 和 11 的物理设备上(可能在所有其他物理设备上也是如此)。

主要activity

public class MainActivity extends AppCompatActivity {
    private FirebaseAuth mAuth;
    private GoogleSignInClient mGoogleSignInClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();

        mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
        mAuth = FirebaseAuth.getInstance();
    }

    ActivityResultLauncher<Intent> someActivityResultLauncher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            result -> {
                if (result.getResultCode() == Activity.RESULT_OK) {
                    Intent data = result.getData();
                    /*** process firebase auth with data...*/
                } else {
                    Toast.makeText(MainActivity.this, "Weird error....", Toast.LENGTH_SHORT).show();
                }
            });

    @Override
    protected void onStart() {
        super.onStart();
        if (mAuth.getCurrentUser() != null) {
            //User logged to google
            /*** processing firebase auth etc... ***/
        } else {
            //User not logged to google
            Intent intent = mGoogleSignInClient.getSignInIntent();
            someActivityResultLauncher.launch(intent);
        }

    }
....
}

这里是buid.gradle

plugins {
    id 'com.android.application'
    id 'com.google.gms.google-services'
}
android {
    compileSdk 30
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId "com.xxx.xxxx"
        minSdk 27
        targetSdk 30
        versionCode 2014
        versionName "0.2.14"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    signingConfigs {
        release {
            storeFile file("${System.getenv("AC_ANDROID_KEYSTORE_PATH")}")
            storePassword "${System.getenv("AC_ANDROID_KEYSTORE_PASSWORD")}"
            keyAlias "${System.getenv("AC_ANDROID_ALIAS")}"
            keyPassword "${System.getenv("AC_ANDROID_ALIAS_PASSWORD")}"
            v2SigningEnabled true
            v1SigningEnabled true
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
    implementation 'androidx.preference:preference:1.1.1'

    implementation 'com.google.code.gson:gson:2.8.7'
    implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.2'

    implementation platform('com.google.firebase:firebase-bom:28.2.1')
    implementation 'com.google.firebase:firebase-analytics:19.0.0'
    implementation 'com.google.firebase:firebase-auth:21.0.1'
    implementation 'com.google.android.gms:play-services-auth:19.2.0'

}

选择 Google 帐户后,我在虚拟设备上登录并成功连接到 firebase,但在物理设备上我收到 toast 消息,因为 result.getResultCode() 不是 Activity.RESULT_OK 并且没有其他结果数据。

google-services.json 已配置,以及与 firebase 有关的所有其他内容。知道如何解决这个问题吗?

更新:

当 运行 来自 android 工作室、物理设备或虚拟设备时,应用程序正常运行。

当应用程序安装在物理或虚拟设备上时,作为发布或调试版本,无法运行。真的很奇怪。

更新 2:

我已经在虚拟设备上安装了发布应用程序。当然没有按预期工作。

然后我 运行 来自 android studio 的应用程序在同一个虚拟设备上,我得到警告说有一个相同的应用程序具有不同的签名 (???) 而我 运行 它。有效。

我退出了该应用程序,然后从虚拟设备运行它,现在可以正常工作了。

奇怪²。

我停止应用程序,来自 android

解决方案是将您的 sha1 添加到您的 firebase 项目中,如下所示:

设置图标 -> 项目设置 -> 常规设置 -> 向下滚动并粘贴您的 sha1 密钥

找到的解决方案:

问题出在应用程序的 SHA-1 哈希中。在 gradle.build 中定义了用于发布的“默认系统密钥库”(c:\users\(username)\.android\debug.keystore)。应用程序已使用我创建的发布密钥库进行签名。 SHA-1 是使用来自 gradle.build 的文件构建的,因此存在不匹配。在 gradle.build 中进行更正并创建新版本 SHA-1 后,我将新的 SHA-1 添加到 firebase 应用程序,一切正常:)

build.gradle的一部分:

signingConfigs {
    release {
        storeFile file("C:\projects\android\_keystore\imath\release.jks")
        storePassword "xxxxxxx"
        keyAlias "key0"
        keyPassword "xxxxxxx"
        v2SigningEnabled true
        v1SigningEnabled true
    }
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
    }
}

所以,有了 gradlew signingReport 创建 SHA-1,用于调试和发布,并将它们都放在 Firebase 的应用程序配置中。

> Task :app:signingReport
Variant: debug
Config: debug
Store: C:\Users\Vojin\.android\debug.keystore
Alias: AndroidDebugKey
MD5: 1D:64:F8:1A:3E:33:26:CF:57:3F:3A:34:BE:84:F3:5E
SHA1: AD:9F:FD:C6:E9:64:75:18:B2:2E:E3:90:16:13:88:E8:55:AA:44:AD
SHA-256: 19:4E:D1:19:51:37:1D:8D:3C:32:B3:A1:C3:2F:3A:84:BA:C5:58:EC:13:E1:9F:B4:1F:73:B5:27:85:E7:1D:9E
Valid until: Wednesday, June 2, 2049
----------
Variant: release
Config: release
Store: C:\projects\android\_keystore\imath\release.jks
Alias: key0
MD5: 50:9F:1F:E7:1F:DB:39:40:33:55:71:40:6C:CF:86:EE
SHA1: C6:08:E0:87:A2:AB:2A:2C:AF:0D:22:03:86:F0:F8:48:C2:C8:59:20
SHA-256: B1:E8:35:AF:EB:49:79:A7:51:57:97:74:BA:0A:CD:2D:28:9D:45:FB:CD:06:50:26:44:BE:46:95:A6:F0:5F:FF
Valid until: Sunday, July 29, 2046
----------
Variant: debugAndroidTest
Config: debug
Store: C:\Users\Vojin\.android\debug.keystore
Alias: AndroidDebugKey
MD5: 1D:64:F8:1A:3E:33:26:CF:57:3F:3A:34:BE:84:F3:5E
SHA1: AD:9F:FD:C6:E9:64:75:18:B2:2E:E3:90:16:13:88:E8:55:AA:44:AD
SHA-256: 19:4E:D1:19:51:37:1D:8D:3C:32:B3:A1:C3:2F:3A:84:BA:C5:58:EC:13:E1:9F:B4:1F:73:B5:27:85:E7:1D:9E
Valid until: Wednesday, June 2, 2049