Google Maps Android API v2 Authorization failure


95

私のステップ:

  • debug.keystoreからSHA1コードを取得
  • Google APIコンソールでアプリを作成する
  • 有効なGoogleマップAPI v2
  • input SHA1; my.package.name
  • APIキーを取得
  • 作成されたAndroidManifestファイル:

        <permission
                android:name="my.package.name.permission.MAPS_RECEIVE"
                android:protectionLevel="signature"/>
    
        <uses-permission android:name="my.package.name.permission.MAPS_RECEIVE"/>
    
        <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15"/>
    
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
        <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    
        <uses-feature android:glEsVersion="0x00020000" android:required="true"/>
    
        <application android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:hardwareAccelerated="true">
    
            <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="MY_API_KEY_HERE" />
    
            <activity android:name="MyActivity"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
            </activity>
        </application>
    </manifest>
  • 作成されたレイアウト

  • 「google-play-services.jar」をlibsに配置

コンパイル後、クラッシュしました:

  ERROR/AndroidRuntime(10182): FATAL EXCEPTION: main
                java.lang.NoClassDefFoundError: com.google.android.gms.R$styleable
                at com.google.android.gms.maps.GoogleMapOptions.createFromAttributes(Unknown Source)
                at com.google.android.gms.maps.MapFragment.onInflate(Unknown Source)
                at android.app.Activity.onCreateView(Activity.java:4716)
                at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:466)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
                at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270)
                at android.app.Activity.setContentView(Activity.java:1881)
                at com.example.gm2.MyActivity.onCreate(MyActivity.java:16)
                at android.app.Activity.performCreate(Activity.java:5104)
                at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
                at android.app.ActivityThread.access$600(ActivityThread.java:141)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
                at android.os.Handler.dispatchMessage(Handler.java:99)
                at android.os.Looper.loop(Looper.java:137)
                at android.app.ActivityThread.main(ActivityThread.java:5039)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:511)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
                at dalvik.system.NativeStart.main(Native Method)

その後、レイアウトを次のように変更しました。

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:id="@+id/map"
             android:layout_width="match_parent"
             android:layout_height="match_parent" />

MyActivityを

  super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();

    transaction.add(R.id.map, MapFragment.newInstance());           
    transaction.commit();

その結果、アプリは起動しましたが、地図が見えませんでした。

コンソールログ:

ERROR/Google Maps Android API(10369): Authorization failure.

1
ああ、神様!私はいつも同じエラーR $ stylableクラスが見つかりませんでした。これで、コードをあなたのプログラム的な方法に変更して、MapFragmentを実装しました。ありがとう!ただし、以下のようにキーを作成する必要があります
Informatic0re

回答:


103

手順

  • デバイスにGoogle Play開発者サービスのAPKがあることを確認する
  • Google Play Service revをインストールします。2以上

ここに画像の説明を入力してください

  • でプロジェクトを作成する https://code.google.com/apis/console/で
  • 「Google Maps Android API v2」を有効にする ここに画像の説明を入力してください
  • プロジェクトにSHA1を登録するには(今、SHA1; your.app.package.nameを書き込む必要があります)APIコンソールがあります)ため、APIキーを取得します
  • ANDROID_SDK_DIR / extras / google / google_play_services / libproject / google-play-services_libをプロジェクトのルートにコピーする
  • YOUR_PROJECT / project.propertiesに次の行を追加する

android.library.reference.1=google-play-services_lib

  • 次の行を YOUR_PROJECT/proguard-project.txt

-keep class * extends java.util.ListResourceBundle {

   protected Object[][] getContents();

}

これで、Android用のGoogle Map API V2を使用して独自のGoogleマップアプリを作成する準備ができました。

最小SDK = 8でアプリケーションを作成する場合は、MapFragmentの代わりにAndroidサポートライブラリv4 + SupportMapFragmentを使用してください。


これらの指示はすべての仕事をしませんでした。maps APIサンプルアプリケーションからproguard.cfgをコピーする必要がありました。それから、それは働き始めました。
Yoel Gluschnaider 2012

また、署名アルゴリズムはSHA256withRSAではなくSHA1withRSAでなければならないことに気付きました(Eclipseがデバッグキー用に作成したデフォルト)。
Yoel Gluschnaider 2012

1
ありがとう!to enable "Google Maps Android API v2" -stepで問題が解決しました。
ヨハン

1
@YoelGluschnaider:デフォルトのアルゴリズムをSHA256withRSAからSHA1withRSAに変更するにはどうすればよいですか?
Santhosh 2013年

