Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
Xamarin逆引きTips

Xamarin逆引きTips

Plugins for Xamarinを使いこなすには?(GPS編)

2016年2月17日

デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinを複数回にわたって紹介していく。今回は、GPSの機能を使える「Geolocator」プラグインを説明する。

田淵 義人(@ytabuchi
  • このエントリーをはてなブックマークに追加

 前回は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を[インストール]する。

位置情報の取得

 次のコードで位置情報の取得ができる。非常に簡単なことがお分かりいただけるだろう。

C#
using Plugin.Geolocator;
using Plugin.Geolocator.Abstractions;

IGeolocator locator = CrossGeolocator.Current;
locator.DesiredAccuracy = 50; // <- 1. 50mの精度に指定

Position position = await locator.GetPositionAsync (timeoutMilliseconds: 10000);
リスト1 位置情報の取得

 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 [ソース]タブでKeyを追加
図1 [ソース]タブでKeyを追加
  • 12については本文中に記載している。

 WindowsのVisual Studioの場合は、GUIのエディターで変更ができないため、Info.plistを右クリックし、コンテキストメニューの[ファイルを開くアプリケーションの選択]から表示される[プログラムから開く]ダイアログで[XML (テキスト) エディター]をクリックしてファイルを開き(図2)、リスト2の要素を<dict>の子要素の最後に追加すればよい。

図2 [プログラムから開く]ダイアログ
図2 [プログラムから開く]ダイアログ
XML
<key>NSLocationAlwaysUsageDescription</key>
<string>位置情報を使用します。</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>位置情報を使用します。</string>
リスト2 Info.plistファイルにKeyを追加

 なお、Xamarin.iOSのネイティブ開発では、CLLocationManagerクラスをインスタンス化して、手動でRequestWhenInUseAuthorization()メソッドなどを呼び出す必要があるが、このGeolocator Pluginが自動で処理してくれるのでInfo.plist以外の修正は必要ない。

Android

 Androidで位置情報を取得するには、適切なパーミッション設定が必要になる。

 [Propeties]の配下にあるAndroidManifest.xmlをダブルクリックしてテキストエディターで開き、<manifest>要素内に以下の要素を手動で追加してもよいが、

XML
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
リスト3 AndroidManifest.xmlファイルに追加する要素

Androidプロジェクト項目を右クリックして[プロパティ](Visual Studioの場合)/[オプション](Xamarin Studioの場合)を開き、以下の[ACCESS_COARSE_LOCATION]と[ACCESS_FINE_LOCATION]にチェックを入れるのが楽だろう。

図3 Permissionの追加

 また、Android 6.0 Marshmallow以降は[実行時パーミッションモデル]が採用され、Permissionが必要な機能を実行したときに、以下のダイアログを表示し、ユーザーに許可を得る必要がある。

図4 [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)。

図5 [機能]タブ
図5 [機能]タブ

 UWPでは[場所]、Windows PhoneとWindowsストアでは[近接通信]にチェックを入れておこう。チェックが入っていると、Geolocatorの機能を呼び出した際に以下のような確認ダイアログが表示されるようになる。

図6 UWPの確認ダイアログ

まとめ

 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]を参照してください。

Xamarin逆引きTips
61. Xamarin Android Playerを使うには?

Xamarin製の高性能Android EmulatorであるXamarin Android Playerの使い方を紹介する。

Xamarin逆引きTips
62. Plugins for Xamarinを使いこなすには?(ファイルシステム編)

デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinを複数回にわたって紹介していく。今回は、簡単にファイルの入出力が行える「PCL Storage」プラグインを説明する。

Xamarin逆引きTips
63. 【現在、表示中】≫ Plugins for Xamarinを使いこなすには?(GPS編)

デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinを複数回にわたって紹介していく。今回は、GPSの機能を使える「Geolocator」プラグインを説明する。

Xamarin逆引きTips
64. Plugins for Xamarinを使いこなすには?(Device Motion ― 加速度センサー/ジャイロスコープセンサー編)

デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinの一つ、「Device Motion Plugin」プラグインを紹介。今回は、Accelerometer(加速度)センサー、Gyroscope(ジャイロスコープ)センサーの機能を使う方法を説明する。

Xamarin逆引きTips
65. Plugins for Xamarinを使いこなすには?(Device Motion ― 磁気センサー/コンパス編)

デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinの一つ、「Device Motion Plugin」プラグインを紹介。今回は、Magnetometer(磁気)センサー、Compass(コンパス)の機能を使う方法を説明する。

サイトからのお知らせ

Twitterでつぶやこう!