在Windows Phone 8.1中保存图像文件时出现UnauthorizedAccessException

时间:2015-04-10 19:39:48

标签: canvas windows-phone-8.1 file-writing

我正在尝试使用以下代码将myCanvas的内容保存为库中的图像文件(对于Windows Phone 8.1,而不是Silverlight)。当我运行应用程序并调用SaveFileToPhone()时,它会抛出System.UnauthorizedAccessException。
我已经检查了Manifest文件中的Capabilities,它们看起来很好。我究竟做错了什么。我已经阅读了很多资源但找不到解决方案,请帮忙!

我还是个菜鸟,我尝试使用我在网上找到的代码。

 public async void SaveFileToPhone()
      {
          var file = await KnownFolders.PicturesLibrary.CreateFileAsync("bug.jpeg", CreationCollisionOption.GenerateUniqueName);
          var outStream = await file.OpenAsync(FileAccessMode.ReadWrite);
          await SaveVisualElementToFile(myCanvas, file);
          outStream.Dispose();
      }


 async Task SaveVisualElementToFile(FrameworkElement element, StorageFile file)
        {
            string fileName = "customphoto.jpg";
            var renderTargetBitmap = new RenderTargetBitmap();
            await renderTargetBitmap.RenderAsync(element, (int)element.Width, (int)element.Height);
            var pixels = await renderTargetBitmap.GetPixelsAsync();

            using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
            {
                var encoder = await
                    BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
                byte[] bytes = pixels.ToArray();
                encoder.SetPixelData(BitmapPixelFormat.Bgra8,
                                     BitmapAlphaMode.Ignore,
                                     (uint)element.Width, (uint)element.Height,
                                     96, 96, bytes);

                await encoder.FlushAsync();
            }
        }
  
      
  • $ exception {System.UnauthorizedAccessException:访问被拒绝。 (来自HRESULT的异常:0x80070005(E_ACCESSDENIED))at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()   在   ChoosersLaunchers8._1.PhotoChooser.d__1e.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)在System.Runtime.CompilerServices.TaskAwaiter.GetResult()
      在   ChoosersLaunchers8._1.PhotoChooser.d__17.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.AsyncMethodBuilderCore.b__3(对象   国家)   System.Threading.WinRTSynchronizationContext.Invoker.InvokeCore()} System.Exception   {System.UnauthorizedAccessException的}
  •   

1 个答案:

答案 0 :(得分:1)

您似乎打开了两次不允许的StorageFile。在调用SaveVisualElementToFile方法之前不要打开文件,因为您已经在该方法中打开文件。

此外,您不需要outstream.dispose,因为文件将在您的方法中使用“using”语句自动处理。