#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
** Основное отличие заключается в том, что 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;
}
}