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

第26回LauncherとChooserを使ってみよう!(2)

はじめに

ローンチ時から対応が予定されていたコピー&ペーストに対応したWindows Phone 7の2011年1月度アップデートが配信されました。予定の1月中には発表もされないまま少し遅れておりヒヤヒヤさせられましたが、きちんとWindows Phone Developer Tools用のアップデートがリリースされてホッとしました。

いつ実機のアップデートが配信されるか楽しみです。この辺りは、Androidの端末アップデート事情と同じように端末メーカー側の対応待ちになっている可能性もあるのではないかと邪推しています。

実機アップデートの話はひとまず置いておきまして、⁠Windows Phone Developer Tools January 2011 Update」の主たるアップデート項目についてご紹介します。

Windows Phone Emulatorのアップデート

コピー&ペーストの対応に伴い、エミュレータにもアップデートが掛かりました。System.Windows.Controls.TextBox、System.Windows.Controls.PasswordBox、Microsoft.Phone.Controls.WebBrowser上で動かした場合にコピー&ペーストが使えます。

Marketplaceに既にリリース済みの開発者の方で、自分のアプリケーションでもコピー&ペーストに対応したTextBoxやPasswordBox、WebBrowserコントロールを使いたいという方は、特にリビルドする必要はありません。

Windows Phone Capability Detection Tool

昔、Marketplaceにアップロードする際に自分でCapability(ネットワークへ接続するアプリケーションであれば、ID_CAP_NETWORKINGなど)を設定する必要があったのですが、現在ではAppHubへの送信時に自動的に付与されるようです。その調査に使うツールが、今回のアップデートから同梱されています。

Bing Maps Silverlight Controlのパフォーマンス改善

Bing Mapsのジェスチャーのパフォーマンスが改善されたそうです。エミュレータ上ではあまり違いが判りませんでしたが、アップデート後の実機でのBing Mapsコントロールを試すのが楽しみですね。

Windows Mobile 6.xでマルチメディア機能を使ってみよう

さて、連載前回は、Windows Mobile、Windows Phone 7のPIM機能に携わる機能に触れました。今回は、LauncherとChooserの中でも、特に静止画撮影や動画再生などといったマルチメディアに関する機能のTipsをご紹介したいと思います。

本題のWindows Phone 7でのLauncher/Chooserの使い方をご紹介する前に、Windows Mobile 6.xにはどんなマルチメディア機能があってどうやって使っていたかをご紹介したいと思います。

静止画/動画を選択する

参照設定からMicrosoft.WindowsMobile.Forms.dllを追加しておきます。

Microsoft.WindowsMobile.Forms名前空間のSelectPictureDialogクラスを利用することで簡単に静止画や動画を選択することができます。SelectPictureDialogは、そのままの名前の通り、選択が完了するまで同期的に処理を行うことが可能です。

var dlg = new Microsoft.WindowsMobile.Forms.SelectPictureDialog();
if (DialogResult.OK == dlg.ShowDialog())
{
    MessageBox.Show(dlg.FileName);
}

上記のコードを実行してみました。いずれかの静止画や動画を選択することでメッセージボックスにファイル名を表示します。

画像

カメラで静止画撮影を行う

カメラを使って静止画撮影を行う方法をご紹介します。

Microsoft.WindowsMobile.Forms名前空間のCameraCaptureDialogクラスを利用することで簡単に静止画撮影を行うことができます。ここでは、ダイアログのタイトルを「Camera Demo」にして、撮影画角をQVGA(320×240)に設定しました。画質は標準に設定しています。

var cameraCapture = new Microsoft.WindowsMobile.Forms.CameraCaptureDialog()
{
    InitialDirectory = "\\My Documents",
    DefaultFileName = "test.jpg",   // デフォルトで付く名前
    Title = "Camera Demo",         // ダイアログのタイトル 
    Resolution = new Size(320, 240),    // 撮影したいサイズ
    StillQuality = Microsoft.WindowsMobile.Forms.CameraCaptureStillQuality.Normal
};

// カメラアプリを起動します
cameraCapture.ShowDialog();

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

画像

サンプルコードでは、標準品質の静止画を撮影する設定になっていましたが、高品質の動画を録画したい場合、CameraCaptureDialogのStillQualityプロパティを変更します。設定可能な設定値は以下の通りです。

Default標準のカメラアプリの設定値を使用する
High高品質
Low低品質
Normal標準の品質

以下のように設定します。

// 高品質の画像の設定にする
cameraCapture.StillQuality = CameraCaptureStillQuality.High;

カメラで動画録画を行う

静止画撮影と同様に、Microsoft.WindowsMobile.Forms名前空間のCameraCaptureDialog クラスを利用することで簡単に動画録画を行うことができます。

Modeプロパティには、CameraCaptureMode.VideoWithAudioを設定して映像と音声の両方を録画しています。また、VideoTypesプロパティにCameraCaptureVideoTypes.Messagingを設定し、Eメールに添付可能な品質のビデオ(3GPP)を録画します。

var cameraCapture = new Microsoft.WindowsMobile.Forms.CameraCaptureDialog()
{
    InitialDirectory = "\\My Documents",
    DefaultFileName = "test.3gp",   // デフォルトで付く名前
    Title = "Camera Demo",  // ダイアログのタイトル 
    Resolution = new Size(176, 144),    // 撮影したいサイズ
    VideoTimeLimit = new TimeSpan(0, 0, 15),
    Mode = Microsoft.WindowsMobile.Forms.CameraCaptureMode.VideoWithAudio, // 撮影モード
    VideoTypes = Microsoft.WindowsMobile.Forms.CameraCaptureVideoTypes.Messaging
};

// カメラアプリを起動します
cameraCapture.ShowDialog();

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

画像

