Uri Android из форм Xamarin FilePicker FileResult

#android #forms #file #xamarin #picker

#Android #формы #файл #xamarin #средство выбора

Вопрос:

Я использую следующий код для выбора файла с помощью FilePicker в xamarin forms. Конечная цель — предоставить Uri Android службе в Xamarin.Android проект, служба передает файл куда-то.

Как мне получить Uri Android (Android.Net.Uri ) из результата FilePicker в формах xamarin? Служба Android принимает только тип Android.Net.Uri.

 try
        {
            var result = await FilePicker.PickAsync(new PickOptions { 
            
                PickerTitle = "Select zip file"
            });
          
            if (result != null)
            {
                FileNameLabel.Text = $"File Name: {result.FileName}";
                if (!result.FileName.EndsWith("zip", StringComparison.OrdinalIgnoreCase))
                {
                   await DisplayAlert("Wrong File", "Selected file is not right", "Ok");
                }
               
            }
        }
        catch (Exception ex)
        {
            // The user canceled or something went wrong
        }
 

Я попробовал следующее:

 firmwareFullPath = result.FullPath;
Android.Net.Uri FirmwareUri = Android.Net.Uri.Parse(firmwareFullPath);
 

Но служба выдает ошибку file not found.
Служба отлично работает в Xamarin.Android-проект с тем же файлом с собственной активностью выбора файлов, где я получаю Uri из intent, возвращаемый после выбора файла.
Ниже приведено сравнение объектов Uri, один объект, созданный с помощью :

 Android.Net.Uri.Parse(firmwareFullPath);
 

Другой из

  protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
            if ((resultCode == Result.Ok) amp;amp; (data != null))
            {
                Android.Net.Uri FirmwareUri = data.Data;

            }
        
    }
 

Объект Uri из Xamarin.Form FilePicker
введите описание изображения здесь

Объект Uri из Xamarin.Andriod введите описание изображения здесь

** Основное отличие заключается в том, что Authority и EncodedAuthority равны нулю в случае xamarin forms filepicker **

Ответ №1:

Самым простым способом было бы использовать путь к этому и создать URI,

Я не уверен, каков ответ PickAsync , но если я не ошибаюсь, вы должны получить путь.

 var filePath = result.Path;
 

Теперь, чтобы преобразовать это в Android URI, просто передайте путь в качестве параметра, и все готово

 var fileUri = Android.Net.Uri.Parse(filePath);
 

Удачи!

Не стесняйтесь возвращаться, если у вас есть вопросы

Комментарии:

1. Я попробовал это, я получаю проанализированный Uri, но, похоже, он каким-то образом недействителен. Служба возвращает ошибку «Файл не найден». У меня есть тот же проект, который работает должным образом с тем же файлом в Xamarin. Android. Итак, я сравнил объекты Uri в обоих случаях, и они разные. Я постараюсь поделиться скриншотом обоих объектов.

Ответ №2:

О получении пути к файлу uri средства выбора в Forms и Android, я делаю один пример, который вы можете посмотреть.

В формах, используя dependencyservice для получения пути uri.

Создание интерфейса в формах:

 public  interface IFileChanged
{
    object filepath(string path);
}
 

В Android для реализации этого интерфейса:

 [assembly: Dependency(typeof(FileChanged))]
 

пространство имен demo3.Droid
{
класс FileChanged: IFileChanged
{
Android.Net.Uri uri;

     object IFileChanged.filepath(string path)
    {
        Java.IO.File file = new Java.IO.File(path);
        uri = Android.Net.Uri.FromFile(file);
        return uri;
    }
}}

private async void btn3_Clicked(object sender, EventArgs e)
    {
        var file = await CrossFilePicker.Current.PickFile();
        string path = file.FilePath;
        var fileuri = DependencyService.Get<IFileChanged>().filepath(path);
       
    }
 

Путь, подобный {file:///storage/emulated/0/Download/a5.jpg }

Если вы получаете путь к файлу сборщика в Android, путь, подобный /document/raw:/storage/emulated/0/Download/a5.jpg , но это один и тот же файл.

 private void Filepicker_Click(object sender, System.EventArgs e)
    {
        Intent intent = new Intent(Intent.ActionGetContent);
        intent.SetType("*/*");
      
        try
        {
            StartActivityForResult(Intent.CreateChooser(intent, "Select a file"), 0);
        }
        catch (System.Exception exAct)
        {
            System.Diagnostics.Debug.Write(exAct);
        }

    }
    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
        if ((resultCode == Result.Ok) amp;amp; (data != null))
        {
            Android.Net.Uri FirmwareUri = data.Data;
            string path = FirmwareUri.Path;
        }

    }