73
72

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-04-16

けっこーめんどくさいところがあったので、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のお試し使用&調べ中で使っているので、わかってきたら、また加筆修正したいと思います。)

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

  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

以上になります!

73
72
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
73
72

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?