看看这个问题,扎马林/要点#1322,我如何下载一个文件在安卓(版本6-10,Api 23-29 )和iOS (版本13.1+ )是公开的(可共享的其他应用程序,如Microsoft )。我不需要给其他应用程序的写访问权,只要阅读是可以的,如果它必须受到限制。
我得到以下例外:
[Bug] Android.OS.FileUriExposedException: file:///data/user/0/{AppBundleName}/cache/file.doc exposed beyond app through Intent.getData() 下面的代码。
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 (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我还没有找到任何途径,为安卓10与Xamarin.Forms的公共路径。我看过用于内容提供者的Android文档,但它是用Java编写的,我还不能让它在C#中工作。
任何帮助都将不胜感激。
发布于 2020-07-29 17:31:41
我确实找到了一个解决方案
找到了一个修复 适用于Android public Task DownloadFile( Uri链接,string fileName ){ if (链接为空)抛出新的ArgumentNullException(nameof( link ));使用System.Net.WebClient client = new System.Net.WebClient();// MainActivity是加载应用程序的类。// MainActivity.Instance是在OnCreate中设置"Instance = this;“的属性。MainActivity.Instance.GetExternalFilesDir(MediaStore.Downloads.ContentType);root = global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity string path = Path.Combine(root.AbsolutePath,fileName);client.DownloadFile(链接,路径);返回Task.FromResult(新链接(Path));}公共类MainActivity :global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity{内部静态MainActivity实例{ get;私有集;}受保护的重写void (Bundle savedInstanceState) {.实例=此;}.} 对于iOS 公共Path.Combine(Xamarin.Essentials.FileSystem.CacheDirectory,Task DownloadFile( Uri链接,字符串fileName) { if (链接为空)抛出新ArgumentNullException(链接);使用System.Net.WebClient client = new System.Net.WebClient();string path =ArgumentNullException fileName client.DownloadFile(链接,路径);返回Task.FromResult(新路径);} public异步任务共享(){ // back在共享项目中,选择一个文件名并传递链接。System.IO.FileInfo info =等待DependencyService.Get().DownloadFile(新Uri("",“file.doc”).ConfigureAwait(真);ShareFile shareFile =新ShareFile(info.FullName,"doc");//输入文件类型/扩展名。var ShareFileRequest=新ShareFileRequest(“选择应用程序打开文件”,shareFile);等待shareFile} 请注意,对于iOS,由于苹果的无限智慧..。我不能像在Android上那样直接与另一个应用程序共享文件。沙箱对安全性有好处,但在本例中,如何实现沙箱限制了选项。两个应用程序都必须在"App Group“中预注册/预分配才能直接共享文件。有关更多信息,请参见此文章和苹果文档。
https://stackoverflow.com/questions/62839083
复制相似问题