Windows Phoneアプリケーション開発入門

第30回新機能が盛り沢山のアップデート「Mango」発表

はじめに

MIX11の2日目。基調講演にてWindows Phone 7の新しいアップデート「Mango」についての解説がありました。過去からコードネームがリークされていましたが公に認めた形になります。リークされていた内容通り、日本語を含む多言語対応やHTML5に対応したIE 9ベースのIE Mobileが搭載されたり、iPhoneやAndroidと比較してWindows Phoneが弱かった低レイヤーをサポートするAPIが沢山追加されています。MangoでWindows Phoneが大きく変わります。

画像

基調講演にて取り上げられた新機能についていくつかご紹介したいと思います。

Sockets

スマートフォンユーザーの求めているアプリケーションのひとつに「Skype」があります。過去にWindows Mobile用のアプリケーションがリリースされていましたが、Windows Phone向けには現時点ではリリースされていません。その理由のひとつにSocket通信が許容されていないという理由がありましたが、今回のアップデートにてSkypeがリリースされる土壌は整ったと言えます。

そのほかにもシンプルなチャットプロトコルのIRCを扱うアプリケーションを作ってデモをしていました。Socket通信ができるようになりアプリケーションの幅が広がることは間違いありません。

RawCamera

Windows Phoneに搭載されているSilverlight for Windows Phoneは、Silverlight 3がベースとなっています。Mangoでアップデートの掛かるSilverlightのバージョンは、4相当となりカメラプレビューの直接入力がサポートされます。

Mango以前ではCameraCaptureTaskを使用して、標準カメラアプリケーションでしか撮影を行うことができませんでしたが、カメラプレビューが直接扱えることによりAR(拡張現実)アプリケーションが増えてくるかもしれません。また、もうひとつ大きなカメラにまつわるアップデートがあります。バーコードリーダーが標準APIとして用意されるようです。デモでは書籍のバーコードを読み込み、Amazon APIを使って書籍の詳細情報を表示していました。業務用端末としてのWindows Phoneという切り口もアリかもしれません。

画像

Access to Contants & Calender

連載第25回でも取り上げましたが、Windows Mobileでは扱えていたアドレス帳やカレンダーのデータに対して、Windows Phoneではアプリケーションから直接アクセスすることが許されていませんでした。MangoアップデートではこれらがAPIとして提供され、標準アプリの代わりになるようなスケジュール管理アプリケーションやアドレス帳アプリケーションを開発することが可能になります。

More Sensor

地磁気センサーや照度センサーは、端末メーカーがWindows Phoneに載せなければいけない必須の項目とされていましたが、公式にはAPIが提供されておらず、Microsoftや端末メーカー製のアプリケーションからでしか扱うことができませんでした。

これらのセンサーとジャイロセンサーに対応するようです。ジャイロセンサーは当初出していた要求仕様に含まれていないのでオプション扱いとなりますが、アプリケーションから端末に搭載されているセンサーデバイスの機能を扱えるようになります。

Background Agent

Windows Phoneではマルチタスクが廃止されて、シングルタスクが採用されました。それにはいくつか理由があるそうですが、大きな理由としては制限無しにバックグラウンドで処理が動かせてしまうとバッテリーを大量に消費してしまいます。そこで、バッテリー消費を抑えるように制限を設けたバックグラウンド・エージェントという仕組みが追加されるそうです。

