読者です 読者をやめる 読者になる 読者になる

酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows Phone 7で加速度センサをシミュレートする(Mangoアップデート以前)

Windows Phone

WP7 RTW時点(及びNoDoアップデート時点)のSDKでは、アプリケーションからアクセスを許されているセンサーデバイスは、GPSと加速度センサーしかありません。GPSと加速度センサーを使ったアプリをWindows Phone エミュレータ上でデバッグするには、Mangoアップデート対応のWindows Phone Developer Toolsのリリースを待たないといけません。

GPSに関しては、Windows Phone GPS Simulatorがリリースされて、Bing MapsとシミュレータAPIを使用することで実機を使わなくてもLocation Serviceのテストが出来るようになりました。

加速度センサのテストは実機を使わないとテスト出来ないのでしょうか?いいえ、そんな事はありません。CodeplexにGPS Simulatorと同じ手法を使ったオープンソースのプロジェクトがいくつか公開されています。

Windows Phone 7 Accelerometer Simulator Kit

App Hubでも紹介されていましたWindows Phone 7 Accelerometer Simulator Kitです。

f:id:ch3cooh393:20160115144321p:plain

Windows Phone 7 Accelerometer Emulator

個人的に上記のWindows Phone 7 Accelerometer Simulator Kitは使い勝手が悪いので、シミュレータと実機かをライブラリ内で判定してくれる Windows Phone 7 Accelerometer Emulatorが便利です。

どのような実装になっているかについては、軽くAccelerometer Support on WP7 Emulator - CodeProjectで紹介されています。

MaciejGrabek.WP7Accelerometer.dllを参照して、以下のコードを呼ぶだけで加速度センサーの値が取得できます。Rxを使ってなるべく簡潔にしてみました。

//using MaciejGrabek.WP7Accelerometer;
//using Microsoft.Phone.Reactive;

public MainPage()
{
    InitializeComponent();

    // ライブラリ内で実機かエミュレータかを判定してインスタンスを生成
    var acc = new WP7AccelerometerProvider();

    // Rxで取得した値をTextBlockに表示するように非同期処理を定義
    var ReadingChanged =
        Observable.FromEvent<WP7AccelerometerReadingEventArgs>(acc, "ReadingChanged");
    ReadingChanged.Select(arg => {
            return String.Format("X={0:F2}\n Y={1:F2}\n Z={2:F2}\n\n",
                arg.EventArgs.X, arg.EventArgs.Y, arg.EventArgs.Z);
        })
        .ObserveOnDispatcher()
        .Subscribe(text => txtblk.Text = text);

    // 加速度センサーの値を取得開始
    acc.Start();
}

上記のコードを実行してみました。

Mangoアップデート対応のWindows Phone Developer Toolsは今月末のリリースのようですが、それまで我慢できない!とおっしゃる方は是非利用してみてください。