[英]Call Android Function From Xamarin.Forms
[英]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.