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抱歉错过了这一部分,现在添加。您如何验证流数据是否正确?这似乎是真正的问题。