Xamarin Forms Labs相机 - 永久保存图像并调用它们

时间:2014-08-07 15:05:22

标签: xamarin.forms

我让相机功能正常工作,它在页面上显示图像,就像我问的那样。但有没有办法永久保存手机或其他地方的图像,然后打电话给它?

非常感谢

1 个答案:

答案 0 :(得分:4)

这里有一些适合我的代码。

IFileAccessSystem.IO.File函数的包装器,例如文件打开,写入,检查是否存在。如果您正在制作自己的文件服务,请查看Xamarin.Forms.Labs.Resolver以及如何使用它;如果您使用共享表单项目类型,则可以直接从Forms项目访问System.IO.File。假设清楚,以下

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;
  }
});

关于IFileAccess的更多细节。

在您的Forms项目中创建如下界面:

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

在iOS或Android或Shared项目中添加一个实现IFileAccess的类FileAccess:

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); 
        }
    }
}

如果您已经在使用Xamarin.Forms.Labs.Resolver,那么只需添加一行来注册该服务,否则在您的iOS或Android项目中找到对Forms.Init()的调用,然后在添加< / p>

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