新闻详情

新闻详情

首页 / 资讯中心 / 详情

Avalonia Android 存储权限适配指南:IStorageProvider 与 Android 13 分区存储完整上手

发布时间:2026/9/3 12:06:33来源:尧图网络
Avalonia Android 存储权限适配指南:IStorageProvider 与 Android 13 分区存储完整上手
Avalonia Android 存储权限适配指南IStorageProvider 与 Android 13 分区存储完整上手【免费下载链接】AvaloniaDevelop Desktop, Embedded, Mobile and WebAssembly apps with C# and XAML. The future of .NET UI项目地址: https://gitcode.com/GitHub_Trending/ava/Avalonia如果你要用 Avalonia 的 IStorageProvider 接口让 Android 应用读取和保存文件这篇文章就是为你写的讲清 Android 13API 33分区存储系统按目录隔离文件访问权限的机制带来的变更并给出可落地的适配步骤。读完你可以让文件选择与保存功能在 Android 10 至 14 设备上不再抛SecurityException。背景速览Android 13API 33起WRITE_EXTERNAL_STORAGE权限声明不再授予任何能力READ_EXTERNAL_STORAGE对媒体类目录同样失效。直接拼路径读写公共目录如/storage/emulated/0/DCIM的做法全部被分区存储拦截旧代码运行时抛SecurityException。影响面所有在 Android 目标上直接访问文件系统的 Avalonia 应用。官方示例 ControlCatalog.Android 的 AndroidManifest.xml 中至今保留着旧式权限声明就是需要按本文修改的典型样本。原理一分钟核心结论一句话新版 Android 上申请权限要换成系统文件选择器。路径权限要求说明应用私有目录GetExternalFilesDir无需权限任何时候都可直接读写AndroidStorageProvider.cs 中TryGetWellKnownFolderAsync返回的就是这个目录用户经系统选择器选中的文件无需运行时权限选择器授权一次 URI 级访问有效期为本次会话公共目录直接拼路径API 33 禁止无论清单里声明了什么权限Avalonia 在 Android 上的实现AndroidStorageProvider已按这套规则写好OpenFilePickerAsync内部发ACTION_OPEN_DOCUMENTIntent 拉起系统选择器你只管处理返回的IStorageFile。落地步骤第 1 步清理清单里的过期权限。清单里留着WRITE_EXTERNAL_STORAGE不会报错但在 API 33 设备上它是无效声明还会误导后来维护的人。按目标版本条件保留旧权限!-- 仅旧版设备需要API 33 已失效按 minSdk 决定是否保留 -- uses-permission android:nameandroid.permission.READ_EXTERNAL_STORAGE android:maxSdkVersion32 /做完后你用aapt dump permissions查看 APK权限列表里不再出现WRITE_EXTERNAL_STORAGE。第 2 步旧设备补一次运行时请求。分区存储只管 API 30 设备Android 10 以下应用直接读外部文件仍需运行时授权这段请求逻辑放在 MainActivity.cs 的OnCreate里protected override void OnCreate(Bundle? savedInstanceState) { base.OnCreate(savedInstanceState); // 仅 API 32 及以下需要运行时请求33 走选择器不申请存储权限 if (Build.VERSION.SdkInt BuildVersionCodes.Tiramisu) { RequestPermissions(new[] { Manifest.Permission.ReadExternalStorage }); } }做完后在 Android 9 设备上启动应用系统会弹出一次性授权弹窗且仅首次出现。第 3 步新设备用IStorageProvider走选择器。这是推荐路径——不声明、不请求任何存储权限授权由系统选择器完成。完整写法可参考官方示例 DialogsPage.xaml.cs// 从当前控件所在窗口拿到平台存储提供器 var provider TopLevel.GetTopLevel(this)!.StorageProvider; var files await provider.OpenFilePickerAsync(new FilePickerOpenOptions { Title 选择图片, AllowMultiple true, FileTypeFilter new[] { FilePickerFileTypes.Images } // 限定 MIME 类型 }); using var stream await files[0].OpenReadAsync(); // 返回流逐文件读取上图即示例项目 Assets 中用于展示图片加载效果的素材通过上面的选择器拿到IStorageFile后读成流再交给Bitmap即可显示。第 4 步保存走SaveFilePickerAsync。想写文件不要猜路径用SaveFilePickerAsync生成带写入授权的 URI跨进程重启后要再次访问同一文件则用CreateBookmarkAsync生成书签书签是一段可序列化的字符串Android 端底层是 URI 编码见AndroidStorageProvider中的DecodeUriFromBookmark。做完后在 API 33 设备上完整跑一遍选图 → 保存流程无任何权限弹窗、无异常。排错手册常见报错原因修复SecurityException: Permission Denial: opening provider ...ExternalStorageProvider用绝对路径直读公共目录改走OpenFilePickerAsync或写入GetExternalFilesDir私有目录选择后文件打开抛FileNotFoundException选择器返回的是content://虚拟路径不能按磁盘路径打开只通过IStorageFile.OpenReadAsync()读流需要落盘时CopyToAsync到自己目录升级 13 后原本可用的读取突然失败仍依赖READ_EXTERNAL_STORAGE授权该权限 API 33 起无效改用选择器或MediaStore查询多文件选择只拿到 1 个选择器返回ClipData旧代码只读了Data字段升级到当前版Avalonia.AndroidStartActivity已处理ClipData验收清单Android 13/14 真机上不声明任何存储权限选图→读取→保存全链路无异常Android 9 真机上首次点击读取外部文件时弹出权限弹窗拒绝后功能给出友好降级AndroidManifest.xml中已移除WRITE_EXTERNAL_STORAGE或加maxSdkVersion限定应用私有目录GetExternalFilesDir写入成功且全程无权限弹窗重启应用后用CreateBookmarkAsync生成的书签仍能打开原文件Avalonia 通过IStorageProvider抽象屏蔽了 Android 分区存储的权限细节选文件走系统选择器、写文件走SaveFilePickerAsync清单里只留条件限定的旧权限即可。下一步建议对照 AndroidStorageProvider.cs 通读一遍实现确认你的调用方式与框架假设一致。【免费下载链接】AvaloniaDevelop Desktop, Embedded, Mobile and WebAssembly apps with C# and XAML. The future of .NET UI项目地址: https://gitcode.com/GitHub_Trending/ava/Avalonia创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

