如何解决来自 Xamarin Forms FilePicker FileResult 的 Android Uri
我正在使用以下代码以 xamarin 形式使用 FilePicker 选择文件。最终目标是将 Android Uri 提供给 Xamarin.Android 项目中的服务,该服务将文件传输到某个地方。
我如何从 FilePicker 结果中以 xamarin 形式获取 Android Uri(Android.Net.Uri )? Android 服务只接受 Android.Net.Uri 类型。
if let ...
我尝试了以下方法:
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
}
但是服务给出了找不到文件的错误。 该服务在 Xamarin.Android 项目中工作正常,具有与本机文件选择器活动相同的文件,我从文件选择后返回的意图中获取 Uri。 下面是对 Uri 对象的比较,一个使用 :
生成的对象firmwareFullPath = result.FullPath;
Android.Net.Uri FirmwareUri = Android.Net.Uri.Parse(firmwareFullPath);
另一个来自
Android.Net.Uri.Parse(firmwareFullPath);
来自 Xamarin.Form FilePicker 的 Uri 对象
**主要区别是在 xamarin 表单文件选择器的情况下,Authority 和 EncodedAuthority 为 null **
解决方法
最简单的方法是使用此路径并创建 URI,
我不确定 PickAsync
的响应是什么,但如果我没记错的话,你应该得到一个路径。
var filePath = result.Path;
现在要将其转换为 Android URI,只需将路径作为参数传入即可
var fileUri = Android.Net.Uri.Parse(filePath);
祝你好运!
如有疑问,请随时回复
,关于在 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;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。