ありがとうございました!SupportMapFragmentを使用するというあなたのアイデアに助けられました。
Ilya Kogan 2013年

35

また、この投稿を確認してください:Google Map Android Api V2サンプルコードが機能していません。正しい手順を実行して2番目の回答に従っている場合は、認証がどこかにキャッシュされ、アプリケーションを手動でアンインストールしてみてください(通常のアプリケーション)次にプロジェクトを「実行」します


6
私はそれがうまくいったとは信じられません。ありがとう@Alejandro del Rio :)
phil

私と同じように、ここにいる人々の90%は本当にこの回答を望んでおり、選択された回答は望んでいないに
違い

私の場合、ログに認証エラーメッセージが表示されたStackoverflowを読んでいる間に、キャッシュ(?)が更新されました。アプリはwhile画面で実行されていましたが、数分後にマップが読み込まれ、認証エラーはなくなりました。再インストールもそれをしたと思います。
ジョン

2
将来の読者のために。とを削除bingenます。クリーン、再構築、およびキャッシュされた資格情報が更新されます。
George Daramouskas、2015

20

APIを機能させるために多くの時間を無駄にしただけなので、Map API v2の段階的な検証を試みます。

ステップ1:APIキーを申請する

Google APIコンソールに慣れていない場合は、上記のRusfearuthの非常に良い答えを読んでください。

ステップ2:SHAハッシュを確認します(この場合は、Eclipseのデバッグキーを使用します)。

Windowsマシンでは、コマンドプロンプトでユーザーディレクトリにアクセスします。

C:\Users\you>keytool -list -alias androiddebugkey -keystore .android\debug.keyst
ore -storepass android -keypass android

次のようなものが得られます:

androiddebugkey, 15.10.2012, PrivateKeyEntry,
Zertifikat-Fingerprint (SHA1): 66:XX:47:XX:1E:XX:FE:XX:DE:XX:EF:XX:98:XX:83:XX:9A:XX:23:A6

次に、マップアクティビティのパッケージ名を確認します(例:com.example.mypackagename)。

これを組み合わせて、Google APIコンソールの設定と確認します。

66:XX:47:XX:1E:XX:FE:XX:DE:XX:EF:XX:98:XX:83:XX:9A:XX:23:A6;com.example.mypackagename

APIキーを取得する場所:

AZzaSyDhkhNotUseFullKey49ylKD2bw1HM

ステップ3.マニフェストメタデータ

メタデータが存在し、正しいキーが含まれているかどうかを確認してください。アプリをリリースする場合は、別のキーが必要です。

    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="AZzaSyDhkhNotUseFullKey49ylKD2bw1HM" />
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />

ステップ4.マニフェスト機能:

map APIはいくつかのグラフィックサポートを必要とするため、このエントリが必要です。

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

心配しないでください。99.7%のデバイスがこれをサポートしています。

ステップ5.マニフェストライブラリ:

googleライブラリを追加します。

    <uses-library
        android:name="com.google.android.maps"
        android:required="false" /> // This is required if you want your app to start in the emulator. I set it to false also if map is not an essential part of the application.

ステップ6.マニフェスト権限:

パッケージ名を2回確認します。com.example.yourpackage

<permission
    android:name="com.example.yourpackage.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.example.yourpackage.permission.MAPS_RECEIVE" />

次の権限を追加します。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

次の権限はオプションであり、マップを表示するだけの場合は必要ありません。それらを使用しないようにしてください。

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

ステップ7.マップフラグメントをレイアウトに含める:

<fragment
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    class="com.google.android.gms.maps.SupportMapFragment"
    map:cameraTargetLat="47.621120"
    map:cameraTargetLng="-122.349594"
    map:cameraZoom="15" />

2.x Androidバージョンへのリリースの場合、アクティビティにサポートを追加する必要があります。

import android.support.v4.app.FragmentActivity;

マップの場合:機能するエントリーには、

xmlns:map="http://schemas.android.com/apk/res-auto"

アクティビティレイアウト(例:LinearLayout)。

私の場合、レイアウトで何かを変更するたびにプロジェクトをクリーンアップする必要があります。バグのようです。

ステップ8:Eclipse-Project-Cleanを使用します。

楽しい!


私はあなたの手順に従っていますが、APIキーのエラー、解決策はありますか?
Hemantvc 2013年

1
<meta-data android:name = "com.google.android.maps.v2.API_KEY" android:value = "AZzaSyDhkhNotUseFullKey49ylKD2bw1HM" />の+1
The-null-Pointer- 2017

16

