Xamarin Forms Labs Camera - Persistently Save Images and Recall

I got the camera function to work and it displays the image on the page as I asked too. But is there a way to save the image to my phone or somewhere else and then call it up?

Thank you very much

+2


source to share


1 answer


Here is the code that works for me.

IFileAccess

is my wrapper around functions System.IO.File

like file open, write, exsist check. If you are creating your own file service, find Xamarin.Forms.Labs.Resolver

and how to use it; if you are using the generic Forms project type, you can access System.IO.File directly from the Forms project. Assuming it's clear that

var fileAccess = Resolver.Resolve<IFileAccess> (); 
mediaPicker.SelectPhotoAsync (new CameraMediaStorageOptions{ MaxPixelDimension = 1024 })
.ContinueWith(t=>{
  if (!t.IsFaulted && !t.IsCanceled) { 
    var mediaFile = t.Result;  

    var fileAccess = Resolver.Resolve<IFileAccess> ();
    string imageName = "IMG_" + DateTime.Now.ToString ("yy-MM-dd_HH-mm-ss") + ".jpg";

 // save the media stream to a file 
    fileAccess.WriteStream (imageName, mediaFile.Source);

 // use the stored file for ImageSource
    ImageSource imgSource = ImageSource.FromFile (fileAccess.FullPath (imageName)); 

    imgInXAML.Source = imgSource;
  }
});

      


Learn more about IFileAccess.

In your Forms project, create an interface like this:



public interface IFileAccess
{
    bool Exists (string filename);
    string FullPath(string filename); 
    void WriteStream (string filename, Stream streamIn);
}

      

In your iOS or Android or Shared project, add a FileAccess class that implements IFileAccess:

public class FileAccess : IFileAccess
{ 
    public bool Exists (string filename)
    {
        var filePath = GetFilePath (filename);

        if (File.Exists (filePath)) {
            FileInfo finf = new FileInfo (filePath);
            return finf.Length > 0;
        } else
            return false;
    }

    public string FullPath (string filename)
    {
        var filePath = GetFilePath (filename);
        return filePath;
    }

    static string GetFilePath (string filename)
    {
        var documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal);
        var filePath = Path.Combine (documentsPath, filename);
        return filePath;
    }

    public void WriteStream (string filename, Stream streamIn)
    {
        var filePath = GetFilePath (filename);
        using (var fs = File.Create (filePath)) {
            streamIn.CopyTo (fs); 
        }
    }
}

      

If you are already using Xamarin.Forms.Labs.Resolver add only the line to register the service, otherwise in your iOS or Android project find the call Forms.Init()

and right before adding

var resolverContainer = new SimpleContainer ();
resolverContainer.Register<IFileAccess> (t => new FileAccess ()); // maybe just this line
Resolver.SetResolver (resolverContainer.GetResolver ());

      

+4


source







All Articles