Android 将图像复制到资源Xamarin

Android 将图像复制到资源Xamarin,android,xamarin,uwp,xamarin.forms,filepicker,Android,Xamarin,Uwp,Xamarin.forms,Filepicker,我有一个Xamarin表单项目,其中我需要用户能够“加载”图像。我已经可以按下按钮并使用FilePicker搜索文件,如下所示: async void OnUpload(object sender, EventArgs e) { try { FileData filedata = await CrossFilePicker.Current.PickFile(); //

我有一个Xamarin表单项目,其中我需要用户能够“加载”图像。我已经可以按下按钮并使用FilePicker搜索文件,如下所示:

async void OnUpload(object sender, EventArgs e)
        {
            try
            {
                FileData filedata = await CrossFilePicker.Current.PickFile();
                // the dataarray of the file will be found in filedata.DataArray 
                // file name will be found in filedata.FileName;
                //etc etc.
            }
            catch (Exception ex)
            {
            }
        } 
[assembly: Xamarin.Forms.Dependency (typeof (FileManager_Android))]

public class FileManager_Android : IFileManager
{
    public void SaveFile(Stream stream)
    {
        var dir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDcim);

        string filename = System.DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".jpg";
        string filePath = System.IO.Path.Combine(dir, name);

        try
        {
            System.IO.File.WriteAllBytes(filePath, imageData);
        }
        catch (Exception ex)
        {
            System.Console.WriteLine(e.ToString());
        }
    }
}
我现在需要的是将“filedata”(图像)复制到项目的资源文件夹中,以便轻松访问该文件。我试过:

await CrossFilePicker.Current.SaveFile(filedata.FileName);
但它不会将任何文件保存到项目文件夹中。
此外,我只需要在UWP和Android上使用它。

使用
SaveFile
方法将其保存在一个非常特定的文件夹中

如果您想将其保存到您选择的某个地方,您必须使用实现它。IO操作非常特定于操作系统,文件路径也是如此。我将给你一个简单的例子,供你借鉴

从在共享代码中定义接口开始,如下所示:

public interface IFileManager
{
    void SaveFile(Stream stream);
}
当然,它也可以有其他方法,如果您想指定文件名之类的内容,也可以有额外的参数,这取决于您。您可能还需要某种返回值来知道发生了什么

现在,每个平台实现这个接口。例如,对于Android,它可能如下所示:

async void OnUpload(object sender, EventArgs e)
        {
            try
            {
                FileData filedata = await CrossFilePicker.Current.PickFile();
                // the dataarray of the file will be found in filedata.DataArray 
                // file name will be found in filedata.FileName;
                //etc etc.
            }
            catch (Exception ex)
            {
            }
        } 
[assembly: Xamarin.Forms.Dependency (typeof (FileManager_Android))]

public class FileManager_Android : IFileManager
{
    public void SaveFile(Stream stream)
    {
        var dir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDcim);

        string filename = System.DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".jpg";
        string filePath = System.IO.Path.Combine(dir, name);

        try
        {
            System.IO.File.WriteAllBytes(filePath, imageData);
        }
        catch (Exception ex)
        {
            System.Console.WriteLine(e.ToString());
        }
    }
}
(保存源代码)

这将获取流并将其保存到您选择的路径


对于UWP,您还需要实现它,这非常类似,除了
SaveFile
的实现。据我所知,目前还没有任何插件可以让你更容易地使用。有,但这个插件似乎只适用于文本文件。你仍然可以从中寻找灵感。

保存文件方法将其保存在一个非常特定的文件夹中

如果您想将其保存到您选择的某个地方,您必须使用实现它。IO操作非常特定于操作系统,文件路径也是如此。我将给你一个简单的例子,供你借鉴

从在共享代码中定义接口开始,如下所示:

public interface IFileManager
{
    void SaveFile(Stream stream);
}
当然,它也可以有其他方法,如果您想指定文件名之类的内容,也可以有额外的参数,这取决于您。您可能还需要某种返回值来知道发生了什么

现在,每个平台实现这个接口。例如,对于Android,它可能如下所示:

async void OnUpload(object sender, EventArgs e)
        {
            try
            {
                FileData filedata = await CrossFilePicker.Current.PickFile();
                // the dataarray of the file will be found in filedata.DataArray 
                // file name will be found in filedata.FileName;
                //etc etc.
            }
            catch (Exception ex)
            {
            }
        } 
[assembly: Xamarin.Forms.Dependency (typeof (FileManager_Android))]

public class FileManager_Android : IFileManager
{
    public void SaveFile(Stream stream)
    {
        var dir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDcim);

        string filename = System.DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".jpg";
        string filePath = System.IO.Path.Combine(dir, name);

        try
        {
            System.IO.File.WriteAllBytes(filePath, imageData);
        }
        catch (Exception ex)
        {
            System.Console.WriteLine(e.ToString());
        }
    }
}
(保存源代码)

这将获取流并将其保存到您选择的路径


对于UWP,您还需要实现它,这非常类似,除了
SaveFile
的实现。据我所知,目前还没有任何插件可以让你更容易地使用。有,但这个插件似乎只适用于文本文件。不过你还是可以从中寻找灵感。

太棒了,谢谢你,唯一的问题是我不想把它保存在像Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDcim)这样的外部文件夹中;但在Drawable folder中,您的应用程序在设备上后无法在该文件夹中写入内容。在这上面也可以看到这个。如果它对你有帮助,请接受它作为答案。太棒了,谢谢你,唯一的问题是我不想把它保存在像Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDcim)这样的外部文件夹中;但在Drawable folder中,您的应用程序在设备上后无法在该文件夹中写入内容。在这上面也可以看到这个。如果它对你有帮助,请接受它作为一个答案。