繁体   English   中英

Android Uri from Xamarin Forms FilePicker FileResult

[英]Android Uri from Xamarin Forms FilePicker FileResult

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

如何从 FilePicker 结果中获取Android Uri ( Android.Net.Uri ) xamarin ZAC68B623ABFD6A9FEC26E8CE4? 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 对象的比较,其中一个 object 使用以下方法生成:

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 Object 在此处输入图像描述

来自 Xamarin.Andriod 的 Uri Object 在此处输入图像描述

**主要区别是授权和编码授权是 null 在 xamarin forms 文件选择器的情况下 **

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

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

var filePath = result.Path;

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

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

祝你好运!

如果您有任何疑问,请随时回复

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

在Forms中,使用dependencyservice获取uri路径。

在 Forms 中创建接口:

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

在Android中,要实现这个接口:

[assembly: Dependency(typeof(FileChanged))]

命名空间 demo3.Droid {
class 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) && (data != null))
        {
            Android.Net.Uri FirmwareUri = data.Data;
            string path = FirmwareUri.Path;
        }

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM