You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:23:19