.NET MAUI Android:如何写入/storage/emulated/0/Documents目录?
在.NET MAUI Android中访问公共Documents目录
你遇到的问题是因为Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)在Android平台上默认指向应用私有目录,而非系统公共的/storage/emulated/0/Documents。要访问公共Documents目录,需要使用Android平台特定的API,以下是具体解决方案:
1. 创建跨平台接口(共享代码)
在你的.NET MAUI共享项目中定义一个接口,用于统一获取公共Documents路径:
public interface IPublicStorageService { string GetPublicDocumentsPath(); }
2. 实现Android平台特定代码
在Android项目中实现上述接口,调用Android原生API获取公共Documents目录:
using Android.OS; using Microsoft.Maui.Controls; [assembly: Dependency(typeof(YourAppNamespace.Droid.PublicStorageService))] namespace YourAppNamespace.Droid { public class PublicStorageService : IPublicStorageService { public string GetPublicDocumentsPath() { // 获取系统公共Documents目录路径 var publicDocsDir = Environment.GetExternalStoragePublicDirectory(Environment.DirectoryDocuments); return publicDocsDir.AbsolutePath; } } }
注:
Environment.GetExternalStoragePublicDirectory在API 29+被标记为过时,但仍可正常使用;若需完全适配最新Android版本,也可通过MediaStore API实现写入,不过对于简单的文件复制场景,上述方法足够。
3. 配置权限
根据Android版本配置所需权限:
- 在
AndroidManifest.xml中添加以下权限(针对Android 9及以下):<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> - Android 10+(API 29+)无需上述权限,分区存储机制允许直接访问公共Documents目录。
4. 修改你的复制代码
在共享代码中通过DependencyService获取公共Documents路径,替换原有的路径获取逻辑:
string sourceDirectoryPath = Path.Combine(FileSystem.Current.AppDataDirectory, "Logs"); if (!Directory.Exists(sourceDirectoryPath)) { // 无日志文件 return; } // 获取公共Documents目录路径 string documentsFolder = DependencyService.Get<IPublicStorageService>().GetPublicDocumentsPath(); string destinationDirectoryPath = Path.Combine(documentsFolder, "Logs"); if (!Directory.Exists(destinationDirectoryPath)) { Directory.CreateDirectory(destinationDirectoryPath); } foreach (string file in Directory.GetFiles(sourceDirectoryPath)) { string destinationFile = Path.Combine(destinationDirectoryPath, Path.GetFileName(file)); File.Copy(file, destinationFile, overwrite: true); }
额外说明
如果你的应用需要适配Android 13+,且操作的是媒体文件(如图片、音频),可能需要额外申请READ_MEDIA_*权限,但对于普通文档文件,无需额外配置。
内容的提问来源于stack exchange,提问作者meeth_
相关产品推荐
相关产品推荐

