Windows Phone FMラジオを操作するアプリの注意点(バックグラウンドの音楽演奏)

というわけで、またFM Radio Wave Level CheckerがRejectされてしまいました。「音楽を演奏した状態でこのアプリを起動して、端末のボリュームスイッチ(IS12Tの場合は、電源ボタンの下)を押し、表示されたPlayerメニューバーで音楽を止めると、例外発生するよ」と、フィードバックには英語で書いてあり、実際やってみると、あ本当だ!!。

発生したExceptionをじっと見ると、どうやらXna FrameworkのFrameworkDispatcherのUpdate()がコールされていないのが原因と判明。
前に、マイクロフォンからの音を録音する方法をこのブログで紹介した時紹介した、FrameworkDispatcher、どうもアプリでPlayer系を弄る時には、回さないと駄目らしい。

ということで、ページのクラスに、OnNavigatedTo()メソッドを加え、

        private DispatcherTimer loopTimer;
        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            loopTimer = new DispatcherTimer();
            loopTimer.Interval = TimeSpan.FromMilliseconds(50);
            loopTimer.Tick += delegate { try { Microsoft.Xna.Framework.FrameworkDispatcher.Update(); } catch { } };
            loopTimer.Start();

            base.OnNavigatedTo(e);
        }

とコーディングし、OnNavigatedFrom()メソッドで、このloopTimerのStop()メソッドをコールするルーチンを追加しました。

これでやってみると、音楽の演奏を止めた時の例外が発生しなくなったので、これでOKなのだろうなぁ…ということで、また懲りずにMarketplaceに登録。幾らなんでももう大丈夫かな?結果は多分クリスマスイブ辺り。プレゼントになるかどうか、お楽しみ。

教訓:
Microsoft.Xna.Framework.Media.MediaPlayerを弄るアプリを作る場合は、FrameworkDispatcherのUpdate()コールループを入れるべし!!

…SilverlightプロジェクトよりXnaプロジェクトで最初からやったほうが良いかも。

FM Radio Wave Level Checkerに関する過去の投稿は以下のとおり