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

Xamarin Android写入SD卡共享存储:跨设备访问文件方案咨询

解决方案

方案一:使用存储访问框架(SAF,官方推荐)

这是符合Android 11分区存储规范的标准做法,通过让用户手动选择SD卡上的目标文件夹,获取访问权限后进行文件读写。优点是无需特殊权限,符合Google Play审核要求。

实现步骤:

  • 启动SAF的文件夹选择界面,引导用户选择SD卡上的非应用专属文件夹(比如根目录自定义的MyAppFiles,或者公共的Documents文件夹)
  • 获取用户选中文件夹的Uri,保存持久化访问权限(避免下次启动需重新选择)
  • 通过ContentResolver操作该Uri对应的文件夹,完成文件创建与写入

代码示例(Xamarin Android):

// 文件夹选择请求码
private const int RequestCodePickFolder = 1001;

// 触发SD卡文件夹选择
private void PickSdCardFolder()
{
    Intent intent = new Intent(Intent.ActionOpenDocumentTree);
    // 指定显示可写的外部存储设备(SD卡)
    intent.PutExtra("android.content.extra.SHOW_ADVANCED", true);
    intent.PutExtra("android.content.extra.SHOW_FILES", true);
    StartActivityForResult(intent, RequestCodePickFolder);
}

// 处理选择结果
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);
    if (requestCode == RequestCodePickFolder && resultCode == Result.Ok && data != null)
    {
        Uri folderUri = data.Data;
        if (folderUri != null)
        {
            // 持久化文件夹的读写权限
            ContentResolver.TakePersistableUriPermission(folderUri, IntentFlags.GrantReadUriPermission | IntentFlags.GrantWriteUriPermission);
            
            // 写入测试文件
            WriteFileToFolder(folderUri, "test.txt", "这是SD卡公共文件夹的内容");
        }
    }
}

// 写入文件到指定文件夹
private void WriteFileToFolder(Uri folderUri, string fileName, string content)
{
    Uri fileUri = DocumentsContract.BuildDocumentUriUsingTree(folderUri, DocumentsContract.GetTreeDocumentId(folderUri) + "/" + fileName);
    
    try
    {
        using (Stream outputStream = ContentResolver.OpenOutputStream(fileUri))
        using (StreamWriter writer = new StreamWriter(outputStream))
        {
            writer.Write(content);
        }
    }
    catch (Exception ex)
    {
        // 处理写入异常
    }
}

方案二:申请MANAGE_EXTERNAL_STORAGE权限(特殊场景适用)

如果你的应用是文件管理器类工具,或有明确理由需要直接访问整个SD卡,可申请此特殊权限,但需注意:

  • 用户需手动到应用设置开启「所有文件访问权限」
  • Google Play对该权限审核严格,非必要不建议使用

实现步骤:

  1. 在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  1. 检查并引导用户开启权限:
private void CheckManageStoragePermission()
{
    if (!Environment.IsExternalStorageManager)
    {
        Intent intent = new Intent(Settings.ActionManageAppAllFilesAccessPermission);
        Uri uri = Uri.FromParts("package", PackageName, null);
        intent.SetData(uri);
        StartActivity(intent);
    }
    else
    {
        // 权限已授予,直接写入SD卡公共目录
        string sdPublicDir = Path.Combine(Environment.ExternalStorageDirectory.AbsolutePath, "MyAppFiles");
        Directory.CreateDirectory(sdPublicDir);
        string filePath = Path.Combine(sdPublicDir, "test.txt");
        File.WriteAllText(filePath, "直接写入SD卡公共文件夹的内容");
    }
}

原方法无效的原因

你之前用GetExternalFilesDirs获取的是应用专属外部存储目录,路径格式通常为/storage/sdcard0/Android/data/你的包名/files/,该目录下的文件仅当前应用可访问,卸载应用时会被删除,且其他设备插入SD卡后无法看到此目录内容,完全不符合跨设备访问的需求。

内容的提问来源于stack exchange,提问作者randycobb12

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:25:05