MediaPlayer.GameHasControl无法正常工作

时间:2012-01-17 18:02:45

标签: c# silverlight windows-phone-7.1 windows-phone-7

由于6.5.1指南,我的应用程序认证失败:“应用程序可以达到暂停用户音乐状态而无需提示。”

我搜索了这个问题的解决方案,发现你必须使用MediaPlayer.GameHasControl检查用户是否在启动应用程序之前播放音乐。

当我实施它时,它不起作用。它确实提示暂停音乐,但在我有机会做出反应之前它也暂停了它。我试图将MediaPlayer.GameHasControl放在OnNavigatedTo(),Loaded()和构造函数中,它确实工作了一段时间,但应用程序在几秒后崩溃,所以这些不是一个选项。然后我试着把我的三个MediaElements中的MediaOpened事件处理掉,但没有运气。现在我只是卡住了。如果有人能对此有所了解,我将非常感激。

以下是代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.Xml.Linq;
using System.Windows.Navigation;
using System.Windows.Media.Imaging;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework;

namespace RhythmCoach
{
  public partial class BeginnerExercisePage : PhoneApplicationPage
  {
    public BeginnerExercisePage()
    {
        InitializeComponent();
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        XDocument beginnerExerciseData = XDocument.Load("XML/BeginnerXML.xml");

        string name = string.Empty;

        if (NavigationContext.QueryString.TryGetValue("name", out name))
        {

            var exercise = (from Exercised in beginnerExerciseData.Descendants("Exercised")
                            where Exercised.Attribute("name").Value == name
                            select new Exercise
                            {
                                ExImage = (string)Exercised.Element("image").Value,
                                ExGuitarAudio = (string)Exercised.Element("GuitarAudio").Value,
                                ExPianoAudio = (string)Exercised.Element("PianoAudio").Value,
                                ExSnareAudio = (string)Exercised.Element("SnareAudio").Value,
                                ExTitle = (string)Exercised.Element("title").Value
                            }).Single();

            im.Source = new BitmapImage(new Uri(exercise.ExImage, UriKind.Relative));
            pageTitle.Text = exercise.ExTitle;

            guitarAudioPlayer.Source = new Uri(exercise.ExGuitarAudio,UriKind.Relative);
            pianoAudioPlayer.Source = new Uri(exercise.ExPianoAudio, UriKind.Relative);
            snareAudioPlayer.Source = new Uri(exercise.ExSnareAudio, UriKind.Relative);
        }

        rbBegSnare.IsChecked = true;
        base.OnNavigatedTo(e);
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        if (rbBegGuitar.IsChecked == true)
        {
            guitarAudioPlayer.Play();

        }
        else if (rbBegPiano.IsChecked == true)
        {
            pianoAudioPlayer.Play();

        }
        else
            snareAudioPlayer.Play();

    }

    private void button2_Click(object sender, RoutedEventArgs e)
    {
        if (rbBegGuitar.IsChecked == true)
        {
            guitarAudioPlayer.Stop();
            pianoAudioPlayer.Stop();
            snareAudioPlayer.Stop();
        }
        else if (rbBegPiano.IsChecked == true)
        {
            pianoAudioPlayer.Stop();
            guitarAudioPlayer.Stop();
            snareAudioPlayer.Stop();
        }
        else
            snareAudioPlayer.Stop();
            guitarAudioPlayer.Stop();
            pianoAudioPlayer.Stop();
    }

    private void button3_Click(object sender, RoutedEventArgs e)
    {
        if (rbBegGuitar.IsChecked == true)
        {
            guitarAudioPlayer.Pause();
            pianoAudioPlayer.Pause();
            snareAudioPlayer.Pause();
        }
        else if (rbBegPiano.IsChecked == true)
        {
            pianoAudioPlayer.Pause();
            guitarAudioPlayer.Pause();
            snareAudioPlayer.Pause();
        }
        else
            snareAudioPlayer.Pause();
            guitarAudioPlayer.Pause();
            pianoAudioPlayer.Pause();
    }

    private void rbBegGuitar_Checked(object sender, RoutedEventArgs e)
    {
        pianoAudioPlayer.Stop();
        snareAudioPlayer.Stop();
    }

    private void rbBegPiano_Checked(object sender, RoutedEventArgs e)
    {
        guitarAudioPlayer.Stop();
        snareAudioPlayer.Stop();
    }

    private void rbBegSnare_Checked(object sender, RoutedEventArgs e)
    {
        guitarAudioPlayer.Stop();
        pianoAudioPlayer.Stop();
    }

