Рассматривая эту проблему xamarin / Essentials # 1322 , как мне загрузить файл как на Android (версии 6-10, Api 23-29), так и на iOS (версия 13.1+) который является общедоступным (может быть предоставлен другим приложениям, например Microsoft Word). Мне не нужно предоставлять доступ на запись другим приложениям, достаточно только чтения, если его необходимо ограничить.
Я получаю следующее исключение:
[Bug] Android.OS.FileUriExposedException: file:///data/user/0/{AppBundleName}/cache/file.doc exposed beyond app through Intent.getData()
со следующим code.
public static string GetCacheDataPath( string fileName ) => Path.Combine(Xamarin.Essentials.FileSystem.CacheDirectory, fileName);
public static FileInfo SaveFile( string filename, Uri link )
{
using var client = new WebClient();
string path = GetCacheDataPath(filename);
DebugTools.PrintMessage(path);
client.DownloadFile(link, path);
return new FileInfo(path);
}
public async Task Test(Uri link)
{
LocalFile path = await SaveFile("file.doc", link).ConfigureAwait(true);
var url = new Uri($"ms-word://{path.FullName}", UriKind.Absolute);
await Xamarin.Essentials.Launcher.OpenAsync(url).ConfigureAwait(true);
}
С этим ответом я создал интерфейс FileService, и он работает с локальными частными файлами, но я не могу поделиться файлами. Начиная с Android Q (10 / Api 29), следующее устарело.
string path = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath; // deprecated
Я получаю следующее исключение:
System.UnauthorizedAccessException: Access to the path '/storage/emulated/0/Download/file.doc' is denied. ---> System.IO.IOException: Permission denied
Я еще не нашел способа чтобы получить путь publi c для Android 10 с помощью Xamarin.Forms. Я просмотрел Android Документы для поставщиков контента , но он находится в Java, и я пока не могу заставить его работать в C#.
Любая помощь будет очень признателен.