【Xamarin】【Android】GPSを使う

いま流通しているAndroid端末にはたいていの場合GPS機能が搭載されていると思う.今回は,そんなGPSを扱う手法を紹介していく.

環境

GPS機能を開発するにあたって、僕の手元にある環境.

  • Android 8.0
  • Xperia XZ1
  • Xamarin.Android

レイアウト

とりあえずまずはレイアウトを実装しましょう.

なんてことはありません.GPSで取得した緯度・経度・高度が表示さえできればそれ以上は求めないのです.

今回のサンプルでは,必要最低限ということでこんな感じにレイアウトしています.


 
 
 

プログラム

パーミッションの確認

AndroidでGPSを使用する場合は2種類の設定があって,大体(Coarse)の位置情報精密(Fine)な位置情報がある.

で,精密な方を使おうと思うと権限を要求する必要がある.てのと,こいつらを使う場合にはAndroidManifestに記述しないといけない.

AndroidManifest

権限の確認をするためのコードはこんな感じ.

if(CheckSelfPermission(Manifest.Permission.AccessFineLocation) != Permission.Granted) {
 ActivityCompat.RequestPermissions(this,
   new string[] { Manifest.Permission.AccessFineLocation },
   1);
 }

このコードを実行することで,許可するかどうかを確認するダイアログが表示される.

で,そのダイアログを処理するためのコールバックを実装する必要がある.

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) {
 Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
 if(grantResults[0] == Permission.Granted) {
  // (1)
  using(var locationCriteria = new Criteria()) {
   LocationManager = (LocationManager)GetSystemService(LocationService);
   locationCriteria.Accuracy = Accuracy.Fine;
   locationCriteria.PowerRequirement = Power.NoRequirement;
   LocationProvider = LocationManager.GetBestProvider(locationCriteria, true);
  }
 }
 base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

もし,ダイアログで確認した結果がGrantedだったらGPSの設定を行いますよ〜〜ってやつ.(1)の内容は後述の章で解説するね.

GPSの取得

てことで本題のGPSの取得に移ろう.

まず,GPSを利用するためにはいくつか方法があるらしいんだけど,今回紹介する方法はAndroid.Locations.ILocationListenerを基底に持つという方法.つまりこういうこと.

public class MainActivity : AppCompatActivity, Android.Locations.ILocationListener {

GPS精度の確定

GPSを利用する上で,精度を決める必要がある.

精度を定めた上で,それに見合った設定を自動で洗濯してくれるような素晴らしい機能があるのでぜひそれを利用したい.

これがさっきの(1)ね

using(var locationCriteria = new Criteria()) {
 LocationManager = (LocationManager)GetSystemService(LocationService);
 locationCriteria.Accuracy = Accuracy.Fine;
 locationCriteria.PowerRequirement = Power.NoRequirement;
 LocationProvider = LocationManager.GetBestProvider(locationCriteria, true);
}

locationCriteriaって変数でGPSの精度を条件付けして,LocationManagerGetBestProviderって関数で選択を行なってる.簡単簡単.

システムへの通知要求

設定を行ったら,GPSのデータ更新のタイミングで通知してもらうようにシステムに要求する必要がある.一瞬です.

LocationManager.RequestLocationUpdates(LocationProvider, 1500, 1, this);

さっきのプロバイダと(最低)更新間隔,最低距離,Android.Locations.ILocationListenerを規定としたクラスの4つを引数に指定するだけ.

データの取得

GPSのデータが更新されたらコールバックが呼び出される.

void ILocationListener.OnLocationChanged(Location location) {
 lng.Text = location.Longitude.ToString();
 lat.Text = location.Latitude.ToString();
 alt.Text = location.HasAltitude? location.Altitude.ToString() : "N/A";
}

locationって変数の中に色々詰まってるのでどうぞご自由にって感じ.

めっちゃ適当な解説だったけどいいかな.

あわせて読みたい