Android
GoogleMapsAPI

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

More than 5 years have 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

以上になります!