因为不响应Play/Pause消息而导致Windows store 应用提交失败

不少开发者反映说他的应用程序已经通过了WACK测试,但是在提交到应用程序商店后被退回,并给出了如下反馈信息:

This app failed to correctly respond to at least one of the play, pause, or play/pause events.

然而,该程序在自己的设备上测试的时候却一切正常。对于这个问题,目前发现两种原因:

  1. 你用以播放的媒体文件非英文文件名,然而您的应用程序却声明支持英文,这种情况下您的应用程序会在纯英文系统环境下测试。由于非英文文件名的媒体文件在英文系统环境下不可识别。所以提交会失败。
  2. 如果你的应用程序支持后台音频,那么Pause和 Play函数就应该在系统层面支持。有些特殊的键盘上具有单独的Play和Pause键,如果在这种设备上这两个键不起作用就会提交失败。由于大多数键盘上一个切换按键而没有单独的Play和Pause建,你可能并没有在这种特殊的键盘上测试过您的代码。

  实际上如果你在这种情况下调试程序的话,你会看到在输出窗口报了一个RPC_E_WRONG_THREAD 的错误。这说明你必须的保证Play和Pause 函数在UI线程而不是工作线程被调用。

  下面是典型的出错代码:

//For support Background Audio

MediaControl.PlayPressed += MediaControl_PlayPressed;

MediaControl.PausePressed += MediaControl_PausePressed;

      

void MediaControl_PlayPressed(object sender, object e)

{

myMediaElement.Play();

}

void MediaControl_PausePressed(object sender, object e)

{

         myMediaElement.Pause();

}

 

  解决方案是你需要在UI线程调用Pause/Play 方法:

async void MediaControl_Played(object sender, object e)

{

    await this.Dispatcher.RunAsync

        (Windows.UI.Core.CoreDispatcherPriority.Normal, () =>

        {

            if (myMediaElement.CurrentState == MediaElementState.Paused)

            {

                myMediaElement.Play();

            }

        });

}

 

async void MediaControl_PausePressed(object sender, object e)

{

    await this.Dispatcher.RunAsync

        (Windows.UI.Core.CoreDispatcherPriority.Normal, () =>

        {

            if (myMediaElement.CurrentState == MediaElementState.Playing)

            {

                myMediaElement.Pause();

            }

        });

}