.NET MAUI中如何通过用户选择的Android Uri读写文件流?
在MAUI中通过Android Uri写入文件的问题与解决办法
我在MAUI中实现了SaveFileAsync方法,需要将Stream中的文件内容写入用户选择的文件。按照Android文件选择流程获取到Java Uri后,尝试用以下代码写入时失败:
public partial async Task SaveFileAsync(string name, Stream stream) { const int SaveFileCode = 300; var intent = new Intent(Intent.ActionCreateDocument); intent.AddCategory(Intent.CategoryOpenable); intent.SetType("application/pdf"); intent.PutExtra(Intent.ExtraTitle, name); var (resCode, data) = await ActivityResultService.Instance.StartActivityForResultAsync(intent, SaveFileCode); if (resCode != Android.App.Result.Ok || data is null) { return; } var path = data.Data?.Path; ArgumentNullException.ThrowIfNull(path); using var outStream = new FileStream(path, FileMode.Create); await stream.CopyToAsync(outStream); }
抛出异常:
Could not find a part of the path '/document/raw:/storage/emulated/0/Download/test.pdf'.
目前只能用Java API临时替代,想问有没有办法通过Android Uri创建Stream来完成文件读写?
可行解决方案:使用ContentResolver的OpenOutputStream
通过Android的ContentResolver.OpenOutputStream方法可以直接通过Uri获取输出流,完成写入操作,代码如下:
public partial async Task SaveFileAsync(string name, Stream stream) { const int SaveFileCode = 300; var intent = new Intent(Intent.ActionCreateDocument); intent.AddCategory(Intent.CategoryOpenable); intent.SetType("application/pdf"); intent.PutExtra(Intent.ExtraTitle, name); var (resCode, data) = await ActivityResultService.Instance.StartActivityForResultAsync(intent, SaveFileCode); if (resCode != Android.App.Result.Ok || data is null) { return; } var uri = data.Data; ArgumentNullException.ThrowIfNull(uri); var activity = Platform.CurrentActivity; ArgumentNullException.ThrowIfNull(activity?.ContentResolver); using var outStream = activity.ContentResolver.OpenOutputStream(uri); ArgumentNullException.ThrowIfNull(outStream); await stream.CopyToAsync(outStream); }
内容的提问来源于stack exchange,提问作者Luke Vo
相关产品推荐
相关产品推荐

