Мне нужно сохранить фоновое положение воспроизведения звука в случае, когда запускается другое приложение, и он берет на себя функцию звукового проигрывателя.
Я использовал следующее в своем агенте аудиоплеера
protected override void OnPlayStateChanged(BackgroundAudioPlayer _player, AudioTrack _track, PlayState _playState)
{
System.Diagnostics.Debug.WriteLine(_playState.ToString());
double _pos = -1;
try
{
_pos = _player.Position.TotalSeconds;
}
catch (Exception _ex)
{
System.Diagnostics.Debug.WriteLine(_ex.Message);
}
switch (_playState)
{
// handling of different state changes
}
myStorePositionRoutine(_pos)
NotifyComplete();
}
Другие изменения состояния, происходящие, например, от буферизации или воспроизведения/паузы и т.д., Кажется, работают нормально, и я могу получить последнюю позицию, записанную для возможного последующего использования.
Однако, если и когда (во время запуска моего приложения в отладчике) я запускаю другое приложение, которое берет на себя фоновое устройство проигрывателя аудио в телефоне, первое (и последнее) событие в отладчике, которое я вижу, - это состояние воспроизведения
"Остановлено"
и сообщение об исключении
"Фоновые аудио ресурсы больше недоступны".
Есть ли что-то, что я мог бы сделать, чтобы заставить агента звукового проигрывателя сделать обычную позицию в ожидании "неграмотного" закрытия - или есть какой-то другой способ/событие для использования get и хранения позиции, предшествующей этому остановленному состоянию и недоступности фоновые аудио ресурсы?
Когда вы вызываете другого Игрока, ваш Shutdown
(так как может быть только один экземпляр BAP), и его ресурсы не будут доступны - поэтому вы теряете свой _pos
. Чтобы сохранить его между экземплярами, вам придется использовать файл или IsolatedStorageSettings
. Вы можете сохранять каждый раз, когда Пользователь перестает играть или только когда вызывается Shutdown
. Код примера может выглядеть так:
private static double _pos = 0;
protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState)
{
switch (playState)
{
case PlayState.Shutdown:
IsolatedStorageSettings IS = IsolatedStorageSettings.ApplicationSettings;
if (IS.Contains("position")) IS["position"] = _pos;
else IS.Add("position", _pos);
IS.Save(); // remember to save
// rest of the code
// And somewhere where you want to bring your position back (for example when your BAP starts):
// to retrive the position:
IsolatedStorageSettings IS = IsolatedStorageSettings.ApplicationSettings;
if (IS.Contains("position")) _pos = (double)IS["position"];
else _pos = 0;
// rest of the code
И сделайте свой _pos
статический и внешний OnPlayStateChanged
, тогда он также будет доступен для OnUserAction
.
Position
? Если это так, я не уверен, что вы сможете сделать многое, так как это не зависит от вашего кода.