J'ai un bouton sur une page avec la méthode suivante sur l'événement de clic du bouton:MediaTranscoder.PrepareFileTranscodeAsync UnauthorizedAccessException
StorageFile _sourceFile;
private string _sourceToken;
private async void btnSelect_Click(object sender, RoutedEventArgs e)
{
FileOpenPicker fop = new FileOpenPicker();
fop.FileTypeFilter.Add(".mp4");
StorageFile inFile = await fop.PickSingleFileAsync();
_sourceToken = Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.Add(inFile);
_sourceFile = await Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.GetFileAsync(_sourceToken);
mediaElement.AutoPlay = false;
IRandomAccessStream stream = await _outFile.OpenAsync(FileAccessMode.ReadWrite);
mediaElement.SetSource(stream, _outFile.ContentType);
}
Si je clique sur le jeu MediaElement la vidéo que je sélectionne joue bien.
J'ai aussi un autre bouton qui a le code suivant sur son événement click:
private async void btnExport_Click(object sender, RoutedEventArgs e)
{
StorageFile outFile = await KnownFolders.VideosLibrary.CreateFileAsync("Outfie.mp4", CreationCollisionOption.ReplaceExisting);
MediaEncodingProfile profile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD1080p);
MediaTranscoder transcoder = new MediaTranscoder();
PrepareTranscodeResult prepareOp = await transcoder.PrepareFileTranscodeAsync(_sourceFile, outFile, profile);
if (prepareOp.CanTranscode)
{
var transcodeOp = prepareOp.TranscodeAsync();
transcodeOp.Progress += new AsyncActionProgressHandler<double>(TranscodeProgress);
transcodeOp.Completed += new AsyncActionWithProgressCompletedHandler<double>(TranscodeComplete);
}
else
{
switch (prepareOp.FailureReason)
{
case TranscodeFailureReason.CodecNotFound:
System.Diagnostics.Debug.WriteLine("Codec not found.");
break;
case TranscodeFailureReason.InvalidProfile:
System.Diagnostics.Debug.WriteLine("Invalid profile.");
break;
default:
System.Diagnostics.Debug.WriteLine("Unknown failure.");
break;
}
}
}
Malheureusement, la ligne transcoder.PrepareFileTranscodeAsync jette un UnauthorizedAccessException. Mais si j'utilise les éléments suivants au lieu de _sourceFile cela fonctionne:
StorageFile sourceFile = await KnownFolders.VideosLibrary.GetFileAsync("sourceFile.mp4");
L'erreur est d'être jeté:
System.UnauthorizedAccessException: « L'accès est refusé. (Exception de HRESULT: 0x80070005 (E_ACCESSDENIED)) »
Pour être clair, je choisissais des fichiers en dehors du KnownFolders Enumeration, d'où je me sers Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.
Quelqu'un peut-il expliquer pourquoi?
EDIT: Si je change le fichier source pour être le résultat d'un FileOpenPicker alors cela fonctionne. Donc, il pose la question, pourquoi le FutureAccessList ne fonctionne pas?
private async void btnExport_Click(object sender, RoutedEventArgs e)
{
StorageFile outFile = await KnownFolders.VideosLibrary.CreateFileAsync("Outfie.mp4", CreationCollisionOption.ReplaceExisting);
FileOpenPicker fop = new FileOpenPicker();
fop.SuggestedStartLocation = PickerLocationId.ComputerFolder;
fop.FileTypeFilter.Add(".mp4");
StorageFile sourceFile = await fop.PickSingleFileAsync();
MediaEncodingProfile profile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD1080p);
MediaTranscoder transcoder = new MediaTranscoder();
PrepareTranscodeResult prepareOp = await transcoder.PrepareFileTranscodeAsync(sourceFile, outFile, profile);
if (prepareOp.CanTranscode)
{
var transcodeOp = prepareOp.TranscodeAsync();
transcodeOp.Progress += new AsyncActionProgressHandler<double>(TranscodeProgress);
transcodeOp.Completed += new AsyncActionWithProgressCompletedHandler<double>(TranscodeComplete);
}
else
{
switch (prepareOp.FailureReason)
{
case TranscodeFailureReason.CodecNotFound:
System.Diagnostics.Debug.WriteLine("Codec not found.");
break;
case TranscodeFailureReason.InvalidProfile:
System.Diagnostics.Debug.WriteLine("Invalid profile.");
break;
default:
System.Diagnostics.Debug.WriteLine("Unknown failure.");
break;
}
}
}
D'accord certainement un problème d'autorisations, mais notez la ligne suivante: flux IRandomAccessStream = attendre _outFile.OpenAsync (FileAccessMode.ReadWrite); Qui échoue lorsque je n'ai pas la permission en première instance. –
Pourquoi ne pas échouer si vous n'avez pas les autorisations? Vous demandez l'accès à lire/écrire un fichier que vous n'êtes pas autorisé à le modifier. –
Mon point était que j'ai des permissions. Je ne serais pas en mesure d'exécuter l'OpenAsync exigeant en lecture/écriture en premier lieu si je n'avais pas les permissions. –