- Android
- 2013-11-22 - 更新:2014-08-18
Google Maps Android API v2を使ってみました。
v2はv1とは互換性がありませんが、ベクター地図になり、視点の変更や屋内の地図表示等、色々便利になったようです。
Google Play Servicesライブラリ
まず、v2ではGoogle Play Servicesが必要になるので、Android SDK Managerで最新版をダウンロードし、インストールします。
Eclipseにて新規プロジェクトを作成します。
「既存コードからのAndroidプロジェクト」を選択し[次へ]
ルートディレクトリに以下のパスを指定します。
[android-sdkまでのパス]\extras\google\google_play_services\libproject\google-play-services_lib
「google-play-services_lib」というプロジェクトが検出されるので、チェックが入っていることを確認し[完了]
プロジェクトがインポートされます。
プロジェクト作成
新規プロジェクトで「Androidアプリケーション・プロジェクト」を作成します。
プロジェクト名を「MyMap2」とし、ターゲットをAndroid2.2を指定し[次へ]
プロジェクトの構成はそのまま[次へ]
ランチャー・アイコンの構成もそのままで[次へ]
アクティビティを作成は「Blank Activity」のまま[次へ]
Google Play Servicesライブラリを組み込みます。
プロジェクトのプロパティを表示します。
[追加]をクリックし、先程作成した「google-play-services_lib」を選択します。
追加されれば[OK]
ちなみにGoogle Play ServicesライブラリはPCの同じドライブにないと参照できません。(設定はできるけど実際には読み込めない)
ですので、別ドライブにある場合はワークスペースにデータをコピーしてプロジェクトを作成してください。
今回はターゲットが2.2ですので、Android2.x系でも動作するようサポートパッケージを組み込みます。
プロジェクトを右クリック-[Androidツール]-[サポート・ライブラリーの追加]
ライセンス承諾してインストールします。
さて、それではコードを触っていきます。
まずレイアウトファイルを編集します。
プロジェクトの[res]-[layout]から「activity_main.xml」を開き、以下のように変更します。
<?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment" > </fragment>
もしターゲットがAPIレベル12(Android 3.1.x)以上ならFragmentのclassは以下のようにします。
class="com.google.android.gms.maps.MapFragment"
次にアクティビティを編集します。
プロジェクトの[src]から「MainActivity.java」を開きます。
始めは以下のようなソースになっているので変更します。
package jp.example.mymap2; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
ActivityをFragmentActivityに変更します。
package jp.example.mymap2; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.view.Menu; public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
※「android.support.v4.app.FragmentActivity」は環境によって異なるかもしれません。
マニフェストにパーミッション設定を追加
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <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" />
com.google.android.providers.gsf.permission.READ_GSERVICES
GoogleのWebサービスへのアクセスを許可
android.permission.INTERNET
インターネットへのアクセスを許可
android.permission.ACCESS_NETWORK_STATE
APIがデータをダウンロードできるかどうかを判断するために接続状態を確認する許可
android.permission.WRITE_EXTERNAL_STORAGE
APIが端末の外部記憶領域にマップタイルデータをキャッシュすることができるよう許可
android.permission.ACCESS_COARSE_LOCATION
ネットワークを使った位置情報取得を許可
android.permission.ACCESS_FINE_LOCATION
GPSを使った位置情報取得を許可
以下のような記述も必要だったようですが、2013年7月から不要になったようです。
<permission android:name="jp.example.mymap2.permission.MAPS_RECEIVE" android:protectionLevel="signature"/> <uses-permission android:name="jp.example.mymap2.permission.MAPS_RECEIVE"/>
https://developers.google.com/maps/documentation/android/releases#july_2013
v2はOpenGL ES version2が入っていないと表示できないので、
入っていない端末を除外するためuses-featureを追加します。
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
APIアクセスキー取得
次にAPIアクセスキーを取得します。
Google APIs Consoleにログインします。
https://code.google.com/apis/console/
「Create Project…」をクリックします。
利用規約への同意が求められるので、チェックし[Continue]をクリックします。
プロジェクトの作成が完了したら、右下の「元のコンソール」で古いコンソール画面を表示します。
左メニューの「Services」をクリックします。
「Google Maps Android API v2」を見つけてONに切り替えます。
利用規約に同意が求められるので「I agree to these terms.」をチェックして「Accept」をクリック。
次に左メニューの「API Access」をクリック
「Simple API Access」の「Create new Androidkey…」をクリックします。
ここでバージョン1のときと同様フィンガープリントが必要になるので取得します。
ターミナルを開き、.androidディレクトリに移動し、以下のコマンドを実行します。
keytool -list -v -keystore [作成してあるkeystoreファイルの名前]
表示されたフィンガープリントのSHA-1の値をコピーします。
先程のフィンガープリント入力欄にコピーした値に続けて、セミコロン+利用するアプリのパッケージ名を入力します。
例)
00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00;jp.example.mymap2
「create」ボタンをクリックすると登録されてAPIKeyが表示されます。
作成されたAPIKeyとGooglePlayServiceのバージョンをマニフェストのapplicationタグ内に追加します。
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="[APIKey]"/> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
今回、パーミッションやメタデータの設定で結構ハマってしまった…。
やはり本家のサイトが一番参考になりました。
https://developers.google.com/maps/documentation/android/start
というわけで、無事マップを表示することができました。
他、参考にさせていただいたサイト
http://qiita.com/amay077/items/7ad0244c0fb4b431e090
http://d.hatena.ne.jp/paraches/20121204
http://www.adamrocker.com/blog/334/google-maps-android-api-v2.html
ちなみにサンプルは以下のディレクトリにインストールされています。
(android-sdkのパス)\extras\google\google_play_services\samples\maps\src\com\example\mapdemo