    private void guitarAudioPlayer_MediaOpened(object sender, RoutedEventArgs e)
    {
        if (!MediaPlayer.GameHasControl)
        {
            MessageBoxResult Choice;
            Choice = MessageBox.Show("Media is currently playing, do you want to stop it?", "Stop Player", MessageBoxButton.OKCancel);
            if (Choice != MessageBoxResult.OK)
            {
                if (NavigationService.CanGoBack)
                    NavigationService.GoBack();
                else
                    NavigationService.Navigate(new Uri("/Menu.xaml", UriKind.Relative));
                return;
            }
        }
    }

    private void pianoAudioPlayer_MediaOpened(object sender, RoutedEventArgs e)
    {
        if (!MediaPlayer.GameHasControl)
        {
            MessageBoxResult Choice;
            Choice = MessageBox.Show("Media is currently playing, do you want to stop it?", "Stop Player", MessageBoxButton.OKCancel);
            if (Choice != MessageBoxResult.OK)
            {
                if (NavigationService.CanGoBack)
                    NavigationService.GoBack();
                else
                    NavigationService.Navigate(new Uri("/Menu.xaml", UriKind.Relative));
                return;
            }
        }
    }

    private void snareAudioPlayer_MediaOpened(object sender, RoutedEventArgs e)
    {
        if (!MediaPlayer.GameHasControl)
        {
            MessageBoxResult Choice;
            Choice = MessageBox.Show("Media is currently playing, do you want to stop it?", "Stop Player", MessageBoxButton.OKCancel);
            if (Choice != MessageBoxResult.OK)
            {
                if (NavigationService.CanGoBack)
                    NavigationService.GoBack();
                else
                    NavigationService.Navigate(new Uri("/Menu.xaml", UriKind.Relative));
                return;
            }
        }
    }
}

}

AND XAML

 <Grid x:Name="LayoutRoot">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="242*" />
        <ColumnDefinition Width="243*" />
        <ColumnDefinition Width="243*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="163*"/>
        <RowDefinition Height="245*" />
    </Grid.RowDefinitions>

    <!--TitlePanel contains the name of the application and page title-->
    <StackPanel x:Name="TitlePanel" Margin="12,17,0,28" Grid.ColumnSpan="3">
        <TextBlock x:Name="ApplicationTitle" Text="BEGINNER EXERCISES" Style="{StaticResource PhoneTextNormalStyle}" Foreground="Black" />
        <TextBlock x:Name="PageTitle" Text="{Binding ExTitle}" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}" Foreground="Black" />
    </StackPanel>

    <!--ContentPanel - place additional content here-->

        <Image x:Name="im" Grid.Row="1" Margin="12,0,12,155" Grid.RowSpan="2" Grid.ColumnSpan="3" />

    <Button Grid.Row="2" Height="72" HorizontalAlignment="Left" Margin="41,13,0,0" x:Name="button1" VerticalAlignment="Top" Width="160" Click="button1_Click" BorderBrush="Black" Foreground="Black" ClickMode="Release">
        <Button.Background>
            <ImageBrush ImageSource="/RhythmCoach;component/Images/appbar.transport.play.rest.png" Stretch="None" />
        </Button.Background>
    </Button>
    <MediaElement Grid.Row="2" Height="120" HorizontalAlignment="Left" Name="guitarAudioPlayer" VerticalAlignment="Top" Width="160" Source="{Binding ExGuitarAudio}"  AutoPlay="False" Volume="100" MediaOpened="guitarAudioPlayer_MediaOpened" />
    <MediaElement Grid.Row="2" Height="120" HorizontalAlignment="Left" Name="pianoAudioPlayer" VerticalAlignment="Top" Width="160" Source="{Binding ExPianoAudio}"  AutoPlay="False" Volume="100" MediaOpened="pianoAudioPlayer_MediaOpened" />
    <MediaElement Grid.Row="2" Height="120" HorizontalAlignment="Left" Name="snareAudioPlayer" VerticalAlignment="Top" Width="160" Source="{Binding ExSnareAudio}"  AutoPlay="False" Volume="100" MediaOpened="snareAudioPlayer_MediaOpened" />
    <Button Grid.Row="2" Height="72" HorizontalAlignment="Left" Margin="41,13,0,0" Name="button2" VerticalAlignment="Top" Width="160" Click="button2_Click" Grid.Column="2" BorderBrush="Black" Foreground="Black" HorizontalContentAlignment="Center">
        <Button.Background>
            <ImageBrush ImageSource="/RhythmCoach;component/Images/appbar.transport.stop.rest1.png" Stretch="None" />
        </Button.Background>
    </Button>
    <Button Grid.Column="1" Grid.Row="2" Height="72" HorizontalAlignment="Left" Margin="41,13,0,0" Name="button3" VerticalAlignment="Top" Width="160" Click="button3_Click" Foreground="Black" BorderBrush="Black">
        <Button.Background>
            <ImageBrush ImageSource="/RhythmCoach;component/Images/appbar.transport.pause.rest.png" Stretch="None" />
        </Button.Background>
    </Button>
    <RadioButton Content="Guitar" Grid.Row="2" Height="72" HorizontalAlignment="Left" Margin="41,101,0,0" Name="rbBegGuitar" VerticalAlignment="Top" Foreground="Black" Background="#BFADADAD" BorderBrush="#BFFFFFFF" Checked="rbBegGuitar_Checked" />
    <RadioButton Content="Piano" Grid.Column="1" Grid.Row="2" Height="72" HorizontalAlignment="Left" Margin="41,101,0,0" Name="rbBegPiano" VerticalAlignment="Top" Background="#BFA3A3A3" Foreground="Black" Checked="rbBegPiano_Checked" />
    <RadioButton Content="Snare Drum" Grid.Column="2" Grid.Row="2" Height="72" HorizontalAlignment="Left" Margin="32,101,0,0" Name="rbBegSnare" VerticalAlignment="Top" Background="#BF939393" Foreground="Black" Checked="rbBegSnare_Checked" />
    <my:AdControl AdUnitId="10029089" ApplicationId="05ab3750-df60-4e42-9939-ab68de9f424b" Height="50" HorizontalAlignment="Left" Margin="186,17,0,0" Name="adControlSmall" VerticalAlignment="Top" Width="300" Grid.ColumnSpan="2" Grid.Column="1" />
    <Grid.Background>
        <ImageBrush ImageSource="/RhythmCoach;component/Images/bg1.png" Stretch="Fill" />
    </Grid.Background>
