问题
I am unable to send the facebook status with image. Found the code but it throws the exception
The Safe handle is closed
kindly let me know if i am missing something. there was another example where File.OpenRead(filename) was used but it threw the UnAuthorizedAccessException
the code is following :
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();
}
}
回答1:
sending image with facebook status through media stream is not good as it creates trouble with isolatedStorage streams. best way is to move parameters in Dictionary object rather than anonymous objects. so there are totally 2 changes. one from FacebookMediaStream to FacebookMediaObject and second is the use of Dictionary object instead of using anonymous object
following is the code to describe the scenario.
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);
}
}
来源:https://stackoverflow.com/questions/14053346/upload-image-with-facebook-status-wp8