MAUI Android无法写入Phone/Android/data应用目录问题求助
问题解决:Android无法在Phone/Android/data/<包名>目录下看到写入的文件
核心原因:Android 11+的Scoped Storage限制
从Android 11(API 30)开始,系统启用Scoped Storage机制,即便你申请了WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE权限,第三方文件管理器也无法直接访问应用专属的Android/data/<你的包名>目录。WhatsApp等应用能被文件管理器识别,是因为它们适配了媒体内容提供器,或是用户手动给文件管理器开放了该目录的访问权限。
你的代码路径是正确的,文件实际已存在
你用GetExternalFilesDir(null)获取的路径确实指向Android/data/com.myApp/files,代码执行后test.txt已经写入该目录,只是文件管理器默认不可见。可以通过以下方式验证:
- 执行ADB命令查看文件:
adb shell ls /sdcard/Android/data/com.myApp/files/Library/ - 在应用内添加读取代码,确认文件内容正常:
string content = File.ReadAllText(Path.Combine(_root, "test.txt")); // 输出content应为"red panda"
让文件管理器可见的可行方案
方案1:引导用户给文件管理器授权访问Android/data目录
部分自带文件管理器(如小米、华为)需要用户手动操作:
- 打开文件管理器,找到
Android/data目录,系统会提示授权,点击允许后即可查看你的应用目录 - 部分管理器需先开启「显示隐藏文件」选项
方案2:将文件保存到公共目录(如Download)
如果需要用户直接通过文件管理器看到文件,建议将文件保存到公共下载目录,代码示例:
#if ANDROID string publicDir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath; #endif string savePath = Path.Combine(publicDir, "test.txt"); File.WriteAllBytes(savePath, Encoding.UTF8.GetBytes("red panda"));
注意:
- Android 11+需要申请
MANAGE_EXTERNAL_STORAGE权限,并引导用户到应用设置开启「所有文件访问权限」 - Android 10可在
AndroidManifest.xml中添加android:requestLegacyExternalStorage="true"兼容旧存储机制
方案3:在应用内提供文件分享功能
通过系统分享面板让用户将文件导出到其他可访问位置,代码示例:
#if ANDROID var file = new Java.IO.File(Path.Combine(_root, "test.txt")); var uri = Android.Support.V4.Content.FileProvider.GetUriForFile( Android.App.Application.Context, "com.myApp.fileprovider", // 需在AndroidManifest中配置FileProvider file ); var intent = new Intent(Intent.ActionSend); intent.SetType("text/plain"); intent.PutExtra(Intent.ExtraStream, uri); intent.AddFlags(ActivityFlags.GrantReadUriPermission); Android.App.Application.Context.StartActivity(Intent.CreateChooser(intent, "分享文件")); #endif
关于Install location = preferExternal的说明
这个设置仅控制应用的安装位置,和文件存储路径无关,不会影响Android/data目录下的文件可见性。
内容的提问来源于stack exchange,提问作者red_panda
相关产品推荐
相关产品推荐

