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
我发现了很多类似的问题,但我已经实现了一切,但还是不行。在 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