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"が、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();

それが誰かを助けることを願っています。

于 2013-03-12T14:15:27.293 に答える