如何用AvaloniaUI 11在系统下载文件夹创建文件?安卓权限问题求助
Avalonia 11 Android环境下Downloads文件夹创建文件权限问题解决办法
1. 必须动态申请危险权限
从Android 6.0(API Level 23)开始,READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE这类危险权限,仅在AndroidManifest.xml中声明是不够的,必须在运行时主动向用户申请授权。
动态权限申请实现(C#代码)
在文件操作前调用以下逻辑,比如页面初始化时:
using Android.App; using Android.Content.PM; using Android.OS; public async Task RequestStoragePermissions() { if (Build.VERSION.SdkInt >= BuildVersionCodes.M) { var permissions = new[] { Android.Manifest.Permission.ReadExternalStorage, Android.Manifest.Permission.WriteExternalStorage }; foreach (var perm in permissions) { if (ContextCompat.CheckSelfPermission(Application.Context, perm) != Permission.Granted) { ActivityCompat.RequestPermissions((Activity)Application.Context, permissions, 1001); // 需要在Activity中重写OnRequestPermissionsResult方法处理授权结果 await Task.Delay(100); // 简单等待,实际需处理回调逻辑 break; } } } }
记得在MainActivity中重写OnRequestPermissionsResult,确认用户授予权限后再执行文件操作。
2. 修正Avalonia StorageProvider的使用逻辑
你原代码中TryGetFileFromPath是用于获取已存在的文件,创建新文件应该使用StorageFolder.CreateFileAsync方法,避免因文件不存在触发异常:
var downloadFolder = await storageProvider.TryGetWellKnownFolder(WellKnownFolder.Downloads); if (downloadFolder != null) { // 创建新文件,可通过CreationCollisionOption处理文件已存在的情况 var newFile = await downloadFolder.CreateFileAsync("Myfile.txt", CreationCollisionOption.ReplaceExisting); // 写入文件内容示例 using var stream = await newFile.OpenWriteAsync(); using var writer = new StreamWriter(stream); await writer.WriteLineAsync("测试内容"); }
3. Android 11+特殊权限适配(可选)
如果应用目标为Android 11(API Level 30)及以上,MANAGE_EXTERNAL_STORAGE权限无法通过常规动态申请,需引导用户到系统设置开启。但操作Downloads文件夹时,Avalonia的StorageProvider基于系统存储访问框架,通常不需要该权限,仅在需访问全外部存储或非媒体文件时使用:
if (Build.VERSION.SdkInt >= BuildVersionCodes.R) { if (!Environment.IsExternalStorageManager) { var intent = new Intent(Settings.ActionManageAppAllFilesAccessPermission); intent.SetData(Android.Net.Uri.Parse($"package:{Application.Context.PackageName}")); ((Activity)Application.Context).StartActivity(intent); } }
4. 确认Manifest配置细节
你添加的requestLegacyExternalStorage="true"仅对Android 10(API 29)有效,用于兼容旧存储模式。确保uses-permission标签未添加android:maxSdkVersion等限制,避免权限被过滤。
内容的提问来源于stack exchange,提问作者SuperJMN
相关产品推荐
相关产品推荐

