Не удается разрешить символ default_web_client_id в Firebase Android Codelab

Я пытаюсь изучить 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 в консоли.

Ответ 1

Иногда при разборе google-services.json возникает проблема. Я сообщил об этой проблеме соответствующей команде.

Далее следуйте ниже, чтобы исправить эту проблему, чтобы продолжить.

1) Откройте google-services.json файл → клиент → oauth_client → client_id

2) Скопируйте этот идентификатор клиента и его код .requestIdToken("your ID")

Это позволит запросить "IdToken" через GoogleSignInAccount после успешного входа в Google и авторизации ваших учетных данных с помощью firebase.

ИЗМЕНИТЬ

Попробуйте удалить и воссоздать проект и повторно импортировать новый google-service.json в проект Android

Ответ 2

Более общим решением было бы добавить 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 позже при запуске вашего кода.

Ответ 3

ОБНОВЛЕНИЕ ЭТОГО ОТВЕТА. У меня та же ошибка, что и раньше, но она не останавливает мою сборку. Более того, кажется, что это разрешается, когда я создаю подписанный пакет, я проверил, что он просто ищет неправильный путь для строки..

ни один из приведенных выше ответов не решил мою проблему.

Я нашел этот и следующие шаги в файлах сборки 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 файл должен быть в папке приложения; хотя есть варианты иметь как отладочную, так и выпускную версию этого файла.

Единственная фактическая ошибка, которую я получил, была, когда файлы gradle были правильными. Затем он пожаловался, что не может найти файл json.

Увидел user1523292 ответ после того как я написал это.

Я столкнулся с этим снова. похоже, что подключаемый модуль действительно должен быть в конце/конце файла.

Ответ 4

Очевидно, 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, которые вы можете ссылаться как ресурсы Android в своем коде Java.

И так - после успешной сборки, если вы будете искать в IDE строку default_web_client_id, вы увидите, что один из результатов - values.xml в папке /generate, и там есть значения для вашей конфигурации 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

У меня уже есть google-services.json загруженный и разобранный, но он все равно не находит строку.

Я заметил, что у моего oauth_client был ключ с client_type 1 и все. В консоли Google API у меня был только Android-ключ.

Итак, вам нужно перейти в консоль API и сгенерировать ключ Web Server. Затем снова загрузите свой google-services.json, и у вас будет oauth_client с типом 3.

Теперь плагин создаст строку с именем default_web_client_id.

Ответ 6

В дополнение к ответу Dexto я хотел бы упомянуть еще одну вещь. В файле JSON вы получите два вида идентификатора клиента.

Один, который имеет значение client_type 1, а другой со значением client_type 3 Убедитесь, что вы указали client_id для client_type со значением 3

Ответ 7

Исправлено после использования этой ссылки для создания моего идентификатора бэкенда в Google API.

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

  • 1- Откройте страницу учетных данных в консоли API.

  • 2- Идентификатор клиента типа веб-приложения - это идентификатор клиента OAuth 2.0 вашего внутреннего сервера.

После этого вы можете повторно загрузить файл json, и Android Studio автоматически сопоставит ваш строковый идентификатор.

Ответ 8

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

есть проблема. вместо этого используйте:

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

Ответ 9

У меня была такая же проблема или похожая,

Убедитесь, что в вашем google-services.json у вас есть:

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

По какой-то причине файл, загруженный из консоли Firebase, не включает его.

После добавления записи в файл google-services.json все стало работать как положено.

Документация по плагину google-services

Ответ 10

Попробуйте загрузить файл .json снова после изменения конфигурации в консоли Firebase. Используйте этот новый конфигурационный файл, а не старый.

Ответ 11

После некоторого времени поиска "умного" исправления без вставки непосредственно client_id, следуя этому ответу из проекта FirebaseUI, мне просто нужно добавить следующую строку в app/build.gradle:

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

Ответ 12

Ну, я прочитал все комментарии, большинство из которых хороши и имеют простое решение. Но это трудно понять, поэтому я загрузил видео об этом простом решении.

Видео об ошибке default_web_client_id

Ответ 13

Загрузите ваш новейший google-services.json. Список client_id присутствует для идентификаторов клиентов OAuth 2.0 в ваших учетных данных Google Cloud.

Затем проверьте, содержит ли он client_id с "client_type": 3 или нет. Если нет, вам нужно создать новый:

  1. Откройте страницу учетных данных в консоли API.
  2. Нажмите Создать учетные данныеИдентификатор клиента OAuth. Затем выберите тип веб-приложения.
  3. Подождите 2-3 минуты, обновите консоль Firebase и снова загрузите ваш google-services.json. Он должен содержать client_id с "client_type": 3 сейчас.

Очистите и перестройте ваш проект, чтобы применить новые настройки API.


client_id с "client_type": 3 обычно находится внутри тега oauth_client, а не services или other_platform_oauth_client.

Если вы попали в этот случай и не можете собрать проект, попробуйте скопировать ваш client_id в тег oauth_client и перестроить заново.

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

Ответ 14

Обновите файл 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

Ответ 15

Я знаю, что уже поздно отвечать, но надеюсь, что это поможет кому-то в будущем.

Для доступа нет необходимости жестко кодировать default_web_client_id в приложении.

Чтобы получить доступ к default_web_client_id в Android-приложении из google-services.json, нам нужно добавить ключ SHA1 в настройках проекта FireBase.

Перейдите в Консоль Firebase> Откройте проект> Выберите приложение> Добавить fingerprint.

После этого копия сгенерирована 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"
      }
    },.....

Это решит вашу проблему.

Ответ 16

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

По моему опыту, вы должны включить идентификатор клиента, как это в requestIdtoken, и у вас не должно быть мгновенного значения default_web_client_id в string.xml, это выглядит странно, но в моем случае, что единственный метод работает для меня.

Ответ 17

Снова загрузите файл google-services.json из проекта firebase, который вы подключили к своему проекту Android, и замените его в каталоге app/src. И затем выберите опцию чистого проекта, которая находится в подменю сборки. Это сработало для меня.