I have been in a headache to display SystemMediaTransportControls in my wp8.1 app, unfortunately it doesn't work.
Here is the scenario, I have added Windows Phone App Project and then Windows Runtime Component (Windows Phone). I referenced the Runtime Component in My probject and then in the manifest added Audio as a Background Task.
Everything seems to work fine, the media is played in the background, but the SystemMediaTransportControls are not displayed. Below is my code for Run method in my BackgroundTask
public void Run(IBackgroundTaskInstance taskInstance)
{
Debug.WriteLine("Background Audio Task " + taskInstance.Task.Name + " starting...");
taskInstance.Canceled += TaskInstance_Canceled;
//taskInstance.Task.Completed += Taskcompleted;
systemmediatransportcontrol = SystemMediaTransportControls.GetForCurrentView();
systemmediatransportcontrol.ButtonPressed += systemmediatransportcontrol_ButtonPressed;
systemmediatransportcontrol.PropertyChanged += systemmediatransportcontrol_PropertyChanged;
systemmediatransportcontrol.IsEnabled = true;
systemmediatransportcontrol.IsPauseEnabled = true;
systemmediatransportcontrol.IsPlayEnabled = true;
systemmediatransportcontrol.IsNextEnabled = true;
systemmediatransportcontrol.IsPreviousEnabled = true;
BackgroundMediaPlayer.Current.CurrentStateChanged += Current_CurrentStateChanged;
BackgroundMediaPlayer.MessageReceivedFromForeground += BackgroundMediaPlayer_MessageReceivedFromForeground;
Debug.WriteLine(systemmediatransportcontrol.IsEnabled.ToString());
ValueSet message = new ValueSet();
message.Add("backgroundStarted", "1");
BackgroundMediaPlayer.SendMessageToForeground(message);
BackgroundTaskStarted.Set();
deferral = taskInstance.GetDeferral();
}
It has been two days working in this problem and it has given me a lot of headache. The question is, why SystemMediaTransportControls is not displayed?
Use SystemMediaTransportControls.DisplayUpdater to set the MusicProperties. MusicProperties is of type MusicDisplayProperties and include properties such as the song title and the song artist.
Update this on track change:
systemmediatransportcontrol.PlaybackStatus = MediaPlaybackStatus.Playing;
systemmediatransportcontrol.DisplayUpdater.Type = MediaPlaybackType.Music;
systemmediatransportcontrol.DisplayUpdater.MusicProperties.Title = "<Track_Name>";
systemmediatransportcontrol.DisplayUpdater.MusicProperties.Artist = "<Artist_Name>";
systemmediatransportcontrol.DisplayUpdater.Update();
Related
I would like if Speech Recognition in UWP would recognize even if application is not active.
I have these settings currently:
async void InitializeSpeechRecognizer()
{
SpeechRecognizer speechRecognizer = new SpeechRecognizer();
speechRecognizer.StateChanged += HandleSpeech_State;
speechRecognizer.ContinuousRecognitionSession.ResultGenerated += HandleSpeech;
StorageFile grammar = await Package.Current.InstalledLocation.GetFileAsync(#"Grammar.xml"); // file
SpeechRecognitionGrammarFileConstraint grammarContraint = new SpeechRecognitionGrammarFileConstraint(grammar);
speechRecognizer.Constraints.Add(grammarContraint);
SpeechRecognitionCompilationResult compilantResult = await speechRecognizer.CompileConstraintsAsync(); // compile grammar
if (compilantResult.Status == SpeechRecognitionResultStatus.Success)
await speechRecognizer.ContinuousRecognitionSession.StartAsync();
}
InitializeSpeechRecognizer is called in MainPage
When I activate app I can see in debug window state changes. After I activate another app nothings happen :(
Thanks for any idea!
you have to use a BackgroundWorker thread for your application to work while not in focus.
backgroundWorker1.RunWorkerAsync(testFunction);
https://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx
I am attempting to troubleshoot some issues with a webbrowser we use in our Windows Phone application. The problem is that our Windows Phone that is running 8.0 receives all of its javascript callbacks fine and loads the webpage happily. When the 8.1 phone runs the application, the web page doesn't load and the javascript callbacks aren't hit.
Relevant code:
this.ShowBlocker(true);
browser = new WebBrowser()
{
Name = "browser",
IsScriptEnabled = true,
HorizontalAlignment = HorizontalAlignment.Stretch,
VerticalAlignment = VerticalAlignment.Stretch
};
browser.ScriptNotify -= this.ScriptNotify;
browser.ScriptNotify += this.ScriptNotify;
browser.Navigated -= this.Browser_Navigated;
browser.Navigated += this.Browser_Navigated;
browser.NavigationFailed -= this.Browser_NavigationFailed;
browser.NavigationFailed += this.Browser_NavigationFailed;
if (browser.Source != this.mapSource.MapUrl)
{
browser.Navigate(this.mapSource.MapUrl);
}
else
{
this.isWebPageLoaded = true;
this.isJsLoaded = true;
this.Clear();
this.JSMap_Loaded();
}
this.BrowserContainer.Child = browser;
Has something changed in 8.1?
This was solved by reformatting the phone. Weird.
Basically, I am using this sample.
http://social.msdn.microsoft.com/Forums/en-US/43295c90-43e8-4b08-8a25-958a1c3d0a0b/explanation-on-windowsuixamlmediaxamlrenderingbackgroundtask
An XAMLrenderingBackgroundTask which updates my live tile with album art, text, etc. Works great - however I can't get it to run when the song changes. I have no clue how I can trigger this task when the song changes.
I have a separate BackgroundTask that is continuously running and receives events for Song changes, etc. But I don't know of a way to trigger this XAMLrenderingBackgroundTask myself without adding triggers like System time changed, etc. It must be possible, I see other apps updating images on tiles when a song changes.
I tried implementing the XAMLrenderingBGTask with the Media BackgroundTask and attempting to update the live tile when the media changed but it crashes due to some call being marshalled from another thread which I kind of expected.
Now I am stuck. Here is my backgroundtask for media player, MediaOpened event should trigger tile change for new song, but I can't..
public sealed class BackgroundAudioTask : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
systemmediatransportcontrol = SystemMediaTransportControls.GetForCurrentView();
systemmediatransportcontrol.ButtonPressed += systemmediatransportcontrol_ButtonPressed;
systemmediatransportcontrol.PropertyChanged += systemmediatransportcontrol_PropertyChanged;
systemmediatransportcontrol.IsEnabled = true;
systemmediatransportcontrol.IsPauseEnabled = true;
systemmediatransportcontrol.IsPlayEnabled = true;
systemmediatransportcontrol.IsNextEnabled = true;
systemmediatransportcontrol.IsPreviousEnabled = true;
systemmediatransportcontrol.IsFastForwardEnabled = true;
systemmediatransportcontrol.IsRewindEnabled = true;
//Add handlers for MediaPlayer
BackgroundMediaPlayer.Current.CurrentStateChanged += Current_CurrentStateChanged;
BackgroundMediaPlayer.Current.MediaOpened += MediaPlayer_MediaOpened;
BackgroundMediaPlayer.Current.MediaEnded += MediaPlayer_MediaEnded;
BackgroundMediaPlayer.Current.MediaFailed += mediaPlayer_MediaFailed;
BackgroundMediaPlayer.Current.VolumeChanged += Current_VolumeChanged;
BackgroundTaskStarted.Set();
backgroundtaskrunning = true;
}
I know it's a little bit late :D
you can use This to update tiles .
scenario 2 I think can help you .
in MediaOpened event you can update tile
In my application I want to notify the user with the ShellToast.
Just by running...
var toast = new ShellToast
{
Title = "Nom nom nom!",
Content = "More! More! Keep feeding me!",
};
toast.Show();
...makes nothing happen, and as I understand it needs to be run from a ScheduledTaskAgent. But how do I run this on command, and make sure it only run once?
You can't use a ShellToast while the app is the foreground app. It's meant to be invoked from a background service while the app isn't the foreground app.
If you want to have a UX similar to that of ShellToast use the Coding4fun toolkit ToastPrompt control. Here's a code snippet showing how to use it:
private void ToastWrapWithImgAndTitleClick(object sender, RoutedEventArgs e)
{
var toast = GetToastWithImgAndTitle();
toast.TextWrapping = TextWrapping.Wrap;
toast.Show();
}
private static ToastPrompt GetToastWithImgAndTitle()
{
return new ToastPrompt
{
Title = "With Image",
TextOrientation = System.Windows.Controls.Orientation.Vertical,
Message = LongText,
ImageSource = new BitmapImage(new Uri("../../ApplicationIcon.png", UriKind.RelativeOrAbsolute))
};
}
Running this code snippet shows the following:
Just a small update: using ShellToast when the app is in foreground, is now possible, when using Windows Phone 8 Update 3. Though, they are obscured by other activity such as a phone call or the lock screen. Source
In my application I want to notify the user with the ShellToast.
Just by running...
var toast = new ShellToast
{
Title = "Nom nom nom!",
Content = "More! More! Keep feeding me!",
};
toast.Show();
...makes nothing happen, and as I understand it needs to be run from a ScheduledTaskAgent. But how do I run this on command, and make sure it only run once?
You can't use a ShellToast while the app is the foreground app. It's meant to be invoked from a background service while the app isn't the foreground app.
If you want to have a UX similar to that of ShellToast use the Coding4fun toolkit ToastPrompt control. Here's a code snippet showing how to use it:
private void ToastWrapWithImgAndTitleClick(object sender, RoutedEventArgs e)
{
var toast = GetToastWithImgAndTitle();
toast.TextWrapping = TextWrapping.Wrap;
toast.Show();
}
private static ToastPrompt GetToastWithImgAndTitle()
{
return new ToastPrompt
{
Title = "With Image",
TextOrientation = System.Windows.Controls.Orientation.Vertical,
Message = LongText,
ImageSource = new BitmapImage(new Uri("../../ApplicationIcon.png", UriKind.RelativeOrAbsolute))
};
}
Running this code snippet shows the following:
Just a small update: using ShellToast when the app is in foreground, is now possible, when using Windows Phone 8 Update 3. Though, they are obscured by other activity such as a phone call or the lock screen. Source