【问题标题】:Saving a file in shared storage Xamarin forms在共享存储 Xamarin 表单中保存文件
【发布时间】:2020-09-07 10:41:43
【问题描述】:

我需要在 android 的共享存储中保存一个文件。我遇到了这个链接 => https://developer.android.com/training/data-storage/shared/documents-files

我正在使用依赖服务,并且能够成功地将文件保存到所需位置。但我只能创建一个空白文件。我需要将一些内容写入该文件。实际上,我在几个小时前使用 android 标签创建了一个线程,并获得了我必须覆盖 OnActivityResult 方法并获取意图数据的解决方案。现在我已经完成了,我能够获得意图数据。但是现在我不知道我应该从意图中选择哪个路径以及如何使用所选路径打开文件以及如何将内容写入该所选文件。任何 android + xamarin 专家都应该能够帮助我..

实现写服务的android平台代码:

Activity _activity;
private static int CREATE_FILE = 6835;

public WriteFileService()
{
    _activity = CrossCurrentActivity.Current.Activity;
}

void IWriteService.WriteFile(string Content)
{
    Intent intent = new Intent(Intent.ActionCreateDocument);
    intent.AddCategory(Intent.CategoryOpenable);
    intent.SetType("application/txt");
    intent.PutExtra(Intent.ExtraTitle, "Invoice.txt");
    _activity.StartActivityForResult(intent, CREATE_FILE);
}

重写的 OnActivityResultMethod:

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    Toast.MakeText(Application.Context, "requestCode is " + requestCode, ToastLength.Short).Show();
    if (requestCode == 6835)
    {
        if (data != null)
        {
            Toast.MakeText(Application.Context,
                data.GetType().ToString(),
                ToastLength.Short).Show();

        }
    }

    base.OnActivityResult(requestCode, resultCode, data);
}

这是来自 OnActivityResult 的 Intent 数据屏幕

【问题讨论】:

  • 您链接到的文档给出了写入文件的具体示例
  • @Jason。我想我经过一番研究后得到了答案。我正在发布它..

标签: xamarin.forms


【解决方案1】:

在您的 Android 项目中使用它来将流保存到文件:

public async Task SaveAndView(string fileName, String contentType, MemoryStream stream)
        {
            try
            {
                string root = null;
                //Get the root path in android device.
                if (Android.OS.Environment.IsExternalStorageEmulated)
                {
                    root = Android.OS.Environment.ExternalStorageDirectory.ToString();
                }
                else
                    root = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

                //Create directory and file 
                Java.IO.File myDir = new Java.IO.File(root + "/meusarquivos");
                myDir.Mkdir();

                Java.IO.File file = new Java.IO.File(myDir, fileName);

                //Remove if the file exists
                if (file.Exists()) file.Delete();

                //Write the stream into the file
                FileOutputStream outs = new FileOutputStream(file);
                outs.Write(stream.ToArray());

                outs.Flush();
                outs.Close();
           }
            catch (Exception ex)
            {
                PostLog.AppCenterLogExcecao(ex, new Dictionary<string, string> { { "origem", "OrderViewModel - 159" } });
            }
        }

在您的共享代码中:

await DependencyService.Get<ISave>().SaveAndView(OrderId.ToString() + ".pdf", "application/pdf", stream);

请务必在使用代码之前询问权限。

【讨论】:

【解决方案2】:

保存文件。我用过这段代码

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    if (requestCode == 6835)
    {
        if (data != null)
        {
            Android.Net.Uri uri = Android.Net.Uri.Parse(data.DataString);
            var stream = ContentResolver.OpenOutputStream(uri, "w");
            byte[] byteArray = Encoding.UTF8.GetBytes("Hi Thameem. I am your file.");
            MemoryStream stream1 = new MemoryStream(byteArray);
            stream1.CopyTo(stream);
            stream.Flush();
            stream.Close();
            Toast.MakeText(Application.Context,
                "The file has been exported successfully",
                ToastLength.Short).Show();
        }
    }

    base.OnActivityResult(requestCode, resultCode, data);
}

【讨论】:

    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 2021-09-23
    • 2020-12-24
    相关资源
    最近更新 更多