1

我有一个byte[]包含图片数据。我想将此图片数据设置为 windows phone 8 中 StoredContact 的显示图片。我尝试过:

byte[] data = ...

ContactStore store = await ContactStore.CreateOrOpenAsync(ContactStoreSystemAccessMode.ReadWrite, ContactStoreApplicationAccessMode.ReadOnly);
StoredContact contact = await store.FindContactByRemoteIdAsync(remoteId);
using (IInputStream stream = new MemoryStream(data).AsInputStream())
{                    
    await contact.SetDisplayPictureAsync(stream);
}

但我System.UnauthorizedAccessException接听AsInputStream()电话。我有ID_CAP_CONTACTS-capability 集,并且联系人属于自定义数据存储,我对其具有写访问权限。有谁知道如何解决这个问题?

编辑:

我从 Web 请求中获取数据,使用以下内容提取字节数据:

DataContractJsonSerializer serializer = new DataContractJsonSerializer(new PhotoObject().GetType());
var result = (PhotoObject)serializer.ReadObject(stream);
byte[] data = Convert.FromBase64String(result.Data);

[DataContract]
class PhotoObject
{
    [DataMember(Name = "size")]
    public string Size { get; set; }

    [DataMember(Name = "data")]
    public string Data { get; set; }
}
4

1 回答 1

1

我终于设法解决了这个问题。我做的第一件事是使用以下方法创建流:

new MemoryStream(data, 0, data.Length, true, true).AsInputStream();

代替

new MemoryStream(data).AsInputStream();

这摆脱了UnauthorizedException,但是它给了我一个ArgumentException: "Value does not fall within the expected range"on the SetDisplayPictureAsync-call 。我仍然不知道它为什么起作用,但我通过将数据写入临时文件来解决这个问题,然后我打开并传递给SetDisplayPictureAsync. 这是我这样做的代码:

//Write bytes to file then open file and pass stream to setdisplaypicture.
StorageFolder localFolder = ApplicationData.Current.LocalFolder;
var folder = await localFolder.CreateFolderAsync("Photo_Temp_Folder", CreationCollisionOption.OpenIfExists);
var file = await folder.CreateFileAsync("photo_" + contact.Id, CreationCollisionOption.ReplaceExisting);
uint written = 0;
using (var writeStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
    while (written < data.Length)
    {
        written += await writeStream.WriteAsync(data.AsBuffer());
    }
}

using (var accessStream = await file.OpenAsync(FileAccessMode.Read))
{
    await contact.SetDisplayPictureAsync(accessStream);
    await contact.SaveAsync();
}
await file.DeleteAsync();

希望它可以帮助某人。

于 2013-03-12T14:15:27.293 回答