アテレコする等の目的で音声を録音せずに動画のみ録画したい場合は、CameraCaptureDialogのModeプロパティをCameraCaptureMode.VideoOnlyに変更します。

// ビデオのみ録画するモードに設定する
cameraCapture.Mode = CameraCaptureMode.VideoOnly;

サンプルコードでは、Eメール添付用の動画を録画する設定になっていましたが、高品質の動画を録画したい場合、CameraCaptureDialogのVideoTypesプロパティを変更します。設定可能な設定値は以下の通りです。

AllResolutionプロパティにマッチする画像サイズで録画
MessagingEメールに添付可能な品質のビデオ(3GPP)で録画
Standard最も高品質のビデオで録画

以下のように設定します。

// 高品質の画像の設定にする
cameraCapture.VideoTypes = CameraCaptureVideoTypes.Standard;

Windows Phone 7でマルチメディア機能を使ってみよう

Windows Mobile 6.xと比べると、Windows Phone 7では直感的に操作できる標準UIが数多く提供されていることがわかります。その反面、動画録画ができなかったりします。

静止画を選択する

今までカメラで撮影してきた静止画やInternet Explorer等で保存済みの静止画、新たにカメラで撮影した静止画を取得する時には、Microsoft.Phone.Tasks名前空間のPhotoChooserTaskクラスを使用します。PhotoChooserの表示には、Showメソッドを使用します。

ShowCameraプロパティをtrueに設定して実行すると、以下の通り、アルバムのリストにあるアプリケーションボタンの箇所にカメラボタンが表示されます。

画像

カメラボタンをタップすることでカメラを起動し、静止画撮影を行います。ユーザーにカメラ撮影をさせたくない状況でカメラボタンを非表示にしたい場合、このプロパティはfalseに設定しておきましょう。

var task = new Microsoft.Phone.Tasks.PhotoChooserTask();

// 新規にカメラを起動するボタンを表示させるか(true = 表示)
task.ShowCamera = false;

// タスクが完了すると、イベントハンドラが呼び出される
task.Completed += (sx, ex) =>
                      {
                          // タスクが成功したかチェック
                          if (ex.TaskResult == TaskResult.OK)
                          {
                              // 取得できていれば、Imageに設定
                              var bmp = new BitmapImage();
                              bmp.SetSource(ex.ChosenPhoto);
                              image1.Source = bmp;
                          }
                      };
task.Show();

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

画像

このリストの中から選択すると、取得した静止画画像のストリームを得ることができます。このストリームをソースにしたBitmapImageをImageへ設定します。

画像

カメラで静止画撮影を行う

バーコードを読み取って解析するといったアプリを開発する際には使えると思います。カメラアプリを起動し撮影した静止画を取得することができます。Microsoft.Phone.Tasks名前空間のCameraCaptureTaskクラスを使用します。CameraCaptureの表示には、Showメソッドを使用します。

var task = new Microsoft.Phone.Tasks.CameraCaptureTask();

// タスクが完了すると、イベントハンドラが呼び出される
task.Completed += (sx, ex) =>
                    {
                        if (ex.TaskResult == TaskResult.OK)
                        {
                            var bmp = new BitmapImage();
                            bmp.SetSource(ex.ChosenPhoto);
                            image1.Source = bmp;
                        }
                    };
task.Show();

上記のコードを実行してみました。エミュレータのスクリーンショットですので、真っ黒な画面になっていますが、実機ではきちんとカメラプレビューが表示されています。

画像

シャッターを押すと、取得した静止画画像のストリームを得ることができます。このストリームをソースにしたBitmapImageをImageへ設定します。エミュレータでは撮影した画像は白背景に黒の矩形が表示されたものを取得するようです。もちろん実機では正しく撮影した画像を取得します。

画像

動画を再生する

動画再生を行うには、Microsoft.Phone.Tasks名前空間のMediaPlayerLauncherクラスを使用します。URLを渡すことによるストリーミング再生や、アプリケーションと同じディレクトリにある動画ファイル、分離ストレージ(IsolatedStorage)に保存している動画ファイルの再生を行うことができます。

MediaのURLを設定した後は、MediaPlayerLauncherを表示するにはShowメソッドを使用します。

まず、最初にhttpスキームのネットワーク上にある動画ファイルを再生する方法についてご紹介します。

var movieUrl =
    new Uri("http://support.microsoft.com/support/mediaplayer/wmptest/samples/new/mediaexample.wmv");

var task = new Microsoft.Phone.Tasks.MediaPlayerLauncher()
               {
                   Media = movieUrl,
                   Location = MediaLocationType.None
               };
task.Show();

上記のコードを実行してみました。Windows Phoneエミュレータ上では再生が上手くいきませんでしたが、実機では問題なく再生が行えます。

画像

次に、コンテンツとしてxapに含んでいる動画ファイルを再生する方法をご紹介します。LocationプロパティにMediaLocationType.Installを設定してください。

var task = new Microsoft.Phone.Tasks.MediaPlayerLauncher()
               {
                   Media = new Uri("filename.wmv", UriKind.Relative),
                   Location = MediaLocationType.Install
               };
task.Show();

同様に分離ストレージに保存した動画ファイルを再生する際は、LocationプロパティにMediaLocationType.Dataを設定します。

動画録画を行う

現在のバージョンのWindows Phone 7 SDKでは、動画の録画ができません。標準カメラアプリで録画したデータをアプリで使ったり、ハブインテグレーション経由で扱うことを考えたほうがよいかもしれません。

さいごに

Windows Phone 7でのマルチメディア機能に関わるLauncherとChooserの使い方についてご紹介させて頂きました。次回はMarkteplaceや検索機能に関わるLauncherとChooserの使い方についてご紹介させて頂きたいと思います。

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

おすすめ記事

記事・ニュース一覧