かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Windows ストア アプリでセンサーを使う方法

センサー使ったアプリって未来を感じますよね。どこらへんで感じるかというと、デバッグ方法とかが大変というあたりに、とても出立ての技術だな〜と。だから、これからどんどん開発環境が整備されてデバッグ環境も整備されて使われていくようになるだろう!!と思ってます。

どんなセンサーがあるの?

まぁ、そんなこんなでWindows Runtimeにもセンサー系のAPIがずらっとあります。

Windows.Devices.Sensors namespaceのクラス

こんだけセンサーを表すクラスがあります。

  • Accelerometer
    • 加速度とか端末を振ったとかそういうのを検知できます
  • Compass
    • コンパスです。説明不要ですよね?
  • Gyrometer
    • ジャイロ!!ひねったりとかしたのを検知できます。
  • Inclinometer
    • 傾きとかをはかったり
  • LightSensor
    • 明るさを知ることができます
  • OrientationSensor
    • デバイスの方向データとか取れるみたいです。四元数ってなぁにい?という感じ…。
  • SimpleOrientationSensor
    • すいませんだれか上のOrientatiionSensorと合わせて詳しい解説お願いします。

凄い参考になる記事

まぁ、センサーについては私が解説するまでもなくWindows 8 アプリ開発者ブログで書かれてます。

センサーAPIでこれだけは覚えておくといいこと

センサーAPIをざっと眺めてると、どのクラスも同じように使えるように設計されてるんだな〜ということに気付きます。見ていきましょう。

センサーの取得方法

GetDefaultというstaticなメソッドを使います。このメソッドの戻り値がnullの場合はセンサーがついてないということになります。

var sensor = センサーのクラス.GetDefault();
if (sensor == null)
{
    // センサーついてない
}
センサーから今の値を取得する方法

GetCurrentReadingというインスタンスメソッドを使います。センサーから得られる結果を格納した*****Readingという名前のクラスのインスタンスが返ってきます。

var sensor = センサーのクラス.GetDefault();
// センサーから今の値を取得
var reading = sensor.GetCurrentReading();

例えばLightSensorクラスの場合は、LightSensorReadingというクラスのインスタンスが返ってきます。こいつにはIlluminanceInLuxというルクスという単位で明るさを表した値と、Timestampというセンサーが値を取得した時間が入ってます。因みにTimestampというプロパティは****Reading型は共通で持ってます。

センサーからリアルタイムに値を取得する方法

センサーのReadingChangedというイベントを購読することで、センサーが値の変更を感じ取ったタイミングで今現在の値を取得できます。ReadingChangedイベントは、第一引数がセンサーの型で、第二引数が****ReadingChangedEventArgsという型です。****ReadingChangedEventArgsのReadingプロパティでセンサーの値を保持する****Readingクラスのインスタンスを取得できます。

private ****Sensor sensor;
private void Init()
{
  sensor = ****Sensor.GetDefault();
  sensor.ReadingChanged += sensor_ReadingChanged;
}

private void sensor_ReadingChanged(****Sensor sender, ****ReadingChangedEventArgs args)
{
  var reading = args.Reading;
  // センサーの値を使って処理をする
}

まとめ

Windows RuntimeのセンサーのAPIは、全部が同じ感覚で使えるように整理されてて、とても使いやすいです。1つの使い方を覚えたら他も同じようにいけるっていうのはありがたいですね。ということでセンサーを使ったアプリを組むのは簡単だよ!!
デバッグは端末を振ったり、上向けたりしたりと色々大変そうですが…。

蛇足

GPSだけ、毛色が違うんですよね…なじぇじゃ…。