Google Maps Android API v2のサンプルを動作させるまでの解説


こんにちは、@9ensanです。

gps-maps

2012/12/03にAndroidのGoogle Map APIがバージョンアップしました。
ちょっと調べてみたら、バージョンアップして使い方がかなり変わっていたので、サンプルコードを動かすまでの解説をしていきたいと思います。

 

参考というか、Googleさんの解説しているサイトは以下のサイトになります

Google Play Servicesを利用するようになっていたり、OpenGL ES version2が必要になっていたり

それでは、解説していきます。

 

Google Play Services SDKの設定

Google Play servicesをインストール

google-maps-android-api-v2-sample-01
Eclipseのメニューから「ウインドウ」→「Android SDK マネージャー」を選択します。

google-maps-android-api-v2-sample-02
SDK Managerの「Google Play services」にチェックを入れて「Install x package…」ボタンを押下します。
(既にRev.4以上がインストール済みの場合はそのままで問題ないので「Android SDK Manager」を閉じて下さい)

google-maps-android-api-v2-sample-03
インストールパッケージの選択画面が表示されるので、左の「Android SDK License」にチェックを付けます。
「Accept License」をチェックします。
「Install」ボタンが押下できるようになるので押下します。

インストールが実行されて、しばらくするとインストールが完了するので、「Android SDK Manager」を閉じて下さい。

Google Play Servicesのインポート

google-maps-android-api-v2-sample-04
Eclipseのメニューの「ファイル」→「新規」→「その他」を押下します。

google-maps-android-api-v2-sample-05
「既存のコードからのAndroidプロジェクト」を選択して「次へ」ボタンを押下します。

google-maps-android-api-v2-sample-06
「参照」ボタンを押下し、

<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キーの取得

google-maps-android-api-v2-sample-07
API Console – Google Code」を開いて、「Services」をクリックします。

google-maps-android-api-v2-sample-08
「Google Maps Android API v2」の「Status」をクリックして「ON」にします。

google-maps-android-api-v2-sample-09
「API Access」を開いて「Create new Android key…」ボタンを押下します。

google-maps-android-api-v2-sample-10
ここで、APIキーの発行に必要な、「SHA1フィンガープリント」を取得します。
ターミナルを開いて、以下のコマンドを実行するとフィンガープリントが表示されます。

export _JAVA_OPTIONS="-Dfile.encoding=UTF-8"
keytool -list -v -keystore ~/.android/debug.keystore

(文字化けをする場合は、「Androidのkeytoolで文字化けする場合の対処方法」を参照してください)

google-maps-android-api-v2-sample-11
「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

google-maps-android-api-v2-sample-12
元のページの戻ると、「Key for Android apps」の項目が増えていると思います。
この中の「API key」が今回使用する「API key」になるのでメモしておいて下さい。

プログラムの作成

プロジェクトの作成

google-maps-android-api-v2-sample-13
Eclipseのメニューの「ファイル」→「新規」→「Android アプリケーション・プロジェクト」を押下して、「新規 Android アプリケーション」ウインドウを開きます。

google-maps-android-api-v2-sample-14
アプリケーションのパッケージ名を、API keyを作成した時に入力したパッケージ名にしてアプリケーションを作成します。
Minimum Required SDK : API 8
Target SDK : API 17
Compile With : API 17
で作成しました。
(これでないと行けないと言う事はありませんが、Target SDKをAPI 12以上にする必要があります。後で、API 8以上で実行する方法も紹介します)

ライブラリの設定

google-maps-android-api-v2-sample-15
プロジェクトのプロパティを開きます。

google-maps-android-api-v2-sample-16
「Android」を選択し、「ライブラリー」の箇所にある「追加」ボタンを押下します。

google-maps-android-api-v2-sample-17
表示されたウインドウから「google-play-services-lib」を選択し、「OK」ボタンを押下します。
(もし表示されない場合は、「Google Play Servicesのインポート」が上手く出来ていないので再度見直して下さい)

google-maps-android-api-v2-sample-18
ライブラリーが追加されている事を確認して「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の作成


レイアウトファイルの読み込み処理を記述する

実行

google-maps-android-api-v2-sample-19
実行すると地図が表示されます。

API 12未満で「Google Maps Android API v2」を動作させる対応

サポートライブラリの追加

google-maps-android-api-v2-sample-fix-1
右クリックから、「Androidツール」→「サポート・ライブラリーの追加」をクリックします。

google-maps-android-api-v2-sample-fix-2
ダイアログが表示されたら、「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」に修正します。

実行

google-maps-android-api-v2-sample-23
Android2.2のDesireで実行したら動作しました。

 

