私は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を有効にしました。
_google-services.json
_の解析中に問題が発生する場合があります。この問題を関係するチームに報告しました。
その間、以下の手順に従ってこの問題を修正し、さらに先に進みます-
1)_google-services.json
_ファイルを開く->クライアント-> oauth_client-> client_id
2)このクライアントIDをコピーし、この.requestIdToken("your ID")
をハードコードします
GoogleSignInAccount経由で「IdToken」をリクエストし、Googleログインに成功すると、firebaseを使用して認証情報を認証できます。
[〜#〜] edit [〜#〜]
プロジェクトを削除して再作成し、新しい_google-service.json
_ inをAndroidプロジェクト
より一般的な解決策は、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
laterを回避するためです。
この回答の更新。以前と同じエラーがありますが、ビルドが停止しません。さらに、署名されたバンドルを作成すると、それ自体が解決するようです。文字列の間違ったパスを探しているだけです。
上記の回答のどれも私の問題を解決しませんでした。
これを見つけました およびビルド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ファイルが見つからないと不平を言いました。
これを書いた後、user1523292の答えを見ました。
私はこれに再び遭遇しました。ファイルの場合、適用プラグインは本当に最後/下にある必要があるようです
どうやらR.string.default_web_client_id
は、IDE buildから生成されます
手動で追加することになっていると思っていた-時間のかかる間違い
https://developers.google.com/Android/guides/google-services-plugin
Google-servicesプラグインには2つの主要な機能があります。1)google-services.jsonファイルを処理し、アプリケーションのコードで使用できるAndroidリソースを生成します。
~~~~
JSON処理の主な結果は、Androidコード内のリソースJavaコードとして参照できる2つのXMLファイルを生成することです。
そして-ビルドが成功した後、IDEで文字列default_web_client_id
、/ generatedフォルダーの下にvalues.xmlという結果が表示されます。この例のように、firebase configの値があります。未満。
実際にそのファイルを見ると、ここで物事を明確にするのに役立ちました
<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>
すでにgoogle-services.json
をダウンロードして解析していますが、それでも文字列が見つかりません。
私のoauth_client
にはclient_typeが1
のキーがあり、それだけであることに気付きました。 Google APIコンソールには、Androidキーのみがありました。
したがって、APIコンソールに移動してWeb Server
キーを生成する必要があります。次に、google-services.jsonを再度ダウンロードすると、タイプが3のoauth_client
があります。
これで、プラグインはdefault_web_client_idという文字列を生成します。
Dextoの回答に加えて、もう1つ言及したいと思いますJSONファイルでは、2種類のクライアントIDを取得します
client_type value 1を持つものとclient_type value 3を持つものclient_typeのclient_idを指定したことを確認してください値は3です
classpath 'com.google.gms:google-services:4.1.0'
問題があります。代わりに使用します:
classpath 'com.google.gms:google-services:4.2.0'
同じ問題または類似した問題がありましたが、
Google-services.jsonに以下があることを確認してください。
...
"client": [
...
"oauth_client": [
...
{
"client_id": "YOUR WEB CLIENT ID",
"client_type": 3
}
...
何らかの理由で、firebaseコンソールからダウンロードしたファイルには含まれていません。
Google-services.jsonファイルにエントリを追加した後、すべてが期待どおりに機能し始めました。
このリンクを使用してGoogle APIへのバックエンドIDを作成した後に修正されました。
1- APIコンソールで認証情報ページを開きます。
2- WebアプリケーションタイプのクライアントIDは、バックエンドサーバーのOAuth 2.0クライアントIDです。
この後、jsonファイルを再ダウンロードすると、Android studioは自動的に文字列IDに一致します。
最新のgoogle-services.json
をダウンロードしてください。 client_id
のリストは、 Google Cloud Credentials のOAuth 2.0クライアントIDに存在します。
次に、client_id
に"client_type" : 3
が含まれているかどうかを確認します。そうでない場合は、新しいものを作成する必要があります。
google-services.json
を再度ダウンロードします。 client_id
に"client_type" : 3
が含まれるようになりました。プロジェクトをクリーン&リビルドして、新しいAPI構成を適用します。
client_id
を含む"client_type" : 3
は、通常services
やoauth_client
ではなく、other_platform_oauth_client
タグ内にあります。
この場合、プロジェクトをビルドできない場合は、client_id
をoauth_client
タグにコピーして、再構築してみてください。
"client": [
...
"oauth_client": [
...
{
"client_id": "YOUR WEB CLIENT ID",
"client_type": 3
}
]
]
Firebaseコンソールで設定を変更した後、.json
ファイルをもう一度ダウンロードしてください。古い構成ファイルではなく、この新しい構成ファイルを使用してください。
私は答えるのが遅いことを知っていますが、これが将来誰かを助けることを願っています。
アクセスするには、アプリでdefault_web_client_idをハードコーディングする必要はありません。
default_web_client_id in Android google-services.jsonのアプリからアクセスするには、FireBaseプロジェクトの設定の下にSHA1キーを追加する必要があります。
[Firebase Console]> [プロジェクトを開く]> [アプリの選択]> [指紋の追加]に移動します。
このコピーがプロジェクトに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"
}
},.....
これで問題が解決します。
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken("1036904004233h4cmmfcistvfjh3phqe1peht56g.apps.googleusercontent.com")
.requestEmail()
.build();
私の経験では、requestIdtokenのようなクライアントIDを含める必要があり、string.xmlにdefault_web_client_idのインスタントを含める必要はありませんが、奇妙に見えますが、私の場合はそれが唯一の方法です。
すぐにclient_id
を挿入せずに「スマート」修正を検索した後、 FirebaseUIプロジェクト からの次の回答に従って、次の行をapp/build.gradle
に追加するだけです。
implementation 'com.firebaseui:firebase-ui-auth:4.3.2'
プロジェクトレベルの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