【Android】Google Maps Android API についての備忘録


けっこーめんどくさいところがあったので、AndroidアプリでのGoogleMapAPIに関する
個人的な備忘録として、知ったこと・やり方をまとめていきたいと思います。

## Google Maps Android APIのバージョンについて 

同僚から、「なんか(2013年)11月からGoogleMapのAPIがv2からv3に変わるらしいよ」
と聞いていたので、
AndroidのAPIの最新バージョンについて、あれこれ必死に探していたけど、
Androidに関しては、v3の記事が見当たらない・・・

「なんで？？」と思っていたのですが、、
v3とは、「Google Maps JavaScript API v3」のことで、
Google Maps Android APIに関しては、v２が最新とのこと（2014年3月16日 現在）。
勘違いしてました。。

参照：[Google maps API V3についての質問です！]
(http://chiebukuro.toremaga.com/dir/detail/q14116425614/)

ということで、
Google Maps Android API v2で試してみました。

## Google Maps Android APIの利用（準備編）

以下の段階を経て、実装を進めていきます。

### 1.ライブラリのインストール
SDKマネージャーを起動し、「ExtrasのGoogle Play service」をインストールしていなければ、インストールしておきます。

### 2.フィンガープリントのSHA1を調べる
ターミナルでフィンガープリントSHA1を調べます。
keytool -v -list -keystore ~/.android/debug.keystoreで調べられます。
その前に私の場合、文字化けが発生したので、エンコードしてから調べたのも併せて載せておきます。

```コンソール:ターミナル
#文字化け発生したので、Javaのオプション確認
$ echo $_JAVA_OPTIONS

#空文字が表示されるのを確認して、以下のコマンドでエンコードする
$ export _JAVA_OPTIONS="-Dfile.encoding=UTF-8"

#キーストアへアクセス・SHA1を調べる
$ keytool -v -list -keystore ~/.android/debug.keystore
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8

#パスワードは未入力のままそのままEnterを押す
キーストアのパスワードを入力してください:  

*****************  警告 警告 警告  *****************
*  キーストアに保存された情報の完全性は検証されて  *
*  いません!  完全性を検証するには、キーストアの   *
*  パスワードを入力する必要があります。            *
*****************  警告 警告 警告  *****************

キーストアのタイプ: ＊＊＊
キーストアのプロバイダ: ＊＊＊

キーストアには 1 エントリが含まれます。

別名: androiddebugkey
作成日: 2014/＊＊/＊＊
エントリタイプ: PrivateKeyEntry
証明連鎖の長さ: 1
証明書[1]:
所有者: CN=Android Debug, ＊＊＊＊＊＊＊＊
発行者: CN=Android Debug, ＊＊＊＊＊＊＊＊
シリアル番号: ＊＊＊＊＊＊
有効期間の開始日: Sun Jan 12 00:59:48 JST 2014 終了日: Tue Jan 05 00:59:48 JST 2044
証明書のフィンガープリント:
	 MD5:  ＊＊＊＊:06:65:B9:D6:1D:CF:＊＊＊＊＊＊＊＊＊＊
	 SHA1: ＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊　←これです
	 署名アルゴリズム名: ＊＊＊＊＊＊＊＊
	 バージョン: 3


*******************************************
*******************************************

```


### 3.APIキーの取得
[GoogleDevelopersConsole](https://console.developers.google.com/project)へアクセスして、プロジェクトを作成し、APIキーを取得します。

GoogleDevelopersConsoleが新しくなったのですが、設定の仕方がわかりづらかったので、前のコンソールで設定してます。
（GoogleDevelopersConsoleに関しては、MobileBackendStarterのお試し使用＆調べ中で使っているので、わかってきたら、また加筆修正したいと思います。）

右下あたりにちっちゃく「元のコンソールに戻る」というリンクがあるので、そこから戻りました。

1. 左メニューのセレクトボックスから、先ほど作成したプロジェクトを選択。

2. 左メニューの「Service」をクリックして、「GoogleMapsAndroid API v2」を「ON」にします。

3. 左メニューの「APIAccess」をクリックして「SimpleAPIAcess」の「Create new Android key …」をクリックします。

4. キーを設定するダイアログが表示されるので、例に沿って、
A1:＊＊:1D:DD:E5:＊＊:AF:＊＊:＊＊:33:45:C8:5D:FF:A1:60:A4:14:39:1F;com.example.testApp
(SHA1キー;Androidで作ったプロジェクトのパッケージ名)を入力して「create」ボタンを押します。

5.APIキーが発行されるので、コピーして指定の場所に貼付けていけばOKです。


## Google Maps Android APIの利用（実装編）

### 1.プロジェクトの新規作成

いつも通りにEclipseから「ファイル >> 新規作成 >> その他 >> Androidアプリケーション・プロジェクト」と作成していきます。

アプリケーション名：任意のお好きな名前で
パッケージ名：APIキーで設定したパッケージ名を入力
次でコンパイル：GogleAPIsを選択してください。
（バージョンは3.2以上であれば、どれでも大丈夫です。たぶん。私はAPI18にしました。）

### 2.マニュフェストにいろいろ設定
AndroidManifest.xmlにいろいろなパーミッションを追加したり、先ほど取得したAPIキーを設定したりします。

```Java:AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.googlemaptest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <!-- 追加パーミッション１：Google Maps Android API のアクセス許可 -->
    <permission
        android:name="com.rakuraku.android.ekimap.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.rakuraku.android.ekimap.permission.MAPS_RECEIVE" />

    <!-- 追加パーミッション２：現在位置取得のため -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <!-- 追加パーミッション３：Google Mapsの動作に必要 -->
    <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="com.google.android.providers.gsf.permission.READ_GSERVICES" />

    <!-- 追加パーミッション４：OpenGL ES version 2（地図描画用） -->
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.googlemaptest.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- 取得したAPIキーはここに記述　GoogleMapAPI KEY -->
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="＊＊＊＊＊-_d1Xn_p6YhjX1VaZR0rhm-＊＊＊＊" />
    </application>

</manifest>

```

はまったのは、meta-data要素のところで、

```java
<meta-data
  android:name="com.google.android.maps.v2.API_KEY"
  android:value="＊＊＊＊＊-_d1Xn_p6YhjX1VaZR0rhm-＊＊＊＊" />
```
は記述していたけれど、

```java
<meta-data
   android:name="com.google.android.gms.version"
   android:value="@integer/google_play_services_version" />

```
を記述し忘れていました・・・

### 2.GoogleMapの表示実装

※ まんま、[Google Maps APIの基本](http://codezine.jp/article/detail/7440)のサンプルプロジェクトを使用させていただいてます。。すんません。

まずレイアウト側。

```Java:activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

     <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.MapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    />

</RelativeLayout>

```

次に、プログラム側。

```Java:MainActivity.java
package com.example.googlemaptest;


public class MainActivity extends Activity {
	
	// GoogleMapオブジェクトの宣言
    private GoogleMap googleMap;

	@SuppressLint("NewApi")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// MapFragmentオブジェクトを取得
		MapFragment mapFragment = (MapFragment) getFragmentManager()
				.findFragmentById(R.id.map);

		try {
			// GoogleMapオブジェクトの取得
			googleMap = mapFragment.getMap();

			// Activityが初回で生成されたとき
			if (savedInstanceState == null) {

				// MapFragmentのオブジェクトをセット
				mapFragment.setRetainInstance(true);

				// 地図の初期設定を行うメソッドの呼び出し
				mapInit();
			}
		}
		// GoogleMapが使用不可のときのためにtry catchで囲っています。
		catch (Exception e) {
		}
	}
	
	// 地図の初期設定メソッド
	private void mapInit() {

	    // 地図タイプ設定
	    googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

	    // 現在位置ボタンの表示を行なう
	    googleMap.setMyLocationEnabled(true);

	    // 東京駅の位置、ズーム設定
	    CameraPosition camerapos = new CameraPosition.Builder()
	            .target(new LatLng(35.681382, 139.766084)).zoom(15.5f).build();

	    // 地図の中心の変更する
	    googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(camerapos));
	}

}
```

### 6.その他

当たり前かもしれないといえば、それまでかもしれないけど、
別のプロジェクトで同じAPIキーは使用できません。ですので、[GoogleDevelopersConsole](https://console.developers.google.com/project)にて新たにプロジェクトファイルを作って、そのなかでGoogleMapAPIキーを作成しないといけないです。
同じプロジェクトだとAPIキーをいくら作り直しても起動しませんでした。

## 参考させていただいたURL
Google Maps APIの基本: [http://codezine.jp/article/detail/7440](http://codezine.jp/article/detail/7440)

Macでkeytoolコマンドが文字化けしたのでメモ: [http://d.hatena.ne.jp/sakura_bird1/20111218/1324177130](http://d.hatena.ne.jp/sakura_bird1/20111218/1324177130)




以上になります！