私の手順:
作成された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>
作成されたレイアウト
コンパイル後にクラッシュしました:
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.
ステップ:
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を使用してください。
また、この投稿を確認してください: Google Map Android Api V2サンプルコードが機能しない アプリケーションを手動でアンインストールして(通常のアプリケーションと同じように)、プロジェクトを再度「実行」してください。
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の使用-プロジェクト-クリーン。
楽しい!
Android-SDK-DIRECTORY/extras/google/google_play_services/libprojectにあるライブラリプロジェクトを使用する必要があります
これにより、最初の問題が修正されます。
私はあなたの2番目についてはわかりませんが、それは最初の副作用かもしれません。私はまだ自分のアプリでマップを機能させようとしています:)
今日、私はこの問題に直面しました。 Android Studio 2.1.3、windows 10を使用しました。デバッグ中は正常に動作しますが、リリースモードに更新しても動作しません。すべてのプロガード条件をクリアし、更新しましたが、これは解決策ではありませんでした。
ソリューションはプロジェクト構造に関連しています。 google_maps_api.xmlファイルは、app\src\debug\resとapp\src\release\resで異なっていました。デバッグからリリースフォルダへの手動コピーペーストを行いました。
今では動作します。
上記のGunnar Bernsteinの提案のすべてではないにしても、私はほとんどをフォローしましたが、それでもうまくいきませんでした。しかし、私が彼の提案と次のことを行った後、機能し始めました:
Android Studioの右クリックオプションリストを使用して、新しいMapActivityを作成しました。新規-> Google-> Googleマップアクティビティ
次に、自動的に生成されたgoogle_maps_api.xmlファイルを開き、指定されたリンクを使用して新しいAPIキーを作成しました。すべての手順を実行し、現在のプロジェクトの下に新しいキーを保存しました。その後、古い登録済みのAPIキーは不要になったため削除しました。
マニフェストファイルの下で、キーを直接指定する代わりに、古いAPI KEY値をこの新しいXMLファイルによって作成された文字列ショートカットAndroid:value="@string/google_maps_key
"に置き換えました。
最後に、新しい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テキストと一致する必要があります。
これをマニフェストファイルに追加するだけです。
**<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 /から入手してください
ありがとう。投票してください
マニフェストとアプリbuild.gradle
でパッケージ名を確認することで、このエラーを解決しました。
マニフェスト:
パッケージ名を次のように使用しています:
com.app.triapp
アプリbuild.gradleで:
defaultConfig {
applicationId "com.app.live"
}
com.app.triapp
でbuild.gradle
に変更した後、問題を解決しました。
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はセキュリティ認証情報をキャッシュするため、新しいキーを試す前に、デバイスからアプリを完全にアンインストールすることをお勧めします。
私は同じ問題を抱えていましたが、ほぼ同じパッケージ名com.bla.bla
と他のcom.bla.bla.something
で同じSHA-1フィンガープリントを持つ2つの異なるマップAPIキーを作成したことが原因であることがわかりました。
「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が表示されます。追加してもう一度試してください:)
私は同じ問題に直面しました。
アプリケーションのリリースバージョンのapiを発行した場合。そのAPIは、リリースバージョンでのみ機能し、デバッグバージョンでは機能しません。そのため、携帯電話またはエミュレータでリリースバージョンを使用していることを確認してください。
私にとって、すべてがエミュレーターと物理デバイスの両方で機能していました。
しかし、新しいAPIレベルのエミュレーターで同じアプリをデバッグするために2台目のマシンをセットアップすると、機能しなくなりました。
そのマシンの指紋が変わったことに気づきませんでした。デバイスログで認証エラーのエラーログを確認した後、Google Developer Consoleのフィンガープリントとエラーメッセージのフィンガープリントを厳密に比較しました。それが違いを見たときです。 (パッケージ名と組み合わせて)開発者コンソールに新しいフィンガープリントを追加した後、新しいシステムのエミュレーターでアプリが期待どおりに動作し始めました。
新しいシステムをセットアップする場合は、指紋をもう一度確認してください!
まったく同じ問題があり、MapsApiV2のライブラリプロジェクトのSDKをAndroid 2.3.3(APIレベル10)に設定する必要がありました。
Googleドキュメントに記載されているのと同じ手順に従いましたが、同じエラーが発生していました。その後、私はapp.keystoreでアプリに署名しており、APIキーの生成に使用していたSHAキーがデバッグ用のものであることに気付きました。
したがって、signingConfig signingConfig.generic
ファイルからbuild.gradle
を削除するだけで、マップが正常に機能し始めました。
これが誰かを助けることを願っています。
同じ問題がありました。約2時間のグーグル、再試行、APIキーの再生成などを繰り返した後、Google APisコンソールで間違ったサービスを有効にしたことがわかりました。 Google Maps API v2サービスを有効にしましたが、Androidアプリの場合はGoogle Maps Android API v2を使用する必要があります。適切なサービスを有効にすると、すべてが機能し始めました。
あなたのEclipseはSHA1キーを変更する可能性があるため、ここで新しいSHA1キーを使用してGoogleキーを再生成する必要があります: https://console.developers.google.com/project/watchful-net-796/apiui/credential =その後、新しいキーをマニフェストにコピーし、このGoogleページを何度かリロードすると、キーが更新され、プロジェクトが再構築され、機能します。 P/S:私のエラーでは、.Androidフォルダーを削除したため、EclipseはSHA1を再生成します。