如何在Xamarin Forms中识别Downloads下载文件夹?是否需特定权限
Xamarin Forms 获取Downloads下载文件夹路径解决方案
路径获取实现逻辑
Xamarin Forms 官方没有提供直接获取 Downloads 文件夹路径的跨平台API,Environment.GetFolderPath() 对应的 SpecialFolder 枚举未包含公共下载目录项,FileSystemHelper 也未封装该路径,需要通过依赖服务分别对接各平台原生API实现:
- 安卓端公共下载目录:调用原生API
Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath即可获取路径 - iOS端无系统级公共下载共享目录,仅可获取应用自身沙箱内的Downloads文件夹,调用原生API
NSSearchPath.GetDirectories(NSSearchPathDirectory.DownloadsDirectory, NSSearchPathDomain.User, true)[0]即可获取路径
权限要求
- 安卓端
- 仅操作当前应用自身写入公共Downloads目录的文件:安卓6.0-9需要申请
WRITE_EXTERNAL_STORAGE权限,安卓10及以上无需申请任何权限 - 需要读取其他应用写入公共Downloads目录的文件:安卓12及以下申请
READ_EXTERNAL_STORAGE权限,安卓13及以上申请对应类型的READ_MEDIA_*权限,非媒体类文件需通过系统文件选择器授权访问,无法直接通过路径读取
- 仅操作当前应用自身写入公共Downloads目录的文件:安卓6.0-9需要申请
- iOS端
- 访问应用自身沙箱内的Downloads文件夹:无需申请额外权限
- 访问其他应用的下载文件:无法直接获取路径,需拉起系统文件选择器授权访问,无需提前申请静态权限
完整依赖服务实现示例
- 共享项目中定义服务接口
public interface IDownloadPathService { string GetDownloadsFolderPath(); }
- 安卓端平台实现
[assembly: Dependency(typeof(DownloadPathServiceAndroid))] namespace YourAppNamespace.Droid { public class DownloadPathServiceAndroid : IDownloadPathService { public string GetDownloadsFolderPath() { return Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath; } } }
- iOS端平台实现
[assembly: Dependency(typeof(DownloadPathServiceiOS))] namespace YourAppNamespace.iOS { public class DownloadPathServiceiOS : IDownloadPathService { public string GetDownloadsFolderPath() { return NSSearchPath.GetDirectories(NSSearchPathDirectory.DownloadsDirectory, NSSearchPathDomain.User, true).FirstOrDefault(); } } }
- 共享项目调用方式
var downloadsPath = DependencyService.Get<IDownloadPathService>().GetDownloadsFolderPath();
内容的提问来源于stack exchange,提问作者Michael Wagner
相关产品推荐
相关产品推荐

