Xamarin逆引きTips
Plugins for Xamarinを使いこなすには?(GPS編)
デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinを複数回にわたって紹介していく。今回は、GPSの機能を使える「Geolocator」プラグインを説明する。
前回はFile SystemにPCLから簡単にアクセスするPCLStorageを紹介した。今回は使用する機会が多いであろう、GPSを紹介する。
ネイティブでGPS機能を使用するには
スマホらしいハードウェア固有のセンサー機能の一つであるGPSも、PCLから使用できるとうれしい機能だ。まずは簡単にXamarinネイティブでのGPSの使い方をおさらいする。基本的な部分は「Tips: Xamarin.Formsからプラットフォーム固有の機能を利用するには?(DependencyService利用)」の各プラットフォームの実装部分を参照してほしい。
iOSではCLLocationManager
クラスをインスタンス化してLocationsUpdated
のイベントハンドラー内に処理を記述すればよいだろう。AndroidではLocationManager
クラス使用するが、GetSystemService
経由で取得する点や、Location Providerとして「GPSを使用するGpsProvider
」、「Wi-Fi、3G/4G回線を使用するNetworkProvider
」から指定しなければいけない点に注意してほしい(上記のTips記事では、GpsProviderを指定している)。Xamarin.AndroidでのLocationについて詳しくは、XamarinのドキュメントLocation Services - Xamarin(英語)を参照してほしい。
簡単なサンプルコードはGitHubにアップした。
Geolocatorのインストール
このように各プラットフォームで全く使い方が異なるGPSだが、Geolocator Pluginを使用すればPCLプロジェクトのコードで簡単に取得できる
Xamarin.Formsのプロジェクトを開き、[ソリューション エクスプローラー](Visual Studioの場合)/[ソリューション]ビュー(Xamarin Studioの場合)で一番上のソリューション項目を右クリックして(表示されるコンテキストメニューから)[ソリューションの NuGet パッケージの管理]をクリックする。
[参照]タブで「Xam.Plugin.Geolocator」を検索し、全てのプロジェクトに対してGeolocatorを[インストール]する。
位置情報の取得
次のコードで位置情報の取得ができる。非常に簡単なことがお分かりいただけるだろう。
using Plugin.Geolocator;
using Plugin.Geolocator.Abstractions;
IGeolocator locator = CrossGeolocator.Current;
locator.DesiredAccuracy = 50; // <- 1. 50mの精度に指定
Position position = await locator.GetPositionAsync (timeoutMilliseconds: 10000);
|
IGeolocator
オブジェクトのGetPositionAsync
メソッドはTask<Position> GetPositionAsync(int timeoutMilliseconds = Timeout.Infinite, CancellationToken? token = null, bool includeHeading = false);
というシグネチャで定義されており、タイムアウト、キャンセルトークンなど基本的な機能を備えている。
戻り値の型であるPosition
クラスには、
Latitude
: 緯度(double
型)Longitude
: 経度(double
型)Accuracy
: 精度(double
型)Altitude
: 高度(double
型)TimeStamp
: 取得時間(DateTimeOffset
型)
などのプロパティがある。
その他のAPIとしてバッググラウンドでの処理を管理するAllowsBackgroundUpdates
、位置情報のセンサーがデバイスに存在するかを取得するIsGeolocationAvailable
、位置情報のセンサーがオンになっているかを取得するIsGeolocationEnabled
などのプロパティがある。
APIについての詳細は、Geolocator PluginのReadme(英語)を参照してほしい。
使用する際の注意点
iOS
iOS 8以降で位置情報を取得するにはInfo.plist
ファイルに、
- NSLocationAlwaysUsageDescription
- NSLocationWhenInUseUsageDescription
の定義を追加する必要がある。MacのXamarin Studioの場合は、Info.plist
をダブルクリックして、(分かりづらいが)図1の1の[ソース]タブを選択し、2の[+]ボタンをクリックし、ドロップダウンから上記2つのKeyを追加して、[String]欄にダイアログに表示されるメッセージを入力しておけばよい。
- 1と2については本文中に記載している。
WindowsのVisual Studioの場合は、GUIのエディターで変更ができないため、Info.plist
を右クリックし、コンテキストメニューの[ファイルを開くアプリケーションの選択]から表示される[プログラムから開く]ダイアログで[XML (テキスト) エディター]をクリックしてファイルを開き(図2)、リスト2の要素を<dict>
の子要素の最後に追加すればよい。
<key>NSLocationAlwaysUsageDescription</key>
<string>位置情報を使用します。</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>位置情報を使用します。</string>
|
なお、Xamarin.iOSのネイティブ開発では、CLLocationManager
クラスをインスタンス化して、手動でRequestWhenInUseAuthorization()
メソッドなどを呼び出す必要があるが、このGeolocator Pluginが自動で処理してくれるのでInfo.plist
以外の修正は必要ない。
Android
Androidで位置情報を取得するには、適切なパーミッション設定が必要になる。
[Propeties]の配下にあるAndroidManifest.xml
をダブルクリックしてテキストエディターで開き、<manifest>
要素内に以下の要素を手動で追加してもよいが、
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
Androidプロジェクト項目を右クリックして[プロパティ](Visual Studioの場合)/[オプション](Xamarin Studioの場合)を開き、以下の[ACCESS_COARSE_LOCATION]と[ACCESS_FINE_LOCATION]にチェックを入れるのが楽だろう。
また、Android 6.0 Marshmallow以降は[実行時パーミッションモデル]が採用され、Permissionが必要な機能を実行したときに、以下のダイアログを表示し、ユーザーに許可を得る必要がある。
このダイアログは開発者側が手動で表示する必要があるが、[Geolocator Plugin]は[Target Build]のバージョンをAndroid 6.0 Marshmallow(API23)にしておくと、自動的に表示してくれる。
[実行時パーミッションモデル]について詳しく知りたい方は英語だがAndroid公式ドキュメントか、実行時パーミッションでさらに優れたアプリを構築する - Google Developers Japanを参照してほしい。Xamarinでの実装方法はXamarin公式ドキュメント「Add Permissions to Android Manifest」を参照してほしい。
UWP、Windows Phone、Windowsストア
Xamarin.Formsで作成できるUWPアプリ、Windows Phone 8.1アプリ、Windowsストアアプリについても触れておこう(サンプルのXamarin.Formsプロジェクトにも含めている)(※Windows Phoneのバージョン8.1向けプロジェクトを作成するには、最新のXamarin for Visual Studioをインストールしておく必要がある)。これら全てのプラットフォームでも、Package.appxmanifest
ファイルを開き、[機能]タブで必要な機能の項目をチェックする必要がある(図5)。
UWPでは[場所]、Windows PhoneとWindowsストアでは[近接通信]にチェックを入れておこう。チェックが入っていると、Geolocatorの機能を呼び出した際に以下のような確認ダイアログが表示されるようになる。
まとめ
Geolocator Pluginを使用することで、iOS/Android/UWP/Windows Phoneなどで簡単にGPSの機能を使用することができる。位置情報を利用するアプリを作りたい方はぜひ使ってみてほしい。
【Xamarin関連のイベント情報】Japan Xamarin User Group(JXUG)コミュニティの展示ブース
Xamarinについて詳しく知りたい方は、2/18(木)、19(金)に開催されるデブサミ2016に、筆者が主催するJapan Xamarin User Group(JXUG)コミュニティが出展しているので、ブースに来ていただけると幸いだ。Xamarinのエキスパートを揃えて開発者の皆さまをお待ちしている。
※以下では、本稿の前後を合わせて5回分(第61回~第65回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
62. Plugins for Xamarinを使いこなすには?(ファイルシステム編)
デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinを複数回にわたって紹介していく。今回は、簡単にファイルの入出力が行える「PCL Storage」プラグインを説明する。
63. 【現在、表示中】≫ Plugins for Xamarinを使いこなすには?(GPS編)
デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinを複数回にわたって紹介していく。今回は、GPSの機能を使える「Geolocator」プラグインを説明する。
64. Plugins for Xamarinを使いこなすには?(Device Motion ― 加速度センサー/ジャイロスコープセンサー編)
デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinの一つ、「Device Motion Plugin」プラグインを紹介。今回は、Accelerometer(加速度)センサー、Gyroscope(ジャイロスコープ)センサーの機能を使う方法を説明する。
65. Plugins for Xamarinを使いこなすには?(Device Motion ― 磁気センサー/コンパス編)
デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinの一つ、「Device Motion Plugin」プラグインを紹介。今回は、Magnetometer(磁気)センサー、Compass(コンパス)の機能を使う方法を説明する。