Google Maps Android API v2のサンプルを動作させるまでの解説
こんにちは、@9ensanです。
2012/12/03にAndroidのGoogle Map APIがバージョンアップしました。
ちょっと調べてみたら、バージョンアップして使い方がかなり変わっていたので、サンプルコードを動かすまでの解説をしていきたいと思います。
参考というか、Googleさんの解説しているサイトは以下のサイトになります
- Introduction to the Google Maps Android API v2
- Google Maps Android API v2 Getting Started
- Google Play Services Setup
- Referencing a library project
- API Console – Google Code
Google Play Servicesを利用するようになっていたり、OpenGL ES version2が必要になっていたり
それでは、解説していきます。
Google Play Services SDKの設定
Google Play servicesをインストール
Eclipseのメニューから「ウインドウ」→「Android SDK マネージャー」を選択します。
SDK Managerの「Google Play services」にチェックを入れて「Install x package…」ボタンを押下します。
(既にRev.4以上がインストール済みの場合はそのままで問題ないので「Android SDK Manager」を閉じて下さい)
インストールパッケージの選択画面が表示されるので、左の「Android SDK License」にチェックを付けます。
「Accept License」をチェックします。
「Install」ボタンが押下できるようになるので押下します。
インストールが実行されて、しばらくするとインストールが完了するので、「Android SDK Manager」を閉じて下さい。
Google Play Servicesのインポート
Eclipseのメニューの「ファイル」→「新規」→「その他」を押下します。
「既存のコードからのAndroidプロジェクト」を選択して「次へ」ボタンを押下します。
<android-sdk-folder>/extras/google/google_play_services/libproject/google-play-services_lib
のフォルダを選択します。
「Projects」に表示された「google-play-services-lib」にチェックを付けます。
「プロジェクトをワークスペースにコピー」にチェックを付けます。(ワークスペースにファイル自体をコピーします)
完了ボタンを押下すると、「google-play-services-lib」のインポートが完了します。
APIキーの取得
Google Maps Android API v2のAPIキーの取得
「API Console – Google Code」を開いて、「Services」をクリックします。
「Google Maps Android API v2」の「Status」をクリックして「ON」にします。
「API Access」を開いて「Create new Android key…」ボタンを押下します。
ここで、APIキーの発行に必要な、「SHA1フィンガープリント」を取得します。
ターミナルを開いて、以下のコマンドを実行するとフィンガープリントが表示されます。
export _JAVA_OPTIONS="-Dfile.encoding=UTF-8" keytool -list -v -keystore ~/.android/debug.keystore
(文字化けをする場合は、「Androidのkeytoolで文字化けする場合の対処方法」を参照してください)
「Create new Android key…」ボタンを押下して開いたウインドウのテキストエリアに、
「SHA1フィンガープリント;パッケージ名」の形式で入力してから、「Create」ボタンを押下します。
例)45:B5:E4:6F:36:AD:0A:98:94:B4:02:66:2B:12:17:F2:56:26:A0:E0;com.example
元のページの戻ると、「Key for Android apps」の項目が増えていると思います。
この中の「API key」が今回使用する「API key」になるのでメモしておいて下さい。
プログラムの作成
プロジェクトの作成
Eclipseのメニューの「ファイル」→「新規」→「Android アプリケーション・プロジェクト」を押下して、「新規 Android アプリケーション」ウインドウを開きます。
アプリケーションのパッケージ名を、API keyを作成した時に入力したパッケージ名にしてアプリケーションを作成します。
Minimum Required SDK : API 8
Target SDK : API 17
Compile With : API 17
で作成しました。
(これでないと行けないと言う事はありませんが、Target SDKをAPI 12以上にする必要があります。後で、API 8以上で実行する方法も紹介します)
ライブラリの設定
「Android」を選択し、「ライブラリー」の箇所にある「追加」ボタンを押下します。
表示されたウインドウから「google-play-services-lib」を選択し、「OK」ボタンを押下します。
(もし表示されない場合は、「Google Play Servicesのインポート」が上手く出来ていないので再度見直して下さい)
ライブラリーが追加されている事を確認して「OK」ボタンを押下します。
AndroidManifest.xmlの修正
AndroidManifest.xmlに以下の内容を追加します。
- <application>へのAPIのmeta-dataの追加
- 追加したmeta-data内の「your_api_key」と記述してある箇所を、上記Google apisで取得した「API key」に修正する
- MAPS_RECEIVEへのpermissionとuses-permissionの追加
- 必要なuse-permissionの追加
- OpenGL ES version2へのuses-featureの追加
レイアウトファイルの作成
レイアウトファイルに、MapFragmentへの参照を記述する
Activityの作成
レイアウトファイルの読み込み処理を記述する
実行
API 12未満で「Google Maps Android API v2」を動作させる対応
サポートライブラリの追加
右クリックから、「Androidツール」→「サポート・ライブラリーの追加」をクリックします。
ダイアログが表示されたら、「Android SDK License」を選択し(ここで表示されるSupport LibraryはインストールしているSDKのバージョンで変わる事があります)、「Accept License」を選択してから「インストール」ボタンを押下します。
Support Libraryのインストールが始まるので、インストールが完了したらSupport Libraryの設定は完了です。
レイアウトファイルの修正
レイアウトファイルの「com.google.android.gms.maps.MapFragment」を「com.google.android.gms.maps.SupportMapFragment」に修正します。
Activityの修正
SampleMapActivityの継承元を「Activity」から「FragmentActivity」に修正します。
実行
Android2.2のDesireで実行したら動作しました。
Mapを表示させるまでは、かなり簡単に動作できたので、これを元に色々と作成してみたいです。
.
関連する記事:
- 端末にGoogle Play Servicesがインストールされているか確認する方法
- 「あとで読む」系のサービス「Readability」への登録方法(PC/Android/iPhone/iPad)
- ActionBarSherlockを使ってAndroid2.xにもActionBarを組み込むサンプル
- PHP入門 第2回 PHPの動作環境を作ろう(XAMPPをインストールしよう)
- Finderのサイドバーに「ごみ箱」を表示する方法
ものすごく参考になりました。
地図が白いままで途方にくれていたところここにたどり着いて…。
GoogleMapAPIの環境の更新が早すぎて、みなさんの書かれている内容が追い付かないんですよね。
本当に助かりました。
ありがとうございます。
ありがとうございます。とても参考になりました。
しかし私の場合、背景が灰色で格子状のだけが表示されています。
何がいけないのでしょうか?
教えていただけると助かります。
コメントありがとうございます。
背景が灰色で格子状に表示されるという事ですが、
「Google Maps Android API v2」の「APIキー」周りで何か間違っていると、地図が表示されない状態になるので、可能性としては「APIキー」の設定に誤りがある可能性が高いです。
(ちなみにこの場合、DDMSで見れるLogcatに、「Failed to load map. Error contacting Google servers. This is probably an authentication issue (but could be due to network errors).」のようなログが表示されます)
間違える可能性が高い箇所は、以下の4点かなと思います。
1.「SHA1フィンガープリント」を作成した時に使用したkeystoreと、apkの署名に利用したkeystoreが違う。
2.「Create new Android key…」を押下後のテキストエリアに入れた、「SHA1フィンガープリント;パッケージ名」が間違っている。パッケージ名を、自分の作成しているAndroidアプリのパッケージ名に修正し忘れていることが私もありました。
3.AndroidManifest.xmlに記載したAPIキーが間違っている。
4.AndroidManifest.xmlに追加したpermissionが足りていない、もしくは間違っている。こちらも自分のアプリのパッケージ名に修正しないと行けない箇所があるので間違えやすいです。
ありがとうございます。とてもわかりやすくて参考になりました。
しかしeclipse上でエラーは出ないのですが、
実機に移した際、エラーが表示されアプリが立ち上がりません。
何がいけないのでしょうか?
知恵をお貸しください。
>かきさん
コメントありがとうございます。
このサイトの管理人です。
実機でエラーが表示されるということですが、Logcatにはどのようなエラーが出力されていますか?
エラー内容を見たら何か分かるかもしれません。
詳細なすばらしい解説をありがとうございました
検索するとv1の情報が残っているのでどこがどう悪いかがわからず詰まっていました
apilevel12未満の解説も助かりました
本当にありがとうございました
丁寧な解説をありがとうございました
おかげさまでよく理解出来形ました
質問をお願いします
androidのバージョンによって少し違う部分がありますが、コード内での分岐だ対処する方法はございますか?
それともActivityを2つ造る事で対処するのでしょうか?
よろしくお願いします
コメントありがとうございます。
管理人のげんです。
ご質問の件ですが、
結論を言うと、androidのバージョンによってコード内で処理を分岐させる必要はありません。
作成されるアプリが、APIレベル12未満の端末にも対応する必要がある場合は、
「com.google.android.gms.maps.SupportMapFragment」を利用する方法で記述します。
この記述でAPIレベル12以上の端末でも問題なく動作します。
作成されるアプリが、APIレベル12未満の端末を切り捨てるなら、
「com.google.android.gms.maps.MapFragment」を利用して記述した方が、無駄なライブラリを入れなくて済むのでオススメです。
また、疑問ありましたら気軽にコメント下さい。
わかりやすい説明ありがとうございます.
エミュレータで起動するとアプリが強制終了してしまいます.
どうすればよいでしょうか?
参考までにLogdcatの結果を示します.
07-26 17:01:23.774: E/Trace(913): error opening trace file: No such file or directory (2)
07-26 17:01:24.084: D/AndroidRuntime(913): Shutting down VM
07-26 17:01:24.144: W/dalvikvm(913): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
07-26 17:01:24.184: E/AndroidRuntime(913): FATAL EXCEPTION: main
07-26 17:01:24.184: E/AndroidRuntime(913): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.gooogle_mapsv2/com.example.gooogle_mapsv2.SampleMapActivity}: java.lang.ClassNotFoundException: Didn’t find class “com.example.gooogle_mapsv2.SampleMapActivity” on path: /data/app/com.example.gooogle_mapsv2-2.apk
07-26 17:01:24.184: E/AndroidRuntime(913): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2106)
07-26 17:01:24.184: E/AndroidRuntime(913): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-26 17:01:24.184: E/AndroidRuntime(913): at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-26 17:01:24.184: E/AndroidRuntime(913): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-26 17:01:24.184: E/AndroidRuntime(913): at android.os.Handler.dispatchMessage(Handler.java:99)
07-26 17:01:24.184: E/AndroidRuntime(913): at android.os.Looper.loop(Looper.java:137)
07-26 17:01:24.184: E/AndroidRuntime(913): at android.app.ActivityThread.main(ActivityThread.java:5041)
07-26 17:01:24.184: E/AndroidRuntime(913): at java.lang.reflect.Method.invokeNative(Native Method)
07-26 17:01:24.184: E/AndroidRuntime(913): at java.lang.reflect.Method.invoke(Method.java:511)
07-26 17:01:24.184: E/AndroidRuntime(913): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-26 17:01:24.184: E/AndroidRuntime(913): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-26 17:01:24.184: E/AndroidRuntime(913): at dalvik.system.NativeStart.main(Native Method)
07-26 17:01:24.184: E/AndroidRuntime(913): Caused by: java.lang.ClassNotFoundException: Didn’t find class “com.example.gooogle_mapsv2.SampleMapActivity” on path: /data/app/com.example.gooogle_mapsv2-2.apk
07-26 17:01:24.184: E/AndroidRuntime(913): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:65)
07-26 17:01:24.184: E/AndroidRuntime(913): at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
07-26 17:01:24.184: E/AndroidRuntime(913): at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
07-26 17:01:24.184: E/AndroidRuntime(913): at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
07-26 17:01:24.184: E/AndroidRuntime(913): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
07-26 17:01:24.184: E/AndroidRuntime(913): … 11 more
> Kさん
コメントありがとうございます。
上記スタックトレースを見る限りでは、ClassNotFoundExceptionが発生しているのでAndroidManifest.xmlに「SampleMapActivity」のactivityタグが記載されているか確認してみてください。
activityタグの解説のURLになります。
http://www.techdoctranslator.com/android/guide/manifest/activity-element
もし全く関係なかったら申し訳ありません。
今後ともブログよろしくお願いします。
こんにちは。
Androidアプリの勉強を始めて3日目の初心者です。
現在、こちらのブログのgoogle maps android api v2のサンプルを動作させる作業を行いました。この記事の作業を全てコピペしましたが、実機でデバッグするとエラーが出てしまいます。(なおhello world等は実機でも表示出来ました)
android device のversionは2.3.6で、
google-play-service_libもimportしてあり、サポートライブラリもインストールしております。
昨日からずっと他のサイトさんも参考にさせていただいているのですが、全く上手く行きません。
もしよろしければアドバイスいただけないでしょうか。。どうぞよろしくお願いします。
LogCatの内容は以下の通りです。
E/AndroidRuntime(3005): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.kota.godmap/com.kota.godmap.SampleMapActivity}: java.lang.ClassNotFoundException: com.kota.godmap.SampleMapActivity in loader dalvik.system.PathClassLoader[/data/app/com.kota.godmap-2.apk]
E/AndroidRuntime(3005): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1569)
E/AndroidRuntime(3005): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
E/AndroidRuntime(3005): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
E/AndroidRuntime(3005): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
E/AndroidRuntime(3005): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(3005): at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime(3005): at android.app.ActivityThread.main(ActivityThread.java:3687)
E/AndroidRuntime(3005): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(3005): at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime(3005): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
E/AndroidRuntime(3005): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
E/AndroidRuntime(3005): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(3005): Caused by: java.lang.ClassNotFoundException: com.kota.godmap.SampleMapActivity in loader dalvik.system.PathClassLoader[/data/app/com.kota.godmap-2.apk]
E/AndroidRuntime(3005): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
E/AndroidRuntime(3005): at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
E/AndroidRuntime(3005): at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
E/AndroidRuntime(3005): at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
E/AndroidRuntime(3005): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561)
E/AndroidRuntime(3005): … 11 more
>こーすけさん
コメントありがとうございます。
上記スタックトレースを見る限りでは、ClassNotFoundExceptionが発生しているのでAndroidManifest.xmlに「SampleMapActivity」のactivityタグが記載されているか確認してみてください。
activityタグの解説のURLになります。
http://www.techdoctranslator.com/android/guide/manifest/activity-element
もし全く関係なかったら申し訳ありません。
今後ともブログよろしくお願いします。
GoogleMapを取り入れたアプリを作っていて、実機が知り合いから譲ってもらった古いもの(API Level10)しか持っていないAndroid初心者です。。
いろいろ調べてFragmentActivityを継承することは分かりましたが、予期せず終了……、あきらめようかなという気持ちが出てきたときにこのページ見つけ、サポートライブラリの追加の解説を発見しました。
その結果無事起動することができ、非常に助かりました。本当にありがとうございます!