Categories
SugiBlog ホームページ制作・システム開発

Google Maps Android API v2

Google Maps Android API v2を使ってみました。
v2はv1とは互換性がありませんが、ベクター地図になり、視点の変更や屋内の地図表示等、色々便利になったようです。

Google Play Servicesライブラリ

まず、v2ではGoogle Play Servicesが必要になるので、Android SDK Managerで最新版をダウンロードし、インストールします。
1

Eclipseにて新規プロジェクトを作成します。
「既存コードからのAndroidプロジェクト」を選択し[次へ]
2

ルートディレクトリに以下のパスを指定します。
[android-sdkまでのパス]\extras\google\google_play_services\libproject\google-play-services_lib
3

「google-play-services_lib」というプロジェクトが検出されるので、チェックが入っていることを確認し[完了]
プロジェクトがインポートされます。
4

プロジェクト作成

新規プロジェクトで「Androidアプリケーション・プロジェクト」を作成します。
5

プロジェクト名を「MyMap2」とし、ターゲットをAndroid2.2を指定し[次へ]
6

プロジェクトの構成はそのまま[次へ]
7
ランチャー・アイコンの構成もそのままで[次へ]
8

アクティビティを作成は「Blank Activity」のまま[次へ]
9

アクティビティ等の名前はそのままで[完了]
10

以下のようにプロジェクトが作成されました。
11

Google Play Servicesライブラリを組み込みます。

プロジェクトのプロパティを表示します。
12
[追加]をクリックし、先程作成した「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/

21

「Create Project…」をクリックします。
利用規約への同意が求められるので、チェックし[Continue]をクリックします。

22

プロジェクトの作成が完了したら、右下の「元のコンソール」で古いコンソール画面を表示します。
左メニューの「Services」をクリックします。

23

「Google Maps Android API v2」を見つけてONに切り替えます。
24
利用規約に同意が求められるので「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

というわけで、無事マップを表示することができました。

SC20131122-093606

他、参考にさせていただいたサイト
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

2,388 views

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*