はじめに
MIX11の2日目。基調講演にてWindows Phone 7の新しいアップデート

基調講演にて取り上げられた新機能についていくつかご紹介したいと思います。
Sockets
スマートフォンユーザーの求めているアプリケーションのひとつに
そのほかにもシンプルなチャットプロトコルのIRCを扱うアプリケーションを作ってデモをしていました。Socket通信ができるようになりアプリケーションの幅が広がることは間違いありません。
RawCamera
Windows Phoneに搭載されているSilverlight for Windows Phoneは、
Mango以前ではCameraCaptureTaskを使用して、

Access to Contants & Calender
連載第25回でも取り上げましたが、
More Sensor
地磁気センサーや照度センサーは、
これらのセンサーとジャイロセンサーに対応するようです。ジャイロセンサーは当初出していた要求仕様に含まれていないのでオプション扱いとなりますが、
Background Agent
Windows Phoneではマルチタスクが廃止されて、
Background Agentでできることは、
SilverlightとXNAの相互運用
現時点でも一部アセンブリを使用することは可能ですが、
開発ツールのアップデート
Visual Studio 2010 Express for Windows Phoneに、
また、
Mangoアップデート対応のWindows Phone Developer Tools
WP7 RTW時点
新バージョンがリリースされるまでエミュレータ上でGPSを使ったテストはできないのでしょうか? いいえ、
GPSをシミュレートする
App Hubにて紹介されていたGPSシミュレータのWindows Phone GPS Emulatorを使うことで、
デスクトップ上のアプリケーションにはBing Mapsコントロールがあり、

あとは時間を追うごとに指定したルート通りにWindows Phone GPS Emulatorの矢印が移動します。この時、

エミュレータ実行の場合は専用の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();
}
インスタンスを生成したあとは、
加速度センサーをシミュレートする
GPSに関しては、
内部の実装についてはGPS Simulatorと大きな違いはありません。加速度センサーを使いたいプロジェクトでMaciejGrabek.
Reactive Extensionsを使ってなるべく簡潔にしてみました
// ライブラリ内で実機かエミュレータかを判定してインスタンスを生成
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 エミュレータ上で加速度センサーを使ったアプリケーションの開発が可能になったと思います。
バーコードの読み取りを行う
Mangoには標準でバーコードの読み取り用のAPIが提供されるようです。こちらに関してもオープンソースを使用することで現状でも簡単にバーコードの読み取りに対応することが可能です。まだステータスとしてはBeta版ですが、

Windows Phone 7はカメラプレビューのリアルタイム取り込みができませんから、
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_
さいごに
MIX11にて
ただ、
以上で今回は終わりです。ありがとうございました。