GPS、Wi-Fi、セルラーネットワークで位置情報を習得
Obtaining GeoGraphical Location Using GPS,Wi-Fi,or Cellular Networks
開発するアプリケーションがGPS、Wi-Fi、
セルラーネットワークでの三角法を使ってユーザの位置の地理情報を
取得する必要があるとします。
ユーザの地理的位置情報を取得するには、LocationManagerクラスと
一緒にLocationListenerインターフェースの使用をさせる必要があります。
package net.learn2develop.lbsgps;
import android.app.Activiry;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
public class MainActivity extends Activity{
LocatinManager lm;
LocatinListener locationListener;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(saveInstanceState);
setContentView(R.layout.activity_main);
}
}
位置の変更を見守るためには、LocationListenerインターフェースの
実行をするクラスを作る必要があります。
package net.learn2develop.lbsgps;
import android.app.Activity;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends Activity{
LocationManager lm;
LocationListener locationListener;
private class MyLocationListener implements LocationListener{
@Override
public void onLocationChanged(Locationloc){
if(loc != null){
Toast.makeText(getBaseContext(), "Llocation changed: Lat:" +
loc.getLatitude() + "Lng: " + loc.getLongitude(),
Toast.LENGTH_SHORT).show();
}
}
@Override
public void onProviderDisabled(String provider){
Toast.makeText(getBaseContext(), "Provider: " + provider + " diabled",
Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderEnabled(String provider){
Toast.makeText(getBaseContext(), "provider: " + provider + " enabled",
Toast.LENGTH_SHORT).show();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras){
String statusString = "";
switch (status){
case android.location.LocationProvider.AVAILABLE:
statusString = "available";
case android.locatin.LocationProvider.OUT_OF_SERVICE:
statusString = "out of service";
case android.location.LocationProvider.TEMPORARILY_UNAVAILABLE:
statusString = "temporarily unavailable";
}
Toast.makeText(getBaseContext(), provider + " " + statusString,
Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
LocationListenerインターフェースの中で、4つのメソッドを
再定義する必要があります。
●onLocationChanged()ーー位置が変化したときに呼び出されます。
●onProviderDisabled()ーーユーザが位置プロバイダを利用できなく
なった時に呼び出されます。
●onProciderEnabled()ーーユーザが位置プロバイダを利用できる状態の
時に呼び出されます。
●onStatusChanged()ーー位置プロバイダの状態が変更されたときに
呼び出されます。
この実行で、プロバイダの状態と位置のように、情報を表示するために
Toastクラスを単純に使います。
位置が変更された時に、onLocationChanged()メソッドの引数が
位置情報を格納します。この引数から、位置の緯度、経度、
その他の役立つ情報として正確さ、高度、速度などを取得できます。
LocationManagerクラスのインスタンスを作るためには、
getSystemServiceメソッドを使い、実行したばかりの
MyLocationListenerクラスのインスタンスを作ることで、
フォローされます。
import android.content.Context;
....
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setCotentView(R.layout.activity_main);
//---use the LocationManager class to obtain locations data---
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationListener = new MyLocationListener();
}
MyLocationListenerクラスで提供される位置更新を申し込むには、
LocationManagerオブジェクトのrequestLocationUpdates()メソッドを
呼び出し、4つの引数をこのメソッドに渡します。
@Override
public void onResume(){
super.onResume();
//---request for lacation updates using GPS---
lm.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
0,
0,
locationListener);
}
4つの引数は以下のとおりです。
●providerーー登録しているプロバイダの名前です。
この場合、GPS_PROVIDER定数("gps")を地理的位置データを取得するため
GPSが使っているかどうかを見るために使い、Wi-Fiやセルラー三角法を
使っているならばNETWORK_PROVIDER("network")を使います。
//---request for location updates using WiFi and Cellular triangulations---
lm.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
0,
0,
locationListener);
●minTimeーー通知の間隔の最小時間、ミリ秒で表示します。
0は位置の変更の続けて伝えたい場合に使います。
●minDistanceーー通知の最小距離間隔、メートルで表示します。
0は位置の変更を続けて伝えたい場合に使います。
●listenerーーonlLocationChanged()メソッドのオブジェクトで、
それぞれの位置が更新された時に呼び出されます。
ちょっと注釈
どのproviderを使うべきか?
もし室内ならばNETWORK_PROVIDER、これはGPSの様に外である必要は
ありません。しかし、NETWORK_PROVIDERは3GやWi-Fiのどちらかの
インターネットにアクセスできる環境が必要になります。
なぜなら、位置の三角測量のためプロバイダは外部のサーバと
コンタクトをとる必要があります。
もし、もっと正確な結果が欲しければ、GPS_PROVIDERを使うべきです。
位置の変更を見続けるのは、デバイスのパッテリー消費が激しいなど
コスト的な心配があり、位置追跡が終了した際にはいつでも
更新を削除すべきです。この更新削除をするには、
LocationManagerオブジェクトのremoveUpdates()メソッドを
経由させます。
@Override
public void onDestoroy(){
super.onDestroy();
//---remove the location listener---
lm.removeUpdates(locationListener);
}
GPS_PROVIDERを使っていくときには、AndroidManifest.xmlの中に、
android.permission.ACCESS_FINE_LOCATIONパーミッションを
加える必要があります。
もしNETWORK_PROVIDERを使っていれば、
android.permission.ACCESS_COARSE_LOCATIONパーミッションを
加える必要があります。
ちょっと注釈
NETWORK_PROVIDERはAVD、Androidエミュレータでは動きません。
もし開発しているコードでNETWORK_PROVIDERを使い、
エミュレータでアプリケーションをテストするのなら、
NETWORK_PROVIDERは不法な例外引数となってしまいます。
NETWORK_PROVIDERを使ったアプリケーションをテストするときには、
実際のAndroidデバイスを使いましょう。
|
【用語解説】
XML
HTMLと同じような言語ですが、
すべての型の複雑なデータ構造を
送信するための設計ができる
ファイル型式。
オブジェクト
ある手続きを持った
データアイテムで、
他の手続きと関連づけされるもの
metaタグ
ウェブページに与える
情報の宣言につかわれ
検索エンジン・ウェブアプリ
などにウェブページの内容を
伝える役目をする。
metaタグの内容は
ページ内に表示されない。
コンストラクタ
オブジェクト指向
プログラミングで使われ
新しいオブジェクトが
作られ時に呼び出される
メソッドのこと。
クラス
オブジェクト指向
プログラミングでの
オブジェクトの型
オブジェクト指向プログラミング
プログラミングの
方式のことで、
プログラマはデータ型を
定義できるだけでなく
自動的にデータ型と
メソッドを関連付け
できる
アクティビティ
Androidにおける
アクティビティは
Androidアプリの画面に
相当するもの
ボタンやウェブページ
など表示されている
すべてのもののこと。
view
Androidのアプリを開発する
上で使う部品のことで、
トリガボタン・イメージボタン
チェックボックスなどのこと。
UI
ユーザインターフェースのこと。
Bind(バインド)
シンボルとデータを
関連させるため
または、データの一片と
他のものを関連させること。
以下は例。
・変数に値を入れる。
(変数の初期化)
・特定のEthernetポートと
ネットワークプロトコルを
関連付けする。
・Javaの変数のセット上に
XML文書を配置すること。
または、ほかの
プログラミング言語でも。
|