因为不响应Play/Pause消息而导致Windows store 应用提交失败
不少开发者反映说他的应用程序已经通过了WACK测试,但是在提交到应用程序商店后被退回,并给出了如下反馈信息:
This app failed to correctly respond to at least one of the play, pause, or play/pause events.
然而,该程序在自己的设备上测试的时候却一切正常。对于这个问题,目前发现两种原因:
- 你用以播放的媒体文件非英文文件名,然而您的应用程序却声明支持英文,这种情况下您的应用程序会在纯英文系统环境下测试。由于非英文文件名的媒体文件在英文系统环境下不可识别。所以提交会失败。
- 如果你的应用程序支持后台音频,那么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();
}
});
}