Не удается разрешить символ 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
После этого вы можете повторно загрузить файл 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
или нет. Если нет, вам нужно создать новый:
- Откройте страницу учетных данных в консоли API.
- Нажмите Создать учетные данные → Идентификатор клиента OAuth. Затем выберите тип веб-приложения.
- Подождите 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. И затем выберите опцию чистого проекта, которая находится в подменю сборки. Это сработало для меня.