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对该权限审核严格,非必要不建议使用
实现步骤:
- 在
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" />
- 检查并引导用户开启权限:
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
相关产品推荐
相关产品推荐

