J'essaie d'apprendre Firebase, alors je suis passé par le Codelab Android. Le projet qu'ils m'ont donné a cependant eu une erreur:
Impossible de résoudre le symbole default_web_client_id
Et je ne savais pas comment le résoudre car je ne connaissais pas la valeur de default_web_client_id
ni ce que c'est. C'est dans la méthode 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();
}
Je n'ai aucune idée de ce que c'est, quelle est sa valeur et pourquoi cela me donne-t-il cette erreur. Jusqu'à présent, je n'ai rien changé sauf l'ajout du google-services.json
. J'ai ajouté mon SHA-1 et activé Google dans la console.
Parfois, il y a un problème lors de l'analyse google-services.json
. J'ai signalé ce problème à l'équipe concernée.
En attendant, suivez les étapes ci-dessous pour résoudre ce problème et aller plus loin -
1) Ouvrez le fichier google-services.json
-> client -> oauth_client -> client_id
2) Copier cet ID client et coder en dur cette .requestIdToken("your ID")
Cela permettrait de demander "IdToken" via GoogleSignInAccount après la connexion à Google avec succès et d'autoriser vos informations d'identification avec firebase.
MODIFIER
Essayez de supprimer et de recréer le projet et de réimporter le nouveau google-service.json
dans votre projet Android.
Une solution plus générique consisterait à ajouter le google-services.json
dans le répertoire racine de l'application.
Et ajouter
apply plugin: 'com.google.gms.google-services
à la fin du fichier build.gradle
.
Explication
Lorsque l'application crée les chaînes de paires clé-valeur à partir du fichier de configuration google-services.json
, elles sont ensuite placées dans le fichier values.xml
pour les rendre globalement disponibles pour une utilisation à partir de n'importe où dans votre code. Cela nous évite de coder en dur le client_id dans votre code.
Remarque
N'ajoutez pas le default_web_client_id
avec client_id
comme valeur dans le strings.xml
afin d'éviter l'erreur de duplication, Error: Duplicate resources
à partir de quand vous exécuterez votre code.
aucune des réponses ci-dessus n'a résolu mon problème.
J'ai trouvé ceci Et les étapes suivantes dans les fichiers de niveaux de construction:
dans le fichier de niveau d'application (à la fin)
} apply plugin: 'com.google.gms.google-services'
et dans le fichier de niveau de projet:
dependencies {
classpath 'com.Android.tools.build:gradle:3.0.1'
classpath 'com.google.gms:google-services:3.1.0'
En plus de cela, mon fichier json devait être dans le dossier de l'application; bien qu'il existe des options, il existe une version de débogage et une version finale de ce fichier.
La seule erreur réelle que j'ai eu était une fois que les fichiers de classement étaient exacts. Ensuite, il s'est plaint de ne pas avoir trouvé le fichier JSON.
Vu la réponse de user1523292 après avoir écrit ceci.
Je me suis encore heurté à cela. il semble que le plugin apply doit vraiment se trouver à la fin/au bas du fichier.
Apparemment, R.string.default_web_client_id
est généré à partir de la construction IDE
_ {J'avais supposé que nous étions supposés l'ajouter manuellement - erreur fastidieuse} _
https://developers.google.com/Android/guides/google-services-plugin
Le plugin google-services a deux fonctions principales: 1) Traiter le fichier google-services.json et de produire des ressources Android qui peuvent être utilisé dans le code de votre application.
~~~~
Le résultat principal du traitement JSON est de produire deux fichiers XML que vous pouvez référencer en tant que ressources Android dans votre code Java.
Et ainsi - après la construction réussie, si vous recherchez la chaîne default_web_client_id
dans le IDE, vous verrez un des résultats est values.xml sous le dossier/created, et il contient les valeurs de votre configuration firebase comme l'exemple ci-dessous.
_ {En fait, voir ce fichier a aidé à clarifier les choses ici} _
<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>
J'ai déjà téléchargé et analysé google-services.json
, mais il ne trouve toujours pas la chaîne.
J'ai remarqué que mon oauth_client
avait une clé avec client_type de 1
et c'est tout. Dans la console API Google, je n'avais qu'une clé Android.
Vous devez donc accéder à la console de l'API et générer une clé Web Server
. Ensuite, téléchargez à nouveau votre fichier google-services.json et vous obtiendrez un oauth_client
de type 3.
Maintenant, le plugin va générer une chaîne appelée default_web_client_id.
En plus de la réponse de Dexto, je voudrais mentionner une dernière chose Dans le fichier JSON, vous obtiendrez deux types d'identifiant client.
Une qui a type_client valeur 1 et une autre avec type_client valeur 3 Assurez-vous que vous avez spécifié le id_client de type_client qui a la valeur 3
Essayez de télécharger à nouveau votre fichier .json
après avoir modifié la configuration dans la console Firebase. Utilisez ce fichier de configuration plus récent, pas l'ancien.
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken("1036904004233h4cmmfcistvfjh3phqe1peht56g.apps.googleusercontent.com")
.requestEmail()
.build();
dans mon expérience, vous devez inclure l'ID client comme dans requestIdtoken et ne pas avoir un instant de default_web_client_id dans string.xml, cela a l'air bizarre mais dans mon cas, c'est la seule méthode qui fonctionne pour moi.