【问题标题】:How to obtain path of an image file from Memory Stream?如何从 Memory Stream 中获取图像文件的路径?
【发布时间】:2018-01-17 15:09:04
【问题描述】:

我正在使用 Xamarin.Forms PCL 项目,我正在使用 SignaturePad 插件来捕获签名,并且我正在保存在内存流中,例如:

var imageStream = await 
signaturePad.GetImageStreamAsync(SignatureImageFormat.Png);
var signatureMemoryStream = new MemoryStream();
imageStream.CopyTo(signatureMemoryStream);
byte[] data = signatureMemoryStream.ToArray();

现在,我需要在电子邮件中附上签名图片。因此,为此,我使用了 Cross-Messaging NuGet 插件,它允许我将图像附加到电子邮件中。所以,我需要一个签名图像的路径。所以有什么想法,我怎样才能将签名保存在我的本地 Xamarin PCL 共享项目路径中并获取图像的路径?

【问题讨论】:

  • SignaturePad 不公开路径属性。您需要自己将位图写入磁盘

标签: xamarin.forms memorystream signaturepad


【解决方案1】:

将文件保存到设备是特定于设备的,因此您不能直接在 PCL 中执行此操作。您可以做的是使用依赖注入来调用您的 Android 和 iOS 项目以执行保存并返回标题。所以从你的代码中你会调用:

var filePath = DependencyService.Get<IPlatform>().SaveFile(fileBytes, fileName);

在您的 PCL 中定义:

public interface IPlatform
{
    string SaveAndOpenFile(byte[] fileBytes, string fileName);
    void DownloadFile(string url);
}

然后在您的 android 项目中,您将执行类似...:

[assembly: Xamarin.Forms.Dependency(typeof(Platform))]

namespace MyApp.Droid.Classes
{
    internal class Platform : IPlatform
    {
    public async void SaveAndOpenFile(byte[] fileBytes, string fileName)
    {
        var filePath = string.Empty;
        try
        {
            // Write File
            var directory = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
            directory = Path.Combine(directory, Android.OS.Environment.DirectoryDownloads);
            filePath = Path.Combine(directory, fileName);
            File.WriteAllBytes(filePath, fileBytes);
            return filePath
        }
    }
        }
    }

在 iOS 中也是如此:

[assembly: Xamarin.Forms.Dependency(typeof(Platform))]

namespace MyApp.iOS.Classes
{
internal class Platform : IPlatform
{
    public void SaveAndOpenFile(byte[] fileBytes, string fileName)
    {
    }
  }
}

【讨论】:

  • 在 iOS 中,它说 'Platform' 没有实现接口成员 'IPlatform.SaveAndOpenFile(byte[]),String)' 另外,我应该如何在 SaveAndOpenFile 方法中编写代码?
  • 我猜它类似于: var directory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); var filePath = Path.Combine(目录,文件名); File.WriteAllBytes(filePath, fileBytes);但我没有测试过。你可以让 VS 在 iOS 中创建函数定义,看看有什么不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多