【问题标题】:Android Uri from Xamarin Forms FilePicker FileResult来自 Xamarin Forms FilePicker FileResult 的 Android Uri
【发布时间】:2020-12-30 02:18:49
【问题描述】:

我正在使用以下代码在 xamarin 表单中使用 FilePicker 选择文件。最终目标是将 Android Uri 提供给 Xamarin.Android 项目中的服务,该服务将文件传输到某个地方。

我如何从 FilePicker 结果获取 xamarin 表单的 Android Uri(Android.Net.Uri )? 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);

但是服务给出了找不到文件的错误。 该服务在 Xamarin.Android 项目中使用与本机文件选择器活动相同的文件运行良好,我从文件选择后返回的意图中获取 Uri。 下面是对 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) && (data != null))
            {
                Android.Net.Uri FirmwareUri = data.Data;

            }
        
    }

来自 Xamarin.Form FilePicker 的 Uri 对象

来自 Xamarin.Andriod 的 Uri 对象

**主要区别是在 xamarin 表单文件选择器的情况下,Authority 和 EncodedAuthority 为 null **

【问题讨论】:

    标签: android forms file xamarin picker


    【解决方案1】:

    最简单的方法是使用此路径并创建 URI,

    我不确定PickAsync 的响应是什么,但如果我没记错的话,你应该得到一个路径。

    var filePath = result.Path;
    

    现在要将其转换为 Android URI,只需将路径作为参数传递即可完成

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

    祝你好运!

    如有疑问,请随时回复

    【讨论】:

    • 我试过这个,我确实得到了一个解析的 Uri,但它似乎以某种方式无效。服务返回错误“找不到文件”。我确实有相同的项目在 Xamarin.Android 中使用相同的文件正常工作。所以,我比较了两种情况下的 Uri 对象,它们是不同的。我将尝试分享这两个对象的屏幕截图。
    【解决方案2】:

    关于在 Forms 和 Android 中获取选取器 uri 文件路径,我做了一个示例,您可以看看。

    Forms中,使用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中获取picker文件路径,路径类似于/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) && (data != null))
            {
                Android.Net.Uri FirmwareUri = data.Data;
                string path = FirmwareUri.Path;
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 2020-06-27
      相关资源
      最近更新 更多