1

有时(我还没有找到模式)我在尝试将图片保存到媒体库时得到 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);
        }
    }
}

fileStream 就像您从代码 IsolatedStorageFileStream 中看到的那样,并且有效且不为空。这是我的堆栈跟踪

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)然后保存图片没有任何问题。

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

4

1 回答 1

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 重试并最终尽可能减小图像的大小。

于 2014-04-02T09:29:25.663 回答