android - 在不使用 StartActivity 的情况下在选择的 Uri 上打开 Stream
问题描述
此代码来自 Xamarin.Forms 项目的 Android 端。我有一个成功选择的文件的 uri 和一个从 uri 创建的流。稍后我想再次从 uri 中读取流,绕过所有挑选的东西,直接进入流。下面的代码有效,但 StartActivity(intent) 会打开一个不想要的文件所在的选择屏幕。
如果我理解正确,您只能在活动上下文中获得“content://”uri 的许可。所以问题是,有没有办法创建一个不打开屏幕但允许读取文件或获取流的可用活动?我什至会选择一种不同的策略来让流脱离“content://”uri。
public async Task<System.IO.Stream> OpenFile(StorageProfile FileToOpen)
{
if (IOUtil.IsMediaStore(FileToOpen.Path)) //If Path starts with "content"
{
var uri = Android.Net.Uri.Parse(FileToOpen.Path);
var mime = IOUtil.GetMimeType(uri.ToString());
var intent = new Intent();
intent.SetAction(Intent.ActionOpenDocument);
intent.SetDataAndType(uri, mime);
intent.SetFlags(ActivityFlags.NewTask);
this.context.StartActivity(intent);
var contentUri = Android.Net.Uri.Parse(FileToOpen.Path);
System.IO.Stream fileStream = Application.Context.ContentResolver.OpenInputStream(contentUri);
return fileStream;
}
else //There is a real path to work with
{
System.IO.Stream fileStream = System.IO.File.OpenRead(FileToOpen.Path);
return fileStream;
}
}
解决方案
推荐阅读
- c++ - QMainWindow 不会在条件块中打开
- python - 如何使用正则表达式从路径中提取文件名
- javascript - 如何使用循环和切片和/或连接在数组的每个索引上插入一个值?
- javascript - 如何让 JavaScript 显示几秒钟的动画 GIF,然后显示图像?
- angular - 打字稿:在地图中使用日期作为键?
- javascript - 使用 Rails webpacker rails-erb-loader 导入 Gem 的 javascript 文件夹
- javascript - javaScript - 更改谷歌日历上位置输入字段的值
- java - 如何在 Java Derby 中获得最后一次插入
- bash - bash 中的条件 GOTO,从一个函数跳到后来调用的函数
- flutter - 如何在 Flutter 中以固定行数显示一个 TextFormField 的最后一行