.NET MAUI如何从外部存储加载图片至Image组件?
解决方案
针对.NET MAUI Android平台无法从应用私有存储加载图片的问题,提供以下几种可行替代方案:
方案1:使用文件流加载(最简单的替代方式)
绕过ImageSource.FromFile的底层兼容性问题,直接读取文件流创建ImageSource:
protected override void OnAppearing() { base.OnAppearing(); var filePath = Path.Combine(FileSystem.AppDataDirectory, "test.jpg"); if (File.Exists(filePath)) { using var fileStream = File.OpenRead(filePath); MyImage.Source = ImageSource.FromStream(() => fileStream); } }
方案2:平台特定代码(Android原生加载)
利用Android原生API处理图片,再转换为MAUI支持的ImageSource,彻底绕开跨平台API的问题:
protected override void OnAppearing() { base.OnAppearing(); MyImage.Source = LoadPrivateStorageImage("test.jpg"); } private ImageSource LoadPrivateStorageImage(string fileName) { #if ANDROID var androidFilePath = Path.Combine(Android.App.Application.Context.FilesDir.AbsolutePath, fileName); if (!File.Exists(androidFilePath)) return null; var bitmap = Android.Graphics.BitmapFactory.DecodeFile(androidFilePath); using var stream = new MemoryStream(); bitmap.Compress(Android.Graphics.Bitmap.CompressFormat.Jpeg, 100, stream); stream.Position = 0; return ImageSource.FromStream(() => stream); #else var filePath = Path.Combine(FileSystem.AppDataDirectory, fileName); return File.Exists(filePath) ? ImageSource.FromFile(filePath) : null; #endif }
方案3:第三方库SkiaSharp实现
SkiaSharp是跨平台图形处理库,对图片加载的兼容性更强,需先安装SkiaSharp.Views.Maui NuGet包:
using SkiaSharp; protected override void OnAppearing() { base.OnAppearing(); var filePath = Path.Combine(FileSystem.AppDataDirectory, "test.jpg"); if (File.Exists(filePath)) { using var skBitmap = SKBitmap.Decode(filePath); using var stream = new MemoryStream(); skBitmap.Encode(SKEncodedImageFormat.Jpeg, 100).SaveTo(stream); stream.Position = 0; MyImage.Source = ImageSource.FromStream(() => stream); } }
额外说明
- 应用私有存储(
FileSystem.AppDataDirectory)属于应用专属空间,不需要申请READ_EXTERNAL_STORAGE或READ_MEDIA_IMAGES权限,可从AndroidManifest.xml中移除这些不必要的配置。 - 上述方案均规避了
ImageSource.FromFile在Android平台的已知兼容性问题,无需使用FilePicker工具。
内容的提问来源于stack exchange,提问作者dpant
相关产品推荐
相关产品推荐