Background Agentでできることは、タイルの表示操作、アラート表示、Location Service(GPS⁠⁠、NetworkとSocketの通信系、ほとんどの.NET Framework API。できないこととしては、UIに関わること、カメラ、電話、Location Service(GPS)を除くSensor系APIのようです。AudioについてはBackground Audioという別のAPIが使えるようです。

SilverlightとXNAの相互運用

現時点でも一部アセンブリを使用することは可能ですが、フレームワークモデルでの相互運用が可能になるそうです。XNAの得意分野と言えばゲームに代表される3Dの分野ですが、文字入力ひとつを取っても実装は困難のようでした。一方、Silverlightの得意分野は豊富なコントロールです。このふたつを相互に運用させることで、例えばXNAで3Dのキャラクターが動く中、文字入力させるのにSilverlightのTextBoxコントロールを使用することが可能となるそうです。

開発ツールのアップデート

Visual Studio 2010 Express for Windows Phoneに、パフォーマンスプロファイラが搭載されます。CPU、GC Collect、メモリ等のプロファイリングが可能になりました。リソースの乏しいスマートフォンのアプリケーションを開発する上では、かなり心強い存在になるのではないでしょうか。リアルタイムプロファイリングではありませんが、Mangoアップデート対応のWindows Phone Developer Toolsのリリースが楽しみです。

また、Windows Phone エミュレータも大幅にアップデートされているようで、GPSと加速度センサーとジャイロセンサーをシミュレートする機能が搭載されるようです。

Mangoアップデート対応のWindows Phone Developer Tools

WP7 RTW時点(およびNoDoアップデート時点)のSDKでは、アプリケーションからアクセスを許されているセンサーデバイスは、GPSと加速度センサーしかありません。しかし、Windows PhoneエミュレータとしてGPSと加速度センサーをシミュレートする機構は用意されていないため、Mangoアップデート対応のWindows Phone Developer Toolsのリリースを待たないといけません。Mangoに対応した新しいWindows Phone Developer Toolsの登場は5月下旬になるとのことです。

新バージョンがリリースされるまでエミュレータ上でGPSを使ったテストはできないのでしょうか? いいえ、そんなことはありません。現時点のWindows Phone Developer Toolsでできることを考えてみましょう。

GPSをシミュレートする

App Hubにて紹介されていたGPSシミュレータのWindows Phone GPS Emulatorを使うことで、Windows PhoneエミュレータでGPSを使ったアプリケーションのテストを行うことができます。

デスクトップ上のアプリケーションにはBing Mapsコントロールがあり、開始地点を選択して地図上をダブルクリックしていくだけでルートリストを作成することができます。ルートリストを作り終わったら、Windows Phone GPS Emulatorの左下にあるSimulation Startをクリックします。

画像

あとは時間を追うごとに指定したルート通りにWindows Phone GPS Emulatorの矢印が移動します。この時、Windows Phoneエミュレータから位置情報を取得していた場合は、連動してマーカーが動きます。このコマの位置情報をWindows Phoneエミュレータで受け取ることになります。動きのイメージとしては以下のような感じです。Windows PhoneエミュレータからHTTPにてリクエストがあれば現在の位置情報を返します。

画像

エミュレータ実行の場合は専用のGeoCoordinateWatcherクラスを使用しますが、イベントハンドラも共用で使えるので、インスタンスの生成時の切り替えだけで実機&シミュレータで可能です。使い方ですが、GeoCoordinateWatcherクラスのインスタンスを生成している箇所に、以下のコードを追加するだけです。動作している端末が実機(DeviceType.Device)かエミュレータ(DeviceType.Emulator)かを判別して、GpsEmulatorClient名前空間のGeoCoordinateWatcherを使います。

IGeoPositionWatcher<GeoCoordinate> _watcher;
if (Microsoft.Devices.Environment.Devicetype == Microsoft.Devices.DeviceType.Device)
{
    // 実機上なのでSystem.Device.Location名前空間の標準の方を使う
    _watcher = new System.Device.Location.GeoCoordinateWatcher();
}
else
{
    // エミュレータ上なのでGPS Emulatorの方を使う
    _watcher = new GpsEmulatorClient.GeoCoordinateWatcher();
}

インスタンスを生成したあとは、連載第21回でご紹介した方法と同じ手順でGPSのデータを取得してください。コードに手を加える必要はありませんので楽かと思います。

加速度センサーをシミュレートする

GPSに関しては、Windows Phone GPS Simulatorがリリースされて、実機を使わなくてもテストができるようになりました。加速度センサーの場合はどうでしょうか。同じ手法を使ったオープンソースのプロジェクトがいくつか公開されています。中でもおススメできるのがWindows Phone 7 Accelerometer Emulatorです。

内部の実装についてはGPS Simulatorと大きな違いはありません。加速度センサーを使いたいプロジェクトでMaciejGrabek.WP7Accelerometer.dllを参照して、以下のコードを呼ぶだけで加速度センサーの値が取得できます。ライブラリ内で実機かエミュレータかの判定を行い処理をラッピングしているので、自プロジェクト側で書くコードはシンプルで済みます。

Reactive Extensionsを使ってなるべく簡潔にしてみました(実行には、Microsoft.Phone.ReactiveとSystem.Observableを参照設定に追加しておく必要があります⁠⁠。

// ライブラリ内で実機かエミュレータかを判定してインスタンスを生成
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();

上記のコードを実行してみましょう。デスクトップ上のアプリケーションでモデルをぐりぐりと動かせば、Windows Phoneエミュレータの3軸の数値に変化がある事がわかると思います。

画像

これで実機がなくてもWindows Phone エミュレータ上で加速度センサーを使ったアプリケーションの開発が可能になったと思います。

バーコードの読み取りを行う

Mangoには標準でバーコードの読み取り用のAPIが提供されるようです。こちらに関してもオープンソースを使用することで現状でも簡単にバーコードの読み取りに対応することが可能です。まだステータスとしてはBeta版ですが、Windows Phone 7 Silverlight ZXing Barcode Scanning Libraryを利用してみましょう。例えば、以下のようなQRコードを読み取りたいとします。

画像

Windows Phone 7はカメラプレビューのリアルタイム取り込みができませんから、CameraCaptureTaskを使って画像を撮影して、そのストリームをZXingに渡してバーコードの読み込みを行います。画像が大きすぎると解析に時間が掛かりすぎる or メモリが足りなくなりますので、解像度は最低(VGA)で撮影したほうがよいかもしれません。

private void btnCamera_Click(object sender, EventArgs e)
{
    var task = new Microsoft.Phone.Tasks.CameraCaptureTask();
    task.Completed += new EventHandler<Microsoft.Phone.Tasks.PhotoResult>(task_Completed);
    task.Show();
}

void task_Completed(object sender, Microsoft.Phone.Tasks.PhotoResult e)
{
    if (e.TaskResult != Microsoft.Phone.Tasks.TaskResult.OK)
        return;

    // 取り込んだ画像をBitmapImageへセット
    var bitmap = new System.Windows.Media.Imaging.BitmapImage();
    bitmap.SetSource(e.ChosenPhoto);
    
    // QR Code 2D barcodeの解析を行う
    // ほかに設定できるバーコードの種類は、
    //     MultiReader for all 1D barcode types.
    //     Code 128 1D format.
    //     Code 39 1D format.
    //     DataMatrix 2D barcode format.
    //     EAN-13 1D format.
    //     EAN-8 1D format.
    //     ITF (Interleaved Two of Five) 1D format.
    //     PDF417 format.
    //     QR Code 2D barcode format.
    //     UPC-A 1D format.
    //     UPC-E 1D format.
    //     MultiReader for all UPC and EAN types.
    WP7BarcodeManager.ScanMode = com.google.zxing.BarcodeFormat.QR_CODE;
    WP7BarcodeManager.ScanBarcode(bitmap, (res) =>
    {
        if (res.State != CaptureState.Success)
            MessageBox.Show(res.ErrorMessage);
        else
            MessageBox.Show(res.BarcodeText);
    });
}

WP7BarcodeManagerクラスのScanModeプロパティをQR_CODEにあらかじめ設定しています。現時点ではカメラプレビューを流しながら画像解析させることができませんので、カメラで静止画撮影してから画像解析の流れとなり、認識に失敗するともう一度撮影しなおす必要があります。現在のWindows Phoneの制約上仕方がないのですが少し面倒ではあります。

さいごに

MIX11にて「こんな機能が増えますよ」と伝えられている新機能について、ほんの少しだけご紹介させて頂きました。Mangoアップデート対応のWindows Phone Developer Toolsが提供されるまでの間の代替手段として、Windows PhoneエミュレータにてGPS・加速度センサーをシミュレートしてテストする方法やライブラリを使用してバーコードの読み取りを行う方法についても取り上げさせて頂きました。

ただ、現時点では1,500も増えるといわれているAPIの詳細については公開されていません。5月下旬に開発ツールが公開されると思いますので、公開次第本連載内でも紹介をしていきたいと考えております。

以上で今回は終わりです。ありがとうございました。

おすすめ記事

記事・ニュース一覧