ANDROID-SDK-DIRECTORY / extras / google / google_play_services / libprojectにあるライブラリプロジェクトを使用する必要があります

これで最初の問題が修正されます。

2番目はわかりませんが、1番目の副作用の可能性があります。私はまだ自分のアプリで地図を機能させようとしています:)


extras / google / google_play_services / libproject / libs / google-play-services.jarをMY_PROJECT / libsにコピーしました。
Rusfearuth

それは十分ではありません。多くのリソースが含まれているため、ライブラリプロジェクト全体を使用する必要があります。Eclipseでは、新しいAndroidプロジェクトをインポートして、libprojectディレクトリを指定するだけです。次に、独自のプロジェクトのプロパティに、参照を追加します。
スコットケネディ

私はEclipseを使用しません(アイデアを使用)
Rusfearuth

ライブラリプロジェクトがIdeaでどのように機能するかはわかりませんが、blogs.jetbrains.com / idea / 2010/09 /…にはその情報が必要です。
スコットケネディ

17
それが機能しなかった理由を見つけました。Google Map Android API v2サービスの代わりにGoogle Map API v2をオンにしました。=(Shame on me ....
Rusfearuth

5

今日、私はこの問題に直面しました。私はAndroid Studio 2.1.3、Windows 10を使用しました。デバッグ中は正常に機能しますが、リリースモードに更新すると機能しません。私はすべてのプロガード条件をクリアして更新しましたが、これは解決策ではありませんでした。

ソリューションはプロジェクトの構造に関連しています。google_maps_api.xmlファイルは、app \ src \ debug \ resとapp \ src \ release \ resで異なりました。デバッグからリリースフォルダーに手動でコピーして貼り付けました。

今では動作します。


4

私は、すべてではないにしても、上記のGunnar Bernsteinの提案のほとんどに従いましたが、それでも機能しませんでした。しかし、私が彼の提案と次のことを実行した後、それは機能し始めました:

  1. Android Studioの右クリックオプションリストを使用して、新しいMapActivityを作成しました。新規-> Google- > Googleマップアクティビティ

  2. 次に、自動的に生成されるgoogle_maps_api.xmlファイルを開き、上記のリンクを使用して新しいAPIキーを作成しました。すべての手順を実行し、現在のプロジェクトに新しいキーを保存しました。次に、不要になった古い登録済みAPIキーを削除しました。

  3. マニフェストファイルの下で、android:value="@string/google_maps_keyKEYを直接指定する代わりに、古いAPI KEY値をこの新しいXMLファイルによって作成された文字列ショートカットに置き換えました: "

  4. 最後に、新しいMapActivityを削除しますが、そのプロセスで作成されたxmlファイルは保持します。

注:この方法でAPIキーを作成すると、[資格情報]の[制限]列に「Androidアプリ」と表示されます。以前は、機能しなかったときに、「Androidアプリ、1 API」または同様のものが列に記載されていました。これが違いを生むかどうかはわかりません。 注:いいえ、それはこのAPIキーに対して特定のAPIが選択されていないことを意味します(コンソール-> APIキー->キー制限-> API制限)。

注:マニフェストファイルの下のメタデータタグのように見えます。

android:name="com.google.android.maps.v2.API_KEY

に置き換えられました:

android:name="com.google.android.geo.API_KEY"

どちらも使用できると思いますが、最初から後者を使用する方が良いでしょう。

注:build.gradleファイルのandroid- > defaultConfig-> applicationIdに記載されている値は、[認証情報]ページの[ パッケージ名]テキストと一致する必要があります。


これは私に何が起こったのか、そしてこの解決策はコンソールからの警告を修正しました。どういうわけか、Ionicビルドはそれを変更しました。
宇宙飛行士2018

8時間検索した後、このソリューションを振り返って適用します。Solved!!!
meyasir

3

これをマニフェストファイルに追加するだけです。

**<uses-library android:name="com.google.android.maps" />**

例えば...

<application
    android:icon="@drawable/icon"
    android:label="@string/app_name" >
    <uses-library android:name="com.google.android.maps" />

    <activity
        android:name=".California"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

そして、あなたのグーグルプレイサービスlibを更新してください...ウィンドウに行く-> AndroidのSDKマネージャ->グーグルプレイサービスを更新...それをインストールしました..古いものを削除し、これを保持します。ANDROID-SDK-DIRECTORY / extras / google / google_play_services /から取得する

ありがとうございます。投票してください


3

マニフェストとアプリでパッケージ名を確認することでこのエラーを解決しましたbuild.gradle

マニフェスト:

私はパッケージ名を次のように使用しています:

com.app.triapp

アプリのbuild.gradleで:

 defaultConfig {

        applicationId "com.app.live"
    }

に変更しcom.app.triappた後build.gradle、私の問題を解決しました。


1
どうもありがとう。あなたは私のトンの時間を節約します。
YeeKhin

1
優秀な仲間 私はこれではなく、すべてが大丈夫です
Mubashar Javed 2017

2

GoogleマップのV1からV2に移行しています。Eclipse経由でアプリを実行しようとすると、このエラーが発生しました。私の根本的な原因は、Eclipseで実行したときに使用されるAndroidデバッグキーストアではなく、リリース証明書キーストアを使用していたことです。次のコマンド(OSX / Linux)は、デバッグキーストアのSHA1キーを取得します。

keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

代わりにWindows 7を使用している場合は、次のコマンドを使用します。

keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android

Androidはセキュリティ認証情報をキャッシュするため、新しいキーを試す前に、デバイスからアプリを完全にアンインストールすることをお勧めします。


1

「java.lang.NoClassDefFoundError:com.google.android.gms.R $ styleable」

Aにもこのエラーがありました:ファイル->インポート->既存のAndroidコードをワークスペースに->ブラウズ-> Android SDK->エクストラ-> google-> google_play_services-> lib_project-> google_play_services_libそしてOK。プロジェクトを確認して終了します。

プロジェクトはパッケージエクスプローラーに移動します。次に、プロジェクトに移動します(エラーあり)->プロパティ-> Androidで、ライブラリで[追加]をクリックします。google_play_services_libが表示されます。追加してもう一度お試しください:)


