gpt4 book ai didi

c# - BackgroundMediaPlayer无法播放音乐文件夹外部的音乐文件

转载 作者:行者123 更新时间:2023-12-03 01:57:51 26 4
gpt4 key购买 nike

我有这个奇怪的问题。我正在尝试为Windows Phone 8.1创建一个音乐播放器应用程序。即使应用程序处于后台/关闭状态,我也需要音乐播放器在后台播放音乐。所以我正在使用BackgroundMediaPlayer类来播放音乐。以下是相同的代码:

private void SendMessageToBackground(string Path, string Name, bool IsRadio)
{
if (!string.IsNullOrEmpty(Path))
{
var message = new ValueSet();
message.Add(Constants.TrackURI, Path);
message.Add(Constants.TrackName, Name);
message.Add(Constants.IsRadio, IsRadio);
BackgroundMediaPlayer.MessageReceivedFromBackground += BackgroundMediaPlayer_MessageReceivedFromBackground;
BackgroundMediaPlayer.Current.MediaFailed += Current_MediaFailed;
BackgroundMediaPlayer.SendMessageToBackground(message);
}
}

代码运行正常,音乐播放流畅。但是现在我面临一个问题。我正在通过遍历所有文件夹来获取应用程序中的音乐文件。因此,它会显示所有音乐文件,无论它们位于文件夹层次结构中的何处。但是,当我尝试播放Windows Phone创建的 Music文件夹之外的文件时(请参见屏幕截图),背景音乐播放器根本无法播放该文件。

Music File Issue

从代码中可以看出,我正在侦听 BackgroundMediaPlayer及其 MediaPlayer中的事件以检查是否有任何可能的失败原因,但是在回放失败的情况下都不会触发这两个事件。但是,如果成功播放(来自Music文件夹),则正确触发了 BackgroundMediaPlayerMessageReceivedFromBackground事件。我检查了正在传递的文件路径,并且都正确,然后尝试使用手机的内置“音乐”应用程序播放这些音乐文件,并且也成功播放了。这可能是什么问题?我该如何解决?

编辑

我进行了进一步调试,发现这实际上是一个权限问题。我在另一个函数中使用的从上面的代码传递的路径将 Uri / StorageFile传递给 BackgroundMediaPlayer.Current。码:
public async void StartTrackAt(string TrackURI, string Name)
{
try
{
BackgroundMediaPlayer.Current.SetUriSource(new Uri(TrackURI)); // This works fine in debug mode. Throws Exception in release mode
/* Tried this also, but this doesn't even work in debug mode
StorageFile storageFile = await StorageFile.GetFileFromPathAsync(TrackURI);
mediaPlayer.SetFileSource(s);
*/
}
catch (Exception ex)
{
//Control comes here when trying to play files outside Music folder.
}
}

我已经在应用的 list 文件中设置了所需的功能。但是,当我尝试运行此应用程序时,得到了以下 Exception:
{System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at BackgroundMusicPlayer.MyPlayListManager.<StartTrackAt>d__0.MoveNext()}
[System.UnauthorizedAccessException]: {System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at BackgroundMusicPlayer.MyPlayListManager.<StartTrackAt>d__0.MoveNext()}
Data: {System.Collections.ListDictionaryInternal}
HelpLink: null
HResult: -2147024891
InnerException: null
Message: "Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))"
Source: "mscorlib"
StackTrace: " at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n at BackgroundMusicPlayer.MyPlayListManager.<StartTrackAt>d__0.MoveNext()"

奇怪的是,当直接传递 Uri而不获取 StorageFile时,它在 Debug模式下运行良好。

这是我为应用程序设置的功能:

App Capabilities

最佳答案

我遇到了BackgroundMediaPlayer的相同访问问题。

see this answer about possible access to different files
因此,您需要结合使用FolderPicker和FutureAccessList

var folder = await folderPicker.PickSingleFolderAsync();
Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.Add(folder);

关于c# - BackgroundMediaPlayer无法播放音乐文件夹外部的音乐文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34014612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com