31

我正在尝试学习 Firebase,所以我通过了 Android Codelab。然而,他们给我的项目有一个错误:

无法解析符号 default_web_client_id

而且我不知道如何解决它,因为我不知道它的价值default_web_client_id或它是什么。它在onCreate()方法中: SigninActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sign_in);
    mFirebaseAuth = FirebaseAuth.getInstance();

    // Assign fields
    mSignInButton = (SignInButton) findViewById(R.id.sign_in_button);

    // Set click listeners
    mSignInButton.setOnClickListener(this);

    // Configure Google Sign In
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build();
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();
}

我不知道它是什么,它的价值是什么,以及为什么它会给我这个错误。到目前为止,除了添加google-services.json. 我已经添加了我的SHA-1并在控制台中启用了 Google。

4

23 回答 23

56

解析时有时会出现问题google-services.json。我已将此问题报告给相关团队。

同时按照以下步骤解决此问题以更进一步 -

1) 打开google-services.json文件 -> 客户端 -> oauth_client -> client_id

2) 复制此客户 ID 并对其进行硬编码.requestIdToken("your ID")

它将允许通过 GoogleSignInAccount 在成功的 google 登录后请求“IdToken”,并使用 firebase 授权您的凭据。

编辑

google-service.json尝试删除并重新创建项目并在您的 Android 项目中重新导入新项目

于 2016-06-14T13:11:12.057 回答
20

更通用的解决方案是将其添加google-services.json到应用程序的根目录中。
并添加

apply plugin: 'com.google.gms.google-servicesbuild.gradle文件的末尾。

解释

当应用程序从配置文件构建键值对字符串时,google-services.json然后将其放入values.xml文件中,以使它们全局可用,可在代码中的任何位置使用。这使我们免于在您的代码中对 client_id 进行硬编码。

笔记

以后运行代码时,不要将default_web_client_idwithclient_id作为其值添加,strings.xml以避免重复错误。Error: Duplicate resources

于 2016-08-07T18:20:08.597 回答
10

经过一段时间搜索“智能”修复而不直接插入,按照FirebaseUI 项目client_id的这个答案,我只需要在中添加下一行:app/build.gradle

implementation 'com.firebaseui:firebase-ui-auth:4.3.2'
于 2019-04-05T07:06:32.790 回答
9
  1. google-services.json在 ./app/ 文件夹中
  2. 在项目级别添加build.gradle以下内容:
    buildscript {
    ...
    dependencies {
        ...
        classpath 'com.google.gms:google-services:4.3.5'
    }
  1. 在 app-levelbuild.gradle中,应用插件:
    apply plugin: 'com.google.gms.google-services'

这是我发现的烦人的事情。将其从更高版本升级4.3.5到更高版本会使 Android Studio 无法检测到生成的 values.xml 文件。

于 2021-10-06T03:42:45.490 回答
6

显然R.string.default_web_client_id是从 IDE 构建生成的

我以为我们应该手动添加它 - 耗时的错误

https://developers.google.com/android/guides/google-services-plugin

google-services 插件有两个主要功能: 1) 处理 google-services.json 文件并生成可在应用程序代码中使用的 Android 资源。

~~~~

JSON 处理的主要结果是生成两个 XML 文件,您可以在 Java 代码中将它们作为 Android 资源引用。

所以 - 成功构建后,如果您在 IDE 中搜索 string ,您将看到/generated 文件夹下的 values.xmldefault_web_client_id的一个结果,其中包含您的 firebase 配置的值,如下例所示。

实际上看到那个文件,有助于澄清这里的事情

<resources>
    <string name="default_web_client_id" translatable="false">123.apps.googleusercontent.com</string>
    <string name="firebase_database_url" translatable="false">https://123.firebaseio.com</string>
    <string name="gcm_defaultSenderId" translatable="false">123</string>
    <string name="google_api_key" translatable="false">123</string>
    <string name="google_app_id" translatable="false">123</string>
</resources>
于 2018-08-27T18:07:48.890 回答
4

**现在对我来说主要问题是确保从同一位置下载 json 文件。如果第一个来自 firebase 控制台,请不要使用 api 控制台获取文件,反之亦然。文件不一样**

于 2017-12-01T19:54:20.927 回答
3

我有同样的问题或类似的问题,

确保在您的 google-services.json 中有:

