0

Facebookのステータスを画像で送信できません。コードが見つかりましたが、例外がスローされます

The Safe handle is closed

何か足りないものがあれば教えてください。File.OpenRead(filename)が使用されたが、UnAuthorizedAccessExceptionがスローされた別の例がありました

コードは次のとおりです:

public static Stream ImageToShare
        {
        set
            {
                try
                {
                    using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
                    {
                        if (myIsolatedStorage.FileExists(ImageToShareKey))
                            myIsolatedStorage.DeleteFile(ImageToShareKey);

                        IsolatedStorageFileStream fileStream = myIsolatedStorage.CreateFile(ImageToShareKey);

                        StreamResourceInfo sri = null;
                        Uri uri = new Uri(ImageToShareKey, UriKind.Relative);
                        sri = Application.GetResourceStream(uri);

                        BitmapImage bitmap = new BitmapImage();
                        bitmap.SetSource(value);
                        //bitmap.SetSource(sri.Stream);
                        WriteableBitmap wb = new WriteableBitmap(bitmap);

                        Extensions.SaveJpeg(wb, fileStream, wb.PixelWidth, wb.PixelHeight, 0, 85);
                        fileStream.Close();
                    }
                }
                catch (Exception ex)
                {
                    AppHelper.ErrorOccured(ex);
                }
            }

private void postFBWithImage()
        {
            try
            {

                using (IsolatedStorageFile myFile = IsolatedStorageFile.GetUserStoreForApplication())
                using (IsolatedStorageFileStream stream = myFile.OpenFile("SharePhoto", FileMode.Open, FileAccess.Read))
                using (var imgFile = new FacebookMediaStream
                {
                    ContentType = "image/jpeg",
                    FileName = Path.GetFileName(imgPath.Text),
                }.SetValue(stream))
                {

                    var fb = new FacebookClient(AppSettings.FacebookPIN);
                    fb.PostCompleted += (o, args) =>
                    {
                        if (args.Error != null)
                        {
                            notPosted(args);
                            return;
                        }

                        Dispatcher.BeginInvoke(() =>
                        {
                            posted();
                        });
                    };

                    fb.PostAsync("me/photos", new { message = ShareComments, imgFile });
                }
            }
            catch (Exception ex)
            {
                AppHelper.ErrorOccured(ex);
                postFBWithoutImage();
            }
        }
4

1 に答える 1

1

メディアストリームを介してFacebookステータスの画像を送信すると、isolatedStorageストリームで問題が発生するため、適切ではありません。最良の方法は、匿名オブジェクトではなくディクショナリオブジェクトのパラメータを移動することです。したがって、合計2つの変更があります。1つはFacebookMediaStreamからFacebookMediaObjectへ、もう1つは匿名オブジェクトの代わりにDictionaryオブジェクトを使用することです。

以下は、シナリオを説明するためのコードです。

 private void postFBWithImage()
    {
        try
        {
            using (IsolatedStorageFile myFile = IsolatedStorageFile.GetUserStoreForApplication())
            using (IsolatedStorageFileStream stream = myFile.OpenFile(AppSettings.ImageToShareKey, FileMode.Open, FileAccess.Read))
            {
                byte[] byteArr = null;
                using (var binRdr = new BinaryReader(stream))
                using (var memStr = new MemoryStream())
                {
                    const int ReadSize = 8196;
                    int chunkSize = 0;
                    do
                    {
                        byte[] buf = new byte[ReadSize];
                        chunkSize = binRdr.Read(buf, 0, ReadSize);
                        memStr.Write(buf, 0, ReadSize);
                    } while (chunkSize > 0);

                    byteArr = new byte[memStr.Length];
                    memStr.Position = 0;
                    memStr.Read(byteArr, 0, (int)memStr.Length);
                }

                var fb = new FacebookClient(AppSettings.FacebookPIN);
                fb.PostCompleted += (o, args) =>
                {
                    if (args.Error != null)
                    {
                        notPosted(args);
                        return;
                    }

                    Dispatcher.BeginInvoke(() =>
                    {
                        posted();
                    });
                };

                var parameters = new Dictionary<string, object>();
                parameters["message"] = ShareComments;
                parameters["file"] = new FacebookMediaObject
                    {
                        ContentType = "image/jpeg",
                        FileName = "image.jpeg",
                    }.SetValue(byteArr);
                fb.PostAsync("me/photos", parameters);

            }
        }
        catch (Exception ex)
        {
            AppHelper.ErrorOccured(ex);
        }
    }
于 2013-01-06T13:09:50.213 に答える