无法在Firebase的Android Codelab中解析符号default_web_client_id

时间:2016-06-14 11:20:30

标签: android firebase cannot-find-symbol

我正在尝试学习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。

21 个答案:

答案 0 :(得分:28)

解析google-services.json时有时会出现问题。我已经向有关团队报告了这个问题。

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

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

2)复制此客户端ID并对此.requestIdToken("your ID")

进行硬编码

这将允许请求" IdToken"通过GoogleSignInAccount发布成功的Google登录信息并使用firebase授权您的凭据。

修改

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

答案 1 :(得分:16)

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

apply plugin: 'com.google.gms.google-services文件末尾的

build.gradle

<强>解释

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

注意

请不要在default_web_client_id中添加client_id strings.xml作为其值,以避免在运行代码时出现重复错误Error: Duplicate resources

答案 2 :(得分:3)

对此答案的更新。 我有与以前相同的错误,但它不会停止我的构建。更重要的是,当我构建一个已签名的捆绑包时,似乎解决了这个问题,我检查过它只是在寻找字符串的错误路径..

上述答案都没有解决我的问题。

I found this 以及构建gradle文件中的以下步骤:

在应用级文件中(最后)

} apply plugin: 'com.google.gms.google-services'

并在项目级文件中:

 dependencies {
    classpath 'com.android.tools.build:gradle:3.0.1'
    classpath 'com.google.gms:google-services:3.1.0'

除了我的json文件需要在app文件夹中;虽然有选项可以同时拥有此文件的调试版和发行版。

我得到的唯一实际错误是gradle文件正确。然后它抱怨它找不到json文件。

在我写完之后看到了用户1523292的答案。

我又碰到了这个。似乎应用插件确实需要在文件的末尾/底部。

答案 3 :(得分:2)

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

其中一个具有 client_type 值1,另一个具有 client_type 值3 确保您指定了 client_type client_id ,其值为3

答案 4 :(得分:2)

显然R.string.default_web_client_id是从IDE版本生成的

我假设我们应该手动添加它-费时的错误

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

  

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

~~~~

  

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

所以-成功构建后,如果在IDE中搜索字符串default_web_client_id,则会看到一个结果是/ generated文件夹下的 values.xml ,并且在其中包含您的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>

答案 5 :(得分:1)

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

有问题。而是使用:

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

答案 6 :(得分:1)

我有相同或相似的问题,

确保在google-services.json中具有:

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

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

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

google-services-plugin documentation

答案 7 :(得分:1)

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

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。

答案 8 :(得分:1)

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

我注意到我的oauth_client有一个client_type为1的密钥,而这就是全部。在Google API控制台中,我只有一个Android密钥。

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

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

答案 9 :(得分:0)

经过一段时间搜索而没有直接插入null的“智能”修复程序之后,按照FirebaseUI project的回答,我只需要在client_id中添加下一行:

app/build.gradle

答案 10 :(得分:0)

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

答案 11 :(得分:0)

下载最新的google-services.json。在您的Google Cloud Credentials中为 OAuth 2.0客户端ID 提供了client_id列表。

然后检查它是否包含带有client_id的{​​{1}}。如果没有,则需要创建一个新的

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

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


带有"client_type" : 3的{​​{1}}通常位于client_id标记内,而不是"client_type" : 3oauth_client中。

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

client_id

答案 12 :(得分:0)

使用以下代码更新您的项目级别的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

答案 13 :(得分:0)

我知道答案来晚了,但希望这会在将来对某人有所帮助。

要访问,无需在应用程序中硬编码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"
      }
    },.....

这将解决您的问题。

答案 14 :(得分:0)

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

答案 15 :(得分:0)

只需尝试在模拟器或手机上运行该应用程序(Shift + F10) 然后错误将消失。

答案 16 :(得分:0)

通用的解决方案是像这样在build.gradle的末尾应用Google Play服务插件

  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'

答案 17 :(得分:0)

就我而言,我忘记添加

chectl server:deploy --platform=docker-desktop

到build.gradle(:app)插件

答案 18 :(得分:-1)

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)      
 .requestIdToken("1036904004233h4cmmfcistvfjh3phqe1peht56g.apps.googleusercontent.com")
            .requestEmail()
            .build();   

根据我的经验,您必须像在requestIdtoken中那样包含Client ID,并且您必须在string.xml中没有default_web_client_id的瞬间,这看起来很奇怪,但是在我看来,这是唯一对我有用的方法。

答案 19 :(得分:-1)

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

答案 20 :(得分:-1)

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

重建项目

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