Mapを表示させるまでは、かなり簡単に動作できたので、これを元に色々と作成してみたいです。

.

関連する記事:

Facebookでコメント

コメント

    • レッド
    • 2013年 9月3日

    ものすごく参考になりました。
    地図が白いままで途方にくれていたところここにたどり着いて…。
    GoogleMapAPIの環境の更新が早すぎて、みなさんの書かれている内容が追い付かないんですよね。
    本当に助かりました。
    ありがとうございます。

    • マップ
    • 2013年 9月13日

    ありがとうございます。とても参考になりました。

    しかし私の場合、背景が灰色で格子状のだけが表示されています。

    何がいけないのでしょうか?

    教えていただけると助かります。

      • げん
      • 2013年 9月14日

      コメントありがとうございます。

      背景が灰色で格子状に表示されるという事ですが、
      「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が足りていない、もしくは間違っている。こちらも自分のアプリのパッケージ名に修正しないと行けない箇所があるので間違えやすいです。

    • かき
    • 2013年 9月19日

    ありがとうございます。とてもわかりやすくて参考になりました。

    しかしeclipse上でエラーは出ないのですが、
    実機に移した際、エラーが表示されアプリが立ち上がりません。

    何がいけないのでしょうか?
    知恵をお貸しください。

      • げん
      • 2013年 9月20日

      >かきさん

      コメントありがとうございます。
      このサイトの管理人です。

      実機でエラーが表示されるということですが、Logcatにはどのようなエラーが出力されていますか?
      エラー内容を見たら何か分かるかもしれません。

    • 匿名
    • 2013年 10月17日

    詳細なすばらしい解説をありがとうございました
    検索するとv1の情報が残っているのでどこがどう悪いかがわからず詰まっていました
    apilevel12未満の解説も助かりました
    本当にありがとうございました

    • ナカノ
    • 2013年 10月19日

    丁寧な解説をありがとうございました
    おかげさまでよく理解出来形ました

    質問をお願いします
    androidのバージョンによって少し違う部分がありますが、コード内での分岐だ対処する方法はございますか?
    それともActivityを2つ造る事で対処するのでしょうか?
    よろしくお願いします

      • げん
      • 2013年 10月19日

      コメントありがとうございます。
      管理人のげんです。

      ご質問の件ですが、
      結論を言うと、androidのバージョンによってコード内で処理を分岐させる必要はありません。
      作成されるアプリが、APIレベル12未満の端末にも対応する必要がある場合は、
      「com.google.android.gms.maps.SupportMapFragment」を利用する方法で記述します。
      この記述でAPIレベル12以上の端末でも問題なく動作します。

      作成されるアプリが、APIレベル12未満の端末を切り捨てるなら、
      「com.google.android.gms.maps.MapFragment」を利用して記述した方が、無駄なライブラリを入れなくて済むのでオススメです。
      また、疑問ありましたら気軽にコメント下さい。

    • K
    • 2014年 7月26日

    わかりやすい説明ありがとうございます.
    エミュレータで起動するとアプリが強制終了してしまいます.
    どうすればよいでしょうか?
    参考までに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

    • げん
    • 2014年 7月30日

    > Kさん
    コメントありがとうございます。

    上記スタックトレースを見る限りでは、ClassNotFoundExceptionが発生しているのでAndroidManifest.xmlに「SampleMapActivity」のactivityタグが記載されているか確認してみてください。

    activityタグの解説のURLになります。
    http://www.techdoctranslator.com/android/guide/manifest/activity-element

    もし全く関係なかったら申し訳ありません。
    今後ともブログよろしくお願いします。

    • こーすけ
    • 2014年 8月10日

    こんにちは。
    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

      • げん
      • 2014年 8月13日

      >こーすけさん

      コメントありがとうございます。

      上記スタックトレースを見る限りでは、ClassNotFoundExceptionが発生しているのでAndroidManifest.xmlに「SampleMapActivity」のactivityタグが記載されているか確認してみてください。

      activityタグの解説のURLになります。
      http://www.techdoctranslator.com/android/guide/manifest/activity-element

      もし全く関係なかったら申し訳ありません。
      今後ともブログよろしくお願いします。

    • 初心者
    • 2014年 9月17日

    GoogleMapを取り入れたアプリを作っていて、実機が知り合いから譲ってもらった古いもの(API Level10)しか持っていないAndroid初心者です。。
    いろいろ調べてFragmentActivityを継承することは分かりましたが、予期せず終了……、あきらめようかなという気持ちが出てきたときにこのページ見つけ、サポートライブラリの追加の解説を発見しました。
    その結果無事起動することができ、非常に助かりました。本当にありがとうございます!

*

return top