けっこーめんどくさいところがあったので、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についての質問です!]
(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へアクセスして、プロジェクトを作成し、APIキーを取得します。
GoogleDevelopersConsoleが新しくなったのですが、設定の仕方がわかりづらかったので、前のコンソールで設定してます。
(GoogleDevelopersConsoleに関しては、MobileBackendStarterのお試し使用&調べ中で使っているので、わかってきたら、また加筆修正したいと思います。)
右下あたりにちっちゃく「元のコンソールに戻る」というリンクがあるので、そこから戻りました。
-
左メニューのセレクトボックスから、先ほど作成したプロジェクトを選択。
-
左メニューの「Service」をクリックして、「GoogleMapsAndroid API v2」を「ON」にします。
-
左メニューの「APIAccess」をクリックして「SimpleAPIAcess」の「Create new Android key …」をクリックします。
-
キーを設定するダイアログが表示されるので、例に沿って、
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キーを設定したりします。
<?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の基本のサンプルプロジェクトを使用させていただいてます。。すんません。
まずレイアウト側。
<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>
次に、プログラム側。
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
以上になります!