将图片保存到媒体库时WP8 NullReferenceException

时间:2014-04-02 09:21:54

标签: c# windows-phone-8 nullreferenceexception isolatedstorage media-library

有时(我还没有找到模式)我在尝试将图片保存到媒体库时得到NullReferenceException。问题在方法SavePicture中我只是使用它。

using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
    if (isoStore.FileExists("fileName"))
    {
        using (var fileStream = isoStore.OpenFile("fileName", FileMode.Open))
        {
            MediaLibrary library = new MediaLibrary();
            library.SavePicture("name", fileStream);
        }
    }
}
从代码IsolatedStorageFileStream可以看到

fileStream是有效的而不是null。这是我的堆栈跟踪

at Microsoft.Xna.Framework.Media.UnsafeNativeMethods.MediaLibrary_SavePicture(String name, Int32 nameLength, UInt32 stream, UInt32& picture)
at Microsoft.Xna.Framework.Media.MediaLibrary.SavePicture(String name, Stream source)

从流中的位置属性我可以看到它不是0所以我假设流的相同部分已经保存但是在缓冲时发生了更多错误。它总是发生在大图像(+ 4MB)上,但每次抛出异常时都不一定在同一张图片上,我使用相同的图片集合。如果我捕获异常并且我尝试再次保存图片而不再使用相同的流再次打开文件(我只需要将位置设置为0)然后保存图片而没有任何问题。

有什么想法吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

这是一些MediaLibrary方法的已知错误。通常适用于尺寸范围为4到16 MB的大图像。

不确定错误修复状态。以下是连接链接:http://connect.microsoft.com/VisualStudio/feedback/details/776453/savepicturetocameraroll-randomly-throws-nullreferrenceexception

缓解此问题的一个解决方法是使用内存流,如果您的代码位于UI线程中而不是任何工作线程中:

using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
    if (isoStore.FileExists("fileName"))
    {
        using (var fileStream = isoStore.OpenFile("fileName", FileMode.Open))
        {
            byte[] bytes = new byte[0]; // Read bytes from fileStream

            MediaLibrary library = new MediaLibrary();
            library.SavePicture("name", bytes);
        }
    }
}

其他wprkarounds包括在调用此方法之前执行GC.Collect(),使用try / catch重试并最终减少图像的大小。