ウェブアプリケーション,インジェクション,コマンドインジェクション

Androidアプリ開発 位置情報を扱うサービスいろいろ

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デバイスを使いましょう。


ホーム
便利堂ロゴ
inserted by FC2 system