Android
GoogleMapsAPI

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

More than 1 year has passed since last update.

けっこーめんどくさいところがあったので、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に関しては、v2が最新とのこと(2014年3月16日 現在)。
勘違いしてました。。

参照:Google maps API V3についての質問です!

ということで、
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へアクセスして、プロジェクトを作成し、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キーを設定したりします。

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" />

    <!-- 追加パーミッション1: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" />

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

    <!-- 追加パーミッション3: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" />

    <!-- 追加パーミッション4: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要素のところで、

<meta-data
  android:name="com.google.android.maps.v2.API_KEY"
  android:value="*****-_d1Xn_p6YhjX1VaZR0rhm-****" />

は記述していたけれど、

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

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

2.GoogleMapの表示実装

※ まんま、Google Maps APIの基本のサンプルプロジェクトを使用させていただいてます。。すんません。

まずレイアウト側。

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>

次に、プログラム側。

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にて新たにプロジェクトファイルを作って、そのなかでGoogleMapAPIキーを作成しないといけないです。
同じプロジェクトだとAPIキーをいくら作り直しても起動しませんでした。

参考させていただいたURL

Google Maps APIの基本: http://codezine.jp/article/detail/7440

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

以上になります!