2026 TikTok营销增长方法:品牌如何搭建KOC矩阵避免无效流量? 2026/9/3 12:39:44

2026 TikTok营销增长方法:品牌如何搭建KOC矩阵避免无效流量?

对于月度TikTok预算达到10万美金以上、同时运营多个国家、产品线和账号的出海品牌来说,真正危险的往往不是“播放量不够高”,而是数据很漂亮,但品牌影响力、用户认知和市场资产没有同步增长。账号可能短时间获得大量播放、点赞和粉丝&#xf…

阅读更多 →
从210亿投入看小米玄戒芯片:SoC适配与测试要点解析 2026/9/3 12:39:44

从210亿投入看小米玄戒芯片:SoC适配与测试要点解析

芯片圈这次的消息比想象中实。小米把新一代玄戒芯片正式端到发布会台面,雷军同步交了个底:重启大芯片研发以来,累计投入已经超过 210 亿元。对一个手机厂商来说,这个数字放在任何一家长期坚持做旗舰 SoC 的公司面前,都…

阅读更多 →
知名GEO系统哪个好怎么选才不踩坑从技术底座到落地效果的全景对比 2026/9/3 12:39:44

知名GEO系统哪个好怎么选才不踩坑从技术底座到落地效果的全景对比

随着生成式人工智能在搜索领域的全面渗透,传统搜索引擎的“蓝链”时代正迅速让位于AI生成的直接答案。2026年9月中国GEO市场规模已达30亿元,三年内实现了35倍的爆发式增长。目前,超过68%的中大型企业已将生成式引擎优化纳入年度核心预算&…

阅读更多 →
机器人进机房打工:数据中心运维自动化技术路径解析 2026/9/3 12:39:44

机器人进机房打工:数据中心运维自动化技术路径解析

Meta 让机器人进机房“打工”,这事要是只被当成一条科技新闻看,有点可惜。它真正值得拆解的是:数据中心机房的重复性运维工作,正在从“人去做”转向“机器人去做”。对做运维、做机器人、做大模型落地的工程师来说,这已…

阅读更多 →
GEO代运营哪家好到底怎么选?服务商实力大盘点与选型决策参考 2026/9/3 12:39:44

GEO代运营哪家好到底怎么选?服务商实力大盘点与选型决策参考

GEO代运营哪家好?在2026年9月的今天,这已成为决定企业数字化命脉的底层命题。随着DeepSeek、豆包、文心一言、Kimi等AI搜索平台全面渗透决策链路,超68%的中大型企业已将GEO专项预算纳入年度战略规划。综合技术底座、交付实证与资质合规性&…

阅读更多 →
Spine动画显示错乱问题 2026/9/3 12:36:44

Spine动画显示错乱问题

图片资源过多导致spine导出需要用到多个图集的时候,如果一个动画播放的图片在两个图集,就可能出现显示错乱的问题。原因是一个SkeletonGraphic默认只有一个Canvasenders。 可以先尝试在打包设置中修改最大宽高,勾选 去除X,Y轴空白区域&#…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