忘れな~い録

プログラミングの備忘録

移転しました
http://www.tkyaji.com/

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


  1. --/--/--(--) --:--:--|
  2. スポンサー広告

AndroidでGoogleMap

Android から Google Map API を使用する方法。

1.証明書のフィンガープリントの取得


Android から Google Map API を使用するには、APIキーを使用する必要がある。
これはPC用のAPIキーとは別途取得が必要になる。

APIキーを取得する際に、証明書のフィンガープリントを指定しなければならない。
そのため、まずは開発マシンで、このフィンガープリントを生成する。
フィンガープリントの生成には、JDKの「bin」ディレクトリに存在する「keytool」を、以下のように実行する。

keytool -list -keystore <keystoreファイル>

<keystoreファイル>には、Androidのkeystoreファイルを指定する。
このファイルは、以下のディレクトリに存在するはずだ。

<ユーザのホームディレクトリ>/.android/debug.keystore

上記を踏まえ、Windowsでは以下のようにコマンドプロンプトから実行するといけるはず。

"%JAVA_HOME%\bin\keytool.exe" -list -keystore "%HOMEPATH%\.android\debug.keystore"

実行すると、「キーストアのパスワードを入力してください」と表示されるが、これはブランクでOK。
正しく実行できると、以下のように証明書のフィンガープリントが生成されるので、この値をとっておく。

フィンガープリント


2.APIキーの取得


以下のURLを開き、Google Maps APIキーを取得する。

http://code.google.com/intl/ja/android/maps-api-signup.html

規約に同意するチェックボックスにチェックを入れ、「My certificate's MD5 fingerprint」という入力欄に、
先ほど取得したフィンガープリントの値を入力する。
「Generate API Key」ボタンを押せば、APIキーが生成される。

Google Maps API Key


3.AndroidManifest.xml の変更


まずはマニフェストファイルを編集する。プロジェクトの直下に「AndroidManifest.xml」というファイルがあるので、
このファイルを開く。ダブルクリックで開くと自動的に「Android Manifest Editor」で開かれる。
この「Android Manifest Editor」の下部にいくつかタブがあるので、一番右の「AndroidManifest.xml」を開き、直接XMLを編集する。

Google Maps API を使用するために、下記の赤字の箇所を追記する。

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Test"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<uses-library android:name="com.google.android.maps"></uses-library>

</application>
<uses-sdk android:minSdkVersion="3" />

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

</manifest>


4.レイアウトの変更


次はレイアウトの編集。レイアウトファイル(main.xml)を開き、Google Map用のコンポーネントを追加する。
しかし、このコンポーネントは「Layouts」サイドバーには存在しないため、XMLファイルを直接編集する。
Layout Editor の下に「Layout」「main.xml」という2つのタブがあるので、「main.xml」を選択し、XMLを直接編集する。

Android Layout Editor


プロジェクトを作っただけのHellloWorldアプリの状態であれば、上記のように表示されているはず。
このXMLファイルを、以下のように編集する。なお、「android:apiKey」の値に生成したAPIキーを設定する。

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

<LinearLayout android:id="@+id/LinearLayout01" android:layout_height="wrap_content"
android:layout_width="fill_parent">
<EditText android:id="@+id/EditText01" android:layout_height="wrap_content"
android:layout_width="wrap_content" android:layout_weight="10"></EditText>
<Button android:id="@+id/Button01" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_gravity="right|center_vertical"
android:text="検索" android:layout_weight="2"></Button>
</LinearLayout>

<com.google.android.maps.MapView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:apiKey="0IUcND_s9PSkICeIKJ3bBa0MBEkTJO8mtRxtkKA"
android:id="@+id/MapView01" android:clickable="true" android:focusable="true"/>


</LinearLayout>


上記のとおり設定した後、main.xmlの「Layout」タブを開くと、以下のように表示されるはず。
Buttonが日本語のため文字化けしているが、実行時にはちゃんと表示されるため問題ない。

Google Map Sample Layout


5.Javaファイルの変更


最後のJavaのソースを編集する。

package com.wasurenairoku;

import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.Locale;

import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;

public class GoogleMapSample extends MapActivity {

private MapView mapView;
private EditText editText;
private Button button;
private Geocoder getcoder;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

mapView = (MapView) findViewById(R.id.MapView01);
editText = (EditText) findViewById(R.id.EditText01);
button = (Button) findViewById(R.id.Button01);

// Geocoderを取得
getcoder = new Geocoder(GoogleMapSample.this, Locale.getDefault());


button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
List<Address> addressList = getcoder.getFromLocationName(editText.getText().toString(), 1);
if (addressList != null && addressList.size() > 0) {
Address address = addressList.get(0);
// 緯度
double lat = address.getLatitude();
// 経度
double lng = address.getLongitude();
GeoPoint point = getGeoPoint(lat, lng);
// Mapの中央を変更
mapView.getController().setCenter(point);
// MapのZoomレベルを変更
mapView.getController().setZoom(16);


// ソフトウェアキーボードを消す
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
}

@Override
protected boolean isRouteDisplayed() {
return false;
}

private GeoPoint getGeoPoint(double latitude, double longitude) {
// doubleからintへ変換
BigDecimal latDecimal = new BigDecimal(String.valueOf(latitude));
BigDecimal lngDecimal = new BigDecimal(String.valueOf(longitude));
// 小数点第6位まで四捨五入
latDecimal = latDecimal.setScale(6, RoundingMode.HALF_UP);
lngDecimal = lngDecimal.setScale(6, RoundingMode.HALF_UP);
// 10の6乗をかけてint型に変換
latDecimal = latDecimal.multiply(BigDecimal.valueOf(1E6));
lngDecimal = lngDecimal.multiply(BigDecimal.valueOf(1E6));

GeoPoint point = new GeoPoint(latDecimal.intValue(), lngDecimal.intValue());
return point;
}
}


「検索」ボタンを押したら、EditTextに入力した文字列で位置を検索し、その位置にMapを移動している。
住所等の文字列から位置情報を取得しているのが、「Geocoder#getFromLocationName」だ。
ここでAddressオブジェクトのリストが返却され、さらにAddressオブジェクトの中から緯度経度を取得している。
ここで取得できる緯度経度はdouble型なのだが、MapViewにセットするGeoPointオブジェクトでは、
緯度経度の値はint型で持っているため変換する必要がある。10の6乗をかけてから、int型に変換すれば良い。
※何故ここだけint型にしたのだろう…?

実行画面
Google Map Sample

※Android2.0のエミュレータでは日本語が入力できなかった。
ただ、実機で日本語を入力した場合は問題なく検索できている。


以上。
スポンサーサイト


  1. 2009/11/07(土) 21:43:39|
  2. Android
  3. | トラックバック:0
  4. | コメント:0
<<iBATIS3 を使ってみる | ホーム | Android開発の基本>>
コメント
コメントの投稿

管理者にだけ表示を許可する

トラックバック
トラックバックURLはこちら
http://yajiblog.blog101.fc2.com/tb.php/35-bf7a5792
この記事にトラックバックする(FC2ブログユーザー)
最新記事

月別アーカイブ

カテゴリ

未分類 (0)
日記 (1)
GWT (14)
Java (10)
Linux (3)
VBA (2)
XML (1)
Android (6)
Lucene (6)
Hadoop (1)
iBATIS (2)
dojo toolkit (1)
HTML5 (1)
iPhoneアプリ (1)

全記事表示リンク

全ての記事を表示する

メールフォーム

名前:
メール:
件名:
本文:

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する

ブロとも申請フォーム

この人とブロともになる

QRコード

QRコード

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。