...    
"client": [
        ...
          "oauth_client": [
            ...
            {
              "client_id": "YOUR WEB CLIENT ID",
              "client_type": 3
            }     
...

由于某种原因,从 firebase 控制台下载的文件不包含它。

在 google-services.json 文件中添加条目后,一切都按预期开始工作。

谷歌服务插件文档

于 2019-04-08T12:12:15.227 回答
3

我已经google-services.json下载并解析了,但仍然找不到字符串。

我注意到我oauth_client有一个带有 client_type 的密钥,仅此而已1。在 Google API 控制台中,我只有一个 Android 密钥。

因此,您需要转到 API 控制台并生成Web Server密钥。然后,再次下载您的 google-services.json,您将拥有oauth_client一个类型为 3 的文件。

现在,插件将生成一个名为 default_web_client_id 的字符串。

于 2017-03-02T16:11:22.357 回答
2

除了 Dexto 的答案,我还想再提一件事 在 JSON 文件中,您将获得两种客户端 ID

一个具有client_type值 1,另一个具有client_type值 3 确保您指定了值为 3的client_typeclient_id

于 2018-10-28T10:41:49.127 回答
2
classpath 'com.google.gms:google-services:4.1.0'

有问题。改为使用:

classpath 'com.google.gms:google-services:4.2.0'
于 2019-03-30T08:22:28.387 回答
1

下载您最新的google-services.json. 您的Google Cloud Credentialsclient_id中存在OAuth 2.0 客户端 ID的列表。

然后检查它是否包含client_idwith "client_type" : 3。如果没有,您需要创建一个新的:

  1. 在 API 控制台中打开凭据页面。
  2. 单击创建凭据-> OAuth 客户端 ID。然后选择类型Web 应用程序
  3. 等待 2-3 分钟,刷新Firebase 控制台并重新下载google-services.json。它应该包含client_id现在"client_type" : 3

清理并重建您的项目以应用新的 API 配置。


client_idwith"client_type" : 3通常在oauth_client标签内,而不是servicesor other_platform_oauth_client

如果您遇到这种情况并且无法构建项目,请尝试将您client_idoauth_client标签复制并重新构建。

"client": [
        ...
        "oauth_client": [
            ...
            {
              "client_id": "YOUR WEB CLIENT ID",
              "client_type": 3
            }
        ]
]     
于 2019-07-11T15:22:11.617 回答
0

.json在 Firebase 控制台中更改配置后尝试再次下载您的文件。使用这个较新的配置文件,而不是旧的。

于 2017-02-02T07:07:54.253 回答
0

通用解决方案是在 build.gradle 的末尾应用 google play services 插件,如下所示

  apply plugin: 'com.android.application'

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.0"

    buildFeatures {
        dataBinding true
    }

    defaultConfig {
        applicationId "xxxxxx"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

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

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'



    testImplementation 'junit:junit:4.13'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    // For Common Dimension
    implementation 'com.intuit.sdp:sdp-android:1.0.5'
    implementation 'com.intuit.ssp:ssp-android:1.0.5'
    // Retrofit and Gson
    implementation 'com.google.code.gson:gson:2.8.6'
    implementation 'com.squareup.retrofit2:retrofit:2.6.1'
    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
    implementation 'com.squareup.retrofit2:converter-scalars:2.6.1'
    // Rx Java and Dagger
    implementation 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
    implementation 'io.reactivex:rxandroid:1.2.1'
    implementation 'io.reactivex:rxjava:1.1.6'

    implementation 'com.google.dagger:dagger:2.24'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.24'
    compileOnly 'javax.annotation:jsr250-api:1.0'
    compileOnly 'org.glassfish:javax.annotation:10.0-b28'
    // Glide Image Loading
    implementation 'com.github.bumptech.glide:glide:4.9.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
    implementation 'com.android.support:design:30.0.0'
    implementation 'com.android.support:recyclerview-v7:30.0.0'
    implementation 'com.android.support:cardview-v7:30.0.0'
    implementation 'com.android.support:multidex:1.0.3'

    /*Jsoup*/
    implementation 'org.jsoup:jsoup:1.9.1'

    /*Firebase*/
    implementation 'com.google.firebase:firebase-core:17.5.0'
    implementation 'com.google.firebase:firebase-config:19.2.0'
    implementation 'com.google.firebase:firebase-messaging:20.2.4'
    implementation 'com.google.firebase:firebase-database:19.3.1'
    implementation 'com.google.firebase:firebase-auth:19.3.2'
    implementation 'com.firebaseui:firebase-ui-storage:6.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'com.google.firebase:firebase-analytics:17.5.0'

    /*location and google map*/
    implementation 'com.google.android.gms:play-services-maps:17.0.0'
    implementation 'com.google.android.gms:play-services-location:17.0.0'
    implementation 'com.google.android.gms:play-services-places:17.0.0'
    implementation 'com.google.android.gms:play-services-auth:18.1.0'

    /*Circle Image View*/
    implementation 'de.hdodenhof:circleimageview:3.0.1'
    implementation 'com.github.ittianyu:BottomNavigationViewEx:2.0.4'
    implementation "com.android.support:design:30.0.0"
    implementation 'com.facebook.android:facebook-android-sdk:5.15.3'

}

apply plugin: 'com.google.gms.google-services'
于 2020-08-17T17:45:43.653 回答
0

使用此链接将我的后端 ID 创建到 Google API 后已修复。

https://developers.google.com/identity/sign-in/android/start-integrating#get_your_backend_servers_oauth_20_client_id

  • 1- 在 API 控制台中打开凭据页面。

  • 2- Web 应用程序类型客户端 ID 是您的后端服务器的 OAuth 2.0 客户端 ID。

在此之后,您可以重新下载您的 json 文件,android studio 将自动匹配您的字符串 id。

于 2017-04-22T10:28:24.557 回答
0

我知道现在回答已经晚了,但希望这对将来的某人有所帮助。

无需在 app.xml 中硬编码 default_web_client_id 即可访问。

要从 google-services.json 访问Android App 中的default_web_client_id,我们必须在 FireBase 项目设置下添加 SHA1 密钥。

转到 Firebase 控制台 > 打开项目 > 选择应用程序 > 添加指纹。

在此副本生成 google-services.json 到项目之后。

在此之后,您将看到 json 文件中的差异,如下所示:

前 :

"oauth_client": []

后 :

"oauth_client": [
    {
      "client_id": "23........4-asdj...........................asda.googleusercontent.com",
      "client_type": 1,
      "android_info": {
        "package_name": "com.abc.xyz",
        "certificate_hash": "asjhdashhs"
      }
    },.....

这将解决您的问题。

于 2019-08-14T12:24:35.803 回答
0

对于我的情况:库很旧,所以我去获取最后一个库:https ://firebase.google.com/docs/auth/android/firebaseui

放入依赖项:实现 'com.firebaseui:firebase-ui-auth:7.2.0'

连同目前存在的

// 导入 Firebase 平台实现平台的 BoM('com.google.firebase:firebase-bom:26.7.0')

// 使用 BoM 时,您无需在 Firebase 库依赖项实现 'com.google.firebase:firebase-auth-ktx' 中指定版本

它是固定的

于 2021-12-30T16:47:07.860 回答
0

就我而言,我忘了添加

id 'com.google.gms.google-services'

到 build.gradle(:app) 的插件

于 2020-11-11T22:28:00.927 回答
0

我也遇到了同样的问题,请确保“google-services.json”在您的应用目录中。然后只需从“ Build -> Rebuild Project ”重建项目

由于字符串资源“default_web_client_id”是自动生成的,一旦你重建项目就会被解析

于 2021-01-09T14:24:03.790 回答
-1

对我来说,问题是因为我使用的是 minSdkVersion 15,更新到 16 解决了我的问题。

于 2020-07-11T19:10:35.687 回答
-1

使用以下代码更新您的项目级 build.gradle 文件:

buildscript {
repositories {
    google()
    jcenter()
    mavenCentral()
}
dependencies {
    classpath 'com.android.tools.build:gradle:3.3.2'
    classpath 'com.google.gms:google-services:4.2.0'
}}
allprojects {
repositories {
    google()
    jcenter()
    maven { url "https://maven.google.com"}  
}}
task clean(type: Delete) {
delete rootProject.buildDir }

更多详情:answerdone.com

于 2019-07-23T20:24:09.493 回答
-1
implementation platform('com.google.firebase:firebase-bom:29.0.0')

implementation 'com.firebaseui:firebase-ui-auth:4.3.2'

将这些行放入build.gradle(projectName)

于 2021-12-26T05:33:58.847 回答
-1

我已经搜索了一整天,我已经在App中粘贴了那个json文件并重建了很多次,但是android studio仍然将它标记为ide中的错误。

解决方案:直接运行项目,忽略错误,它会工作,这是一个IDE错误。

于 2021-11-24T13:57:20.960 回答
-2

从您与 android 项目连接的 firebase 项目中再次下载 google-services.json 文件,并将其替换到 app/src 目录中。然后选择构建子菜单中的清理项目选项。这对我有用。

于 2019-03-27T15:39:25.730 回答