</Grid>

3 个答案:

答案 0 :(得分:1)

我将使用我回家后用于提示的代码更新此答案。我认为我的是Loaded()。我看到您的mediaElements未设置为自动播放,因此不应该是问题。如果完全删除提示,背景音乐是​​否仍会暂停,而无需按页面上的任何按钮?

我看到人们处理这个问题的另一种方法是,不是提示每次运行应用程序,而是在启动时询问他们是否希望在运行应用程序时始终暂停背景音乐。存储该设置,然后您只需在后续运行中检查该设置。看起来你有一个主菜单,所以如果他们还没有同意暂停背景音乐的话,一种可能就是不让他们带着音乐去你的页面。

我打算粘贴我的代码,但它可能有点令人困惑所以我已经提取出你所追求的肉:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    //remember don't show MessageBoxes in OnNavigatedTo..
    // better to move stuff over to Loaded as much as you can anyway
    this.Loaded += RunOnPageLoaded; //you could hook up to this event via the Designer too
}

void RunOnPageLoaded(object sender, RoutedEventArgs e)
{
    bool doLoad = true;
    FrameworkDispatcher.Update();
    if (!MediaPlayer.GameHasControl)
    {
        doLoad = PromptUserAboutBackgroundMusic();
        if (doLoad) MediaPlayer.Pause();
    }

    if (doLoad)
    {
        LoadMediaFiles();
    }
}

private bool PromptUserAboutBackgroundMusic()
{
    var result = MessageBox.Show("Do you want to stop your background music to play this recording?",
                                 "Stop music?", MessageBoxButton.OKCancel);
    if (result == MessageBoxResult.OK) return true;
    return false;
}

private void LoadMediaFiles()
{
    //load your media files into your mediaelements here
    //mediaElement.AutoPlay = true;
    //mediaElement.Source = ...
}

虽然这可能是您所要求的,但在查看您正在做的事情后,我不太确定MediaElements是您使用的最佳选择。如果您使用的是SoundEffectInstance,那么背景音乐不会被暂停,除非您想要添加该功能,否则您甚至不必担心任何有关背景音乐的提示。

答案 1 :(得分:1)

    public MainPage()
    {
        InitializeComponent();

        bool canPlayMusic = true;

        FrameworkDispatcher.Update();

        if (!MediaPlayer.GameHasControl)
        {
            if (MessageBox.Show("Is it ok to stop currently playing music?",
                "Can stop music?", MessageBoxButton.OKCancel) == MessageBoxResult.Cancel)
            {
                canPlayMusic = false;
            }
        }

        if (canPlayMusic)
        {
            MediaPlayer.Pause();

            runBackgroundMusic();
        }
    }

答案 2 :(得分:0)

在调用MediaPlayer.GameHasControl之前,您可以调用FrameworkDispatcher.Update();这将有助于防止异常崩溃你的应用程序。