无法解析符号 default_web_client_id GoogleSignInOptions Android Firebase

Posted

技术标签:

【中文标题】无法解析符号 default_web_client_id GoogleSignInOptions Android Firebase【英文标题】:Cannot resolve symbol default_web_client_id GoogleSignInOptions Android Firebase 【发布时间】:2019-06-16 19:40:08 【问题描述】:

我的项目在过去六个月内运行良好,并且应用在 Play 商店中。对于更新,我重新打开项目显示以下代码的 default_web_client 未解析。

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

我尝试以下方法,

1.清理重建

2.清除缓存并重启

3.设置getString(R.string.default_web_client_id)为空字符串并运行项目生成

app/build/generated/res/google-services/build_type/values/values.xml

文件作为来自this链接的指令

4.用getString(R.string.default_web_client_id)替换空字符串

现在我可以运行该项目,也可以进行发布构建。但是,仍然无法解析符号 default_web_client_id。

任何更新都会有所帮助...

注意:直接添加oauth_client->client_id会报错

W/GoogleActivity: Google sign in failed
    com.google.android.gms.common.api.ApiException: 12500: 
        at com.google.android.gms.common.internal.ApiExceptionUtil.fromStatus(Unknown Source) 

【问题讨论】:

签出this。 @AlexMamo 我也尝试过,但在应用启动时会崩溃 出现什么错误? @AlexMamo 现在卸载和安装后不会显示任何崩溃 您是否也尝试将clientID 作为参数而不是R.string.default_web_client_id) 传递? 【参考方案1】:

我也遇到了和你一样的问题。更新 Android Studio 后,出现错误。 无需修复,因为 Google 试图让您的应用越来越安全。如果您尝试为 default_web_client_id 创建另一个值,它将显示错误重复变量。 查找 default_web_client_id 的值 * 将模式更改为 Project -> app -> build -> generated -> google-services -> debug -> values -> values.xml。 因此,这在编译时不会导致错误,您无需修复它。让谷歌稍后修复它:D

【讨论】:

【参考方案2】:

我已将 Google 服务版本更新到项目级别 build.gradle 中的最新版本并且工作正常

classpath 'com.google.gms:google-services:4.2.0

【讨论】:

【参考方案3】:

我的代码也遇到了同样的问题

Cannot resolve symbol 'default_web_client_id'

我尝试使用 clientID 作为参数而不是 R.string.default_web_client_id)

.requestIdToken(*My Client Id*)

并在调试代码中得到以下内容

W/System.err: com.google.android.gms.common.api.ApiException: 12500:

我已将 google 服务更新到最新的项目级 build.gradle (google-serivces:4.2.0)

!对我有用的解决方案!

    登录Developer Console

    凭据 > 创建凭据 >API 密钥

    从 Firebase 下载新的 google-services.json (项目概述 > 用户和权限 > 常规 向下滚动 将新的 google-services.json 加载到 Project>app 中 将客户端 ID 替换为从 google-services.json oauth_client>client_id 生成的新 ID 注意:将客户端 ID 与 client_type 3 一起使用
.requestIdToken(*My New Client Id*)

6.运行您的应用程序:)

【讨论】:

还要注意,default_web_client_id 在 values.xml 中 Qaleem Hussain : 如何以编程方式访问 values,xml 中的默认 Web 客户端 ID? 包视图 > 应用程序 > 值 > values.xml 不,我的意思是编程方式,在 JAVA 代码中,例如:getResources.getString(R.string.STRING_ID);【参考方案4】:

从 google 服务返回到以前的类路径版本:在我的情况下,我必须从类路径 'com.google.gms:google-services:4.3.10' 更改为类路径 'com.google.gms:google- services:4.3.8' 在 build.gradle 面板中。 有时 google 服务更新无法正常工作,这让开发人员很头疼。

【讨论】:

【参考方案5】:

这对我有用:

    转到Google API Console并选择您想要的项目

    查看 OAuth 2.0 客户端 ID。如果您还没有创建一个 Web 客户端 api,请键入 Web Client,您必须创建一个。

    转到 Firebase 控制台、项目设置并下载 google-service.json 文件

    替换项目中的 google-service 文件。

    尝试编译。也许值得清理项目甚至缓存。如果仍然失败,那么:

    您没有在项目成绩文件中正确应用google services plugin

    google-service-plugin 未生成资源,因为它找不到默认 ID。这种情况发生在我身上,不知道为什么。

    web_default_client 是从 oauth_client 元素内的类型 3 密钥生成的。 com.google.gms:google-services:4.3.2 的 json 文件应该是这样的:

"oauth_client": [
        
          "client_id": "...",
          "client_type": 1,
          "android_info": 
          "package_name": "...",
          "certificate_hash": "..."
        
      ,
    
      "client_id": "<put here the Web type Oauth cliend id>,
      "client_type": 3
    
]

如果数组中没有client_type 3节点,添加它。

一个更简单的方法是直接传递token id,像这样:

val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(<put here the Oauth client ID for Web Application type>) but is not good if you have different firebase projects at different flavors.

注意事项:

Firebase 自动创建名为“Web 客户端(由 Google 服务自动创建)”的 Web 类型 OAuth ID。无法从 firebase 重新创建。 当您向 Firebase 项目添加新指纹时,会自动创建 Android 类型 OAuth id。

【讨论】:

【参考方案6】:

在做任何事情之前,我从 Firebase> 项目设置下载了最新的 google-services.json 文件,并将其替换为项目文件夹中的文件。重建项目,它就消失了。

【讨论】:

【参考方案7】:

我只打开了 res(生成)> values > values.xml 仅此而已,错误结束。

xxxxxxxx.apps.googleusercontent.com

【讨论】:

【参考方案8】:

这些解决方案都不适合我

我试图将插件放在我的 build.gradle 和其他解决方案的底部。

对我有用的是以编程方式访问default_web_client_id 字符串。

在 kotlin 中我创建了一个扩展来获取资源字符串

fun Context.getStringFromName(name: String): String 
 return getString(
    resources.getIdentifier(
        name,
        "string",
        packageName
    ))

然后

val defaultWebClientId = context.getStringFromName("default_web_client_id")

对我来说就像魅力一样!

【讨论】:

以上是关于无法解析符号 default_web_client_id GoogleSignInOptions Android Firebase的主要内容,如果未能解决你的问题,请参考以下文章

无法解析的外部符号

ACE编程,无法解析外部符号

error LNK2001: 无法解析的外部符号

error LNK2019: 无法解析的外部符号

C++无法解析的外部符号

error LNK2019: 无法解析的外部符号