我让相机功能正常工作,它在页面上显示图像,就像我问的那样。但有没有办法永久保存手机或其他地方的图像,然后打电话给它?
非常感谢
答案 0 :(得分:4)
这里有一些适合我的代码。
IFileAccess
是System.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 ());