web-dev-qa-db-ja.com

GoogleマップAndroid AP​​I v2の認証エラー

私の手順:

  • debug.keystoreからSHA1コードを取得しました
  • google APIコンソールでアプリを作成する
  • googleマップAPI v2を有効化
  • 入力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」をライブラリに配置します

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

  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.
91
Rusfearuth

ステップ

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

enter image description here

  • https://code.google.com/apis/console/ でプロジェクトを作成します
  • 「Google Maps Android AP​​I v2」を有効にする enter image description here
  • プロジェクトにSHA1を登録するには(今、あなたはAPIコンソールでSHA1; your.app.package.nameを書き、API KEYを取得する必要があります)
  • 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 Mapアプリを作成する準備が整いました。

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

99
Rusfearuth

また、この投稿を確認してください: Google Map Android Api V2サンプルコードが機能しない アプリケーションを手動でアンインストールして(通常のアプリケーションと同じように)、プロジェクトを再度「実行」してください。

34
adelriosantiago

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.マニフェスト機能:

マップAPIにはいくつかのgrapicsサポートが必要なので、このエントリが必要です。

<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の使用-プロジェクト-クリーン。

楽しい!

19

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

これにより、最初の問題が修正されます。

私はあなたの2番目についてはわかりませんが、それは最初の副作用かもしれません。私はまだ自分のアプリでマップを機能させようとしています:)

16
Scott Kennedy

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

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

今では動作します。

5
Yaya

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

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

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

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

  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に記載されている値は、CredentialsページのPackage nameテキストと一致する必要があります。

4
goldenmaza

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

**<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>

Google Playサービスのライブラリを更新してください...ウィンドウに移動-> Android sdk manager-> Google Playサービスの更新...インストール済み..古いものを削除して、これを保持してください。 Android-SDK-DIRECTORY/extras/google/google_play_services /から入手してください

ありがとう。投票してください

3
Mitul Goti

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

マニフェスト:

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

com.app.triapp

アプリbuild.gradleで:

 defaultConfig {

        applicationId "com.app.live"
    }

com.app.triappbuild.gradleに変更した後、問題を解決しました。

3
Stephen

GoogleマップのV1からV2に移行しています。 Eclipseを介してアプリを実行しようとすると、このエラーが発生していました。根本的な原因は、Androidデバッグキーストアではなく、リリース証明書キーストアを使用していたことです。これは、Eclipse経由で実行するときに使用されます。次のコマンド(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はセキュリティ認証情報をキャッシュするため、新しいキーを試す前に、デバイスからアプリを完全にアンインストールすることをお勧めします。

2
Chris Knight

私は同じ問題を抱えていましたが、ほぼ同じパッケージ名com.bla.blaと他のcom.bla.bla.somethingで同じSHA-1フィンガープリントを持つ2つの異なるマップAPIキーを作成したことが原因であることがわかりました。

1

「Java.lang.NoClassDefFoundError:com.google.Android.gms.R $ styleable」

このエラーも発生しました。ファイル->インポート->既存のAndroidコードをワークスペースに->参照-> Android SDK->エクストラ-> google-> google_play_services- > lib_project-> google_play_services_libおよびOK。プロジェクトを確認して終了します。

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

1
edwell

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

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

0
Salman Saleh

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

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

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

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

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

0
Informatic0re

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

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

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

0
SKP

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

0
Nino Stella

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

0
nobjta_9x_tq