1

私は同じ問題を持っていたが、それは私がほぼ同様のパッケージ名と同じSHA-1フィンガープリントを持つ2つの異なるマップのAPIキーを作成したので、それがあったことが判明com.bla.blaし、他のcom.bla.bla.something


0

私はまったく同じ問題があり、MapsApiV2のライブラリプロジェクトのSDKをAndroid 2.3.3(API lvl 10)に設定する必要がありました


私はこのことを思い出せません
Informatic0re

0

同じ問題がありました。約2時間のグーグル、再試行、APIキーの再生成などの後、Google APis Consoleで間違ったサービスを有効にしたことがわかりました。Google Maps API v2サービスを有効にしましたが、Androidアプリの場合はGoogle Maps Android API v2を使用する必要があります。適切なサービスを有効にした後、すべてが機能し始めました。


0

あなたのECLIPSEはSHA1キーを変更している可能性が あるため、https//console.developers.google.com/project/watchful-net-796/apiui/credentialその後、新しいSHA1キーでGoogleキーを再生成する必要があります その後、新しいキーをコピーしますマニフェストに入れてこのgoogleページを何度かリロードすると、キーが更新され、プロジェクトが再構築され、機能します。 P / S:私のエラーのために、私は.androidフォルダーを削除したので、日食再生SHA1です。


0

Googleドキュメントで提供されているのと同じ手順に従いましたが、同じエラーが発生しました。後で、app.keystoreを使用してアプリに署名していること、APIキーの生成に使用しているSHAキーがデバッグキーであることに気付きました。

ファイルsigningConfig signingConfig.genericからbuild.gradleファイルを削除すると、マップが正常に機能し始めました。

これが誰かを助けることを願っています。


0

私は同じ問題に直面しました。

アプリケーションのリリースバージョンのAPIを発行した場合。次に、そのAPIはリリースバージョンでのみ機能し、デバッグバージョンでは機能しません。そのため、携帯電話またはエミュレータでリリースバージョンを使用していることを確認してください。


0

私にとって、エミュレータと物理デバイスの両方ですべてが機能していました。

しかし、新しいAPIレベルのエミュレータで同じアプリをデバッグするために2台目のマシンをセットアップすると、動作しなくなりました。

私がいることを認識していなかった指紋そのマシンが変わったことに。デバイスログで認証失敗エラーログを確認した後、Google Developer Consoleのフィンガープリントとエラーメッセージのフィンガープリントを綿密に比較しました。そのとき私は違いを見ました。新しいフィンガープリントを(パッケージ名と組み合わせて)開発者コンソールに追加した後、新しいシステムのエミュレーターでアプリが期待どおりに機能し始めました。

新しいシステムをセットアップする場合は、指紋をもう一度確認してください。


0
  • SDK for AndroidAPIコンソールでマップが有効になっていることを確認してください。
  • また、キーの使用を完全に有効にするために、パッケージ名とSHA-1署名証明書のフィンガープリントを追加する必要がある場合があります。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.