Windows phone 8 从字节[]设置StoredContact的显示图片

Windows phone 8 从字节[]设置StoredContact的显示图片,windows-phone-8,Windows Phone 8,我有一个包含图片数据的字节[]。我想将此图片数据设置为windows phone 8中存储的联系人的显示图片。我试过: byte[] data = ... ContactStore store = await ContactStore.CreateOrOpenAsync(ContactStoreSystemAccessMode.ReadWrite, ContactStoreApplicationAccessMode.ReadOnly); StoredContact contact = awai

我有一个包含图片数据的
字节[]
。我想将此图片数据设置为windows phone 8中存储的联系人的显示图片。我试过:

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);
}
但是我在
AsInputStream()
-调用中得到了
System.UnauthorizedAccessException
。我有
ID\u CAP\u CONTACTS
-功能集,联系人属于自定义数据存储区,我有写入权限。有人知道怎么解决这个问题吗

编辑:

我从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; }
}

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

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

new MemoryStream(data).AsInputStream();
这消除了
未经授权的异常
,但是它在
SetDisplayPictureAsync
-调用中给了我一个
参数异常:“值不在预期范围内”
。我仍然不知道它为什么会工作,但我通过将数据写入临时文件来解决这个问题,然后打开临时文件并传递到
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();
//将字节写入文件,然后打开文件并将流传递给setdisplaypicture。
StorageFolder localFolder=ApplicationData.Current.localFolder;
var folder=await localFolder.CreateFolderAsync(“照片临时文件夹”,CreationCollisionOption.OpenIfExists);
var file=await folder.CreateFileAsync(“photo_uzy”+contact.Id,CreationCollisionOption.ReplaceExisting);
uint-writed=0;
使用(var writeStream=await file.OpenAsync(FileAccessMode.ReadWrite))
{
while(写入<数据长度)
{
writed+=等待writeStream.WriteAsync(data.AsBuffer());
}
}
使用(var accessStream=await file.OpenAsync(FileAccessMode.Read))
{
等待联系。SetDisplayPictureAsync(accessStream);
等待联系。SaveAsync();
}
wait file.deleteSync();

希望它能帮助别人。

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

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

new MemoryStream(data).AsInputStream();
这消除了
未经授权的异常
,但是它在
SetDisplayPictureAsync
-调用中给了我一个
参数异常:“值不在预期范围内”
。我仍然不知道它为什么会工作,但我通过将数据写入临时文件来解决这个问题,然后打开临时文件并传递到
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();
//将字节写入文件,然后打开文件并将流传递给setdisplaypicture。
StorageFolder localFolder=ApplicationData.Current.localFolder;
var folder=await localFolder.CreateFolderAsync(“照片临时文件夹”,CreationCollisionOption.OpenIfExists);
var file=await folder.CreateFileAsync(“photo_uzy”+contact.Id,CreationCollisionOption.ReplaceExisting);
uint-writed=0;
使用(var writeStream=await file.OpenAsync(FileAccessMode.ReadWrite))
{
while(写入<数据长度)
{
writed+=等待writeStream.WriteAsync(data.AsBuffer());
}
}
使用(var accessStream=await file.OpenAsync(FileAccessMode.Read))
{
等待联系。SetDisplayPictureAsync(accessStream);
等待联系。SaveAsync();
}
wait file.deleteSync();

希望它对某人有所帮助。

问题是由于您没有展示某些内容。数据来自哪里?你如何定义你的
联系人
?@MattLacey我编辑了它来显示我是如何从商店获得联系人的。还有数据?这就是错误所在?@MattLacey抱歉错过了这一部分,现在添加。您如何验证流数据是否正确?这似乎是真正的问题。问题在于你没有展示的东西。数据来自哪里?你如何定义你的
联系人
?@MattLacey我编辑了它来显示我是如何从商店获得联系人的。还有数据?这就是错误所在?@MattLacey抱歉错过了这一部分,现在添加。您如何验证流数据是否正确?这似乎是真正的问题。