GetFileFromApplicationUriAsync, CopyAsync, AsStreamForRead не реализованы в платформе Uno.Обходные? - PullRequest
3 голосов
/ 27 сентября 2019

Я пытался использовать следующие методы, но все они выглядели как не реализовано в Uno (Android).Что я могу сделать?

Есть ли альтернатива Xamarin.Essentials ?

Или другой пакет NuGet ?

Или я должен использовать нативные реализации на каждой платформе?

И возможно ли реализовать это в Uno напрямую?

var pdfFile = StorageFile.GetFileFromApplicationUriAsync(..);
pdfFile.CopyAsync(..);
(await pdfFile.OpenReadAsync()).AsStreamForRead(); // AsStreamForRead() not implemented

Я использую Uno.UI v1.45.0.

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Как отметил Дэвид Оливер в своем ответе ,

Uno не реализовал большинство API-интерфейсов Windows.StorageFile, поскольку по большей части существуют альтернативы, доступные вSystem.IO, который будет работать кроссплатформенным.

Итак ...

  1. К открыть файл из пакета приложения мыможет установить действие сборки на Embedded Resource вместо Content.И вместо StorageFile.GetFileFromApplicationUriAsync() метода мы можем использовать этот код:

    public Stream GetStreamFromResourceFile(string filename, Type callingType = null)
    {
        var assembly = (callingType ?? GetType()).Assembly;
        string foundResourceName = assembly.GetManifestResourceNames().FirstOrDefault(r => r.EndsWith(filename, StringComparison.InvariantCultureIgnoreCase));
        if (foundResourceName == null)
            throw new FileNotFoundException("File was not found in application resources. Ensure that the filename is correct and its build action is set to 'Embedded Resource'.", filename);
        return assembly.GetManifestResourceStream(foundResourceName);
    }
    
  2. в копировать файл

    await pdfFile.CopyAsync(..);
    

    мы изменяем на:

    await pdfFile.CopyToAsync(newFile);
    
  3. и для получения потока для чтения

    (await pdfFile.OpenReadAsync()).AsStreamForRead();
    

    мы используем:

    File.OpenRead(pdfFile);
    

Итак, в итоге мы имеем:

        string filename = "File.pdf";
        var pdfFile = GetStreamFromResourceFile(filename, GetType());
        string newFilePath = Path.Combine(ApplicationData.Current.LocalFolder.Path, filename);
        using (var newFile = File.Create(newFilePath))
        {
            await pdfFile.CopyToAsync(newFile);
        }

        var fileStream = File.OpenRead(newFilePath);
0 голосов
/ 27 сентября 2019

Uno не реализовал большинство API Windows.StorageFile, так как по большей части есть альтернативы, доступные в System.IO, которые будут работать кроссплатформенно.

Если вы пытаетесь отобразитьPDF, однако, в настоящее время нет кроссплатформенного варианта.На Android лучший способ отобразить pdf - запустить намерение, на iOS можно отобразить pdf в виде WebView.

Частичный пример кода для Android:

        public async Task Read(CancellationToken ct, string filePath)
        {
            var intent = new Intent(Intent.ActionView);

            var file = new Java.IO.File(filePath);
            var contentUri = Android.Support.V4.Content.FileProvider.GetUriForFile(ContextHelper.Current, _fileProviderAuthority, file);

            intent.SetFlags(ActivityFlags.GrantReadUriPermission);
            intent.SetDataAndType(contentUri, "application/pdf");

            StartActivity(intent);
        }

Частичный пример кода для iOS:

                    <ios:WebView 
                                 Source="{Binding FilePath}"
                                 HorizontalAlignment="Stretch"
                                 VerticalAlignment="Stretch" />
...