web-dev-qa-db-ja.com

build.gradleのGoogleサービス3.0.0およびMaps APIキーでapi_key / currentキーがありません

私の問題は Googleサービス3.0.0でapi_key/current keyが見つからない に非常に似ていますが、さらに複雑です。

今朝、アプリをcom.google.gms:google-services:3.0.0とすべてのplay-services 9.0.0の依存関係に更新しました

compile 'com.google.Android.gms:play-services-analytics:9.0.0'
compile 'com.google.Android.gms:play-services-ads:9.0.0'
compile 'com.google.Android.gms:play-services-identity:9.0.0'
compile 'com.google.Android.gms:play-services-gcm:9.0.0'

今、私は悪名高いエラーを取得します

エラー:タスク ':hotelsclick:processDebugGoogleServices'の実行に失敗しました。 > api_key/current_keyオブジェクトがありません

これは、google-services.jsonファイルにAPIキーがないためと思われます(だから私は言われました)。 https://developers.google.com/cloud-messaging/Android/client#get-config から新しいAPIキーを取得し、その中に次のフィールドが見つかりました。

  "api_key": [],

Google Maps APIキーをそこに置くべきだと思いますが、ここで私が経験している二重の問題があります:

1-キーをそのフィールド内に配置しようとしても、機能しません。私は両方で試しました

  "api_key": [{ "current_key": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-AE" }],

そして

  "api_key": ["XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-AE"],

エラーは同じままです。

2-ダイナミックビルディングを使用するためにgradleを使用しています。私は自分のモジュールbuild.gradleに以下を入れました:

buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
        debuggable false
        resValue "string", "google_maps_api_key", "ABCDEFGHILMNO... my maps release API key"
        proguardFiles getDefaultProguardFile('proguard-Android.txt'),
                'proguard-rules.pro'
        zipAlignEnabled true
    }
    debug {
        resValue "string", "google_maps_api_key", "ZNTMRNCDNR... my google maps debug API key"
        debuggable true
        proguardFiles getDefaultProguardFile('proguard-Android.txt'),
                'proguard-rules.pro'
    }
}

私が持っているAndroidmanifest.xmlファイル

    <meta-data
        Android:name="com.google.Android.geo.API_KEY"
        Android:value="@string/google_maps_api_key" />

現在、Googleサービス3.0.0に更新するまでは常に機能していますが、なぜ機能しないのかわかりません。コンパイルされたbuild.gradleファイルから適切なAPIキーを取得してマニフェストに入れるべきではありませんか?

私の二重の質問は次のとおりです。動的APIキーの取得が機能しないのはなぜですか。そして、どうすればこれを修正できますか?

ありがとうございました

35
Marco Zanetti

次のように空の「current_key」を入れてみましたか?

"api_key": [{ "current_key": "" }]

それがどうなるかを見てください。

編集: "api_key":[]("client"にある)を "api_key":[{"current_key": ""}]に置き換える必要があります

72
Nitrodbz

ここで答えられていないこれらのステップで、この問題を解決することができました。この回答は、クラウドメッセージングを有効にするものではなく、サーバーキーを取得するだけです。 (答えがまったくないのに「重複」であるために私の回答が削除されたために明確化)。

まず、Firebase Consoleに移動し、次に[プロジェクト設定]に移動して、[クラウドメッセージング]タブをクリックします。 「サーバーキー」と表示されている場所を見て、(「送信者ID」番号ではなく)長いキーが表示されていない場合は、「キーの再生成」をクリックすると長いキーが表示されます。そのキーをコピーして、次のgoogle-services.jsonファイルに配置します:"api_key": [ {"current_key" : "key goes here"} ]

この方法は、他の誰も働いていなかったときに役立ちました。

9
David Velasquez

新しいビルドツールを使用した後に直面するこの問題classpath 'com.google.gms:google-services:3.0.0'

「google-services.json」を再作成するだけです。うまくいけば解決します。

4
Sadman Samee

キーを誤って削除した場合、または元に戻せない場合は、新しいapi資格情報を作成します here に、「Androidキー(Googleサービスにより自動作成)」と正確に名前を付けます。これにより、資格情報がgoogle-services jsonに戻されます。

1
droidpl

Android Studio には、ビルドタイプとフレーバーの概念があり、これらを使用して必要なものを取得できます。ビルドタイプはアプリの異なるバージョンであり、機能的には同じですが、デバッグコードが異なる場合があります。デフォルトでは、すべてのAndroid Gradleプロジェクトにはデバッグおよびリリースビルドタイプがあります。

さらに、プロジェクトに Google Mapsアクティビティ を追加し、Android Studioが必要なファイルを生成します。挿入する必要があるのは キー

Gradleを使用しているため、次のことができます。

build.gradle

Android {
.. .. ...
buildTypes {
debug {
resValue "string", "google_maps_api_key", "[YOUR DEV KEY]"
}
release {
resValue "string", "google_maps_api_key", "[YOUR PROD KEY]"
}
}
}

AndroidManifest.xml

meta-data
Android:name="com.google.Android.maps.v2.API_KEY"
Android:value="@string/google_maps_api_key"/>

この方法では、AndroidManifest.xmlが1つしかなく、ビルドタイプに基づいて値を設定します。

このマニフェストプレースホルダーを確認することもできます: http://tools.Android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC-Placeholder-support

0

クラウドメッセージングを使用せずに有効にして、新しいjsonファイルを生成する必要があります。クラウドメッセージングを有効にすると、必要なAPIキーが取得されます。

他のサービスが必要な場合は、これを参照してください: https://stackoverflow.com/a/37358432/440881

0