How do I retrieve the same photo from the media library between application instances? I launch the photo library for the user to select a photo via:
PhotoChooserTask myPhotoChooser = new PhotoChooserTask();
myPhotoChooser.ShowCamera = true;
myPhotoChooser.Show();
myPhotoChooser.Completed += new EventHandler<PhotoResult>(cameraCaptureTask_Completed);
and then in the Event handler, I retrieve the file name of the selected file like this:
private void cameraCaptureTask_Completed(object sender, PhotoResult e)
{
if (e.TaskResult == TaskResult.OK)
{
string imagePath = e.OriginalFileName.ToString();
}
}
I persist this information in isolated storage so that when a user launches the application again I can retrieve the path and display the image like this:
private BitmapImage ConvertUriToBitmap(string pathToImage)
{
StreamResourceInfo streamResInfo = null;
Uri uri = new Uri(pathToImage, UriKind.Relative);
streamResInfo = Application.GetResourceStream(uri); //This fails! StreamResInfo is null
BitmapImage convertedBitmap = new BitmapImage();
convertedBitmap.SetSource(streamResInfo.Stream);
return convertedBitmap;
}
However, this doesn't seem to work as the photo path from the photo chooser is some sort of guid in the form: "\Applications\Data\02E58193-119F-42E2-AD85-C24247BE2AB0\Data\PlatformData\PhotoChooser-4edd185d-d934-4dac-8a34-758cac09d338.jpg"
Application.GetResourceStream(uri) is null whenenever I switch out of the application or move between pages. Is there a better way to do this?
How do I retrieve the same path everytime so that when I tombstone or kill the app, i can retireve the file and display it? Or is there a different /more efficient way of doing it.
I found the answer in the documentation: http://msdn.microsoft.com/en-us/library/gg680264%28v=pandp.11%29.aspx Basically, there is a bug in the photo chooser which returns a temporary path. Microsofts recommendation is to copy the picture to isolated storage if you want to use it between app instances.
Application.GetResourceStream will return null for that path because the GetResourceStream method is looking for a resource within the application itself, not from the device.
To re-load the same image on resume from tombstoning simply persist the OriginalFileName property, and then use that to create a
BitmapImage
as follows:NOTE: The OriginalFileName property is already a string, so you don't need to call .ToString() on it.