しむしむてるるの日記&雑談 同人誌の進捗やら仕事のあれこれやら書いています。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | TB(-) | CM(-)

Geocoderクラスを使って住所から緯度/経度を取得する

今回はAndroidで住所から緯度/経度を取得するプログラムについてです。
この手のプログラムコードについては色々なサイトに載っているのですが、
少々つまずくポイントがあったので記事にしておきます。

まずは、プログラムコードを掲載。

MainActivity.java
package jp.sweetsblast.geotest2;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.app.Activity;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {

@Override
public void onCreate( Bundle bundle){
super.onCreate( bundle);

TextView textView = new TextView(this);
setContentView( textView);

Geocoder geocoder = new Geocoder( this, Locale.getDefault());
try{
List<Address> addrList = geocoder.getFromLocationName("京都府京都市南区",1);
if( addrList.isEmpty() ){
textView.setText( "list is empty");
}else{
Address address = addrList.get(0);
String str = address.getLatitude() + "," + address.getLongitude();
textView.setText(str);
}
}catch( IOException e){
textView.setText( "IOException 発生");
}
}
}

念のためにマニフェストも載せておきます。
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.sweetsblast.geotest2"
android:versionCode="1"
android:versionName="1.0">

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="7" />

<application android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme">
<activity android:name="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>

</application>

</manifest>


さて、ここからが本番です。
まずは引っ掛けポイントその1:ビルドターゲット
Geocoderクラスを使う場合は、ビルドターゲットをgoogle APIsにします。
Geocoder ターゲットAPI


実はこの部分で長く引っかかってました。
Geocoder自体はAndroidの標準APIなので、標準APIをビルドターゲットにしていたのですが、そうするとgetFromLocationName()メソッドで必ず空リストが帰ってきます。
どうやらクラス内部でGoogleAPIに含まれるAPIを使っているようです。
一応リファレンスにも書いてあるのですが...
The Geocoder class requires a backend service that is not included in the core android framework. The Geocoder query methods will return an empty list if there no backend service in the platform. Use the isPresent() method to determine whether a Geocoder implementation exists.(一部を抜粋)

簡単に訳すと、
Geocoderクラスは標準のAndroid frameworkに含まれないサービスを必要とします。プラットフォームにそのサービスが無ければメソッドは空のリストを返します。Geocoderクラスが実装されているかはisPresent()メソッドを使って確認して下さい。

となります。(たぶん...)
つまり、標準のframeworkだけだと動かず、googleAPIが必要となります。
そんな訳でビルドターゲットをgoogleAPIsにする必要があるのです。
ちなみに、リファレンスに書かれている isPresent() メソッドですが、
APIレベルが9(Android2.3)以上じゃないと使えません。(^^ι
Android2.3以前でも対応させるには、上のリストのように空リストが帰って来た場合の処理をして対応させる必要があります。

続いて引っ掛けポイントその2:エミュレータのバグ
Android2.2のエミュレータで実行するとIOExceptionの例外が発生します。
これはネット上に情報が転がっていたので、簡単に解決しました。
どうやら、2.2や2.3のエミュレータではGeocoderが動かないみたいです。
2.1では動くので、ビルドターゲットを(Google)APIレベル7にしてAndroid(Google)2.1のエミュレータで実行しましょう。

これで、無事に動くようになりました。
GeoTest2 実行結果

関連記事
スポンサーサイト
[ 2012/07/02 02:46 ] Androidアプリ開発 | TB(0) | CM(1)
承認待ちコメント
このコメントは管理者の承認待ちです
[ 2014/09/12 10:37 ] [ 編集 ]
コメントの投稿












管理者にだけ表示を許可する
トラックバック:
この記事のトラックバック URL

FC2カウンター
カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
Twitter@sweetsblast
過去ログ

2017年 08月 【1件】
2017年 06月 【3件】
2017年 05月 【3件】
2017年 04月 【3件】
2017年 03月 【5件】
2017年 01月 【1件】
2016年 09月 【2件】
2016年 04月 【2件】
2016年 03月 【2件】
2016年 01月 【5件】
2015年 12月 【3件】
2014年 05月 【1件】
2014年 04月 【1件】
2013年 12月 【1件】
2013年 03月 【4件】
2013年 02月 【3件】
2013年 01月 【1件】
2012年 12月 【3件】
2012年 11月 【4件】
2012年 10月 【2件】
2012年 09月 【4件】
2012年 08月 【2件】
2012年 07月 【3件】
2012年 06月 【11件】
2012年 05月 【11件】
2012年 04月 【9件】
2012年 03月 【15件】
2012年 02月 【17件】
2012年 01月 【5件】
2011年 12月 【14件】
2011年 11月 【11件】
2011年 10月 【19件】
2011年 09月 【10件】
2011年 08月 【4件】
2011年 07月 【11件】
2011年 06月 【4件】
2011年 05月 【1件】
2011年 04月 【17件】
2011年 03月 【29件】
2011年 02月 【24件】
2011年 01月 【30件】
2010年 12月 【30件】
2010年 11月 【22件】
2010年 10月 【26件】
2010年 09月 【27件】
2010年 08月 【30件】
2010年 07月 【27件】
2010年 06月 【24件】
2010年 05月 【7件】
2010年 04月 【6件】
2010年 03月 【3件】
2010年 02月 【6件】
2010年 01月 【8件】
2009年 12月 【8件】
2009年 11月 【5件】
2009年 10月 【7件】
2009年 09月 【18件】
2009年 08月 【22件】
2009年 07月 【14件】
2009年 06月 【16件】
2009年 05月 【28件】
2009年 04月 【25件】
2009年 03月 【5件】
2009年 01月 【2件】
2008年 12月 【1件】
2008年 11月 【2件】
2008年 10月 【3件】
2008年 09月 【6件】
2008年 08月 【3件】
2008年 07月 【2件】
2008年 06月 【2件】
2008年 05月 【3件】
2008年 04月 【4件】
2008年 03月 【11件】
2008年 02月 【12件】
2008年 01月 【7件】
2007年 12月 【8件】
2007年 11月 【5件】
2007年 10月 【8件】
2007年 09月 【6件】
2007年 08月 【15件】
2007年 07月 【10件】
2007年 06月 【14件】
2007年 05月 【12件】
2007年 04月 【10件】
2007年 03月 【7件】
2007年 02月 【19件】
2007年 01月 【18件】
2006年 12月 【25件】
2006年 11月 【27件】
2006年 10月 【19件】
2006年 09月 【26件】
2006年 08月 【12件】
2006年 07月 【5件】



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