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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:47:44