我的目标我正在编写一个应用,并且我希望它通过单击它们来打开具有自定义扩展名的文件(例如“ .zzz”)...例如,在android文件浏览器上。我正在使用Android 8或>。这里一个重要的细节是与我的自定义扩展名没有关联的没有哑剧。
到目前为止我学到的东西。到目前为止,如果我在过滤器中声明了通配符DataMimeType =“ * / *”,则可以打开“ .zzz”文件。这使我可以进行一些检查...例如,当我从系统浏览器中选择文件时,我得到了以下URI(来自Intent.Data)
content:// 0 @ media / external / file / ###
其中###是一些序列号,例如2347,是一种文件ID。注意,没有扩展名。毫不奇怪,没有哑剧,对于“ .zzz”文件,Intent.Type只是null(但是对于已知类型,我得到正常结果,对于“ .txt”,我得到“文本/纯文本”等)。然后,我尝试使用或不带DataHost =“ *”等添加各种DataPathPatterns,但是没有任何效果。看起来这里只是完全忽略了该模式。从某种程度上讲,这并不奇怪,因为扩展名不存在!当然,确实可以访问真实的文件名(具有很好的zzz扩展名),但是我只能通过对ContentResolver进行查询来检索它。
总而言之,我的问题是此过滤器未过滤任何内容,并且我的应用程序已注册为一种通用处理程序。我花了一整天阅读有关类似问题的帖子,但没有明确的答案:是否可能无法正确过滤带有未注册扩展名的文件,例如“ .zzz”?我敢肯定,较早的android版本和“ file:” URIs都是可能的,但是现在呢?我不希望我的应用程序弹出作为任何文件类型的处理程序...一种解决方案是注册与“ .zzz”相关的新的自定义mime,但是我对此一无所知,可以做到这一点吗?全部吗?
代码。我发布了一些代码:这是我在MainActivity.cs
中声明的过滤器[IntentFilter(
new[] { Intent.ActionView },
Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
DataSchemes = new[] { "file", "content" },
DataMimeType = "*/*"
// some stuff I tried in all possible combinations...
// DataHost = "*",
// DataPathPattern = "*.\\.zzz"
// DataPathPattern = "*.\\..*\\.zzz"
// DataPathPattern = "*.\\..*\\..*\\.zzz"
// etc...
// yes, I tried also just the pattern w/o MimeType.
)]
由于我浪费了很多时间试图弄清楚如何获取小zzz文件的内容和真实文件名,因此我在此处发布了代码:也许对某人有用,并且/或者您可以提出改进建议
Android.Net.Uri fileUri = Intent.Data;
MemoryStream ms = new MemoryStream();
var input = this.ContentResolver.OpenInputStream(fileUri);
input.CopyTo(ms);
input.Close();
String datastr = System.Text.Encoding.Default.GetString(ms.ToArray());
var cursor = this.ContentResolver.Query(fileUri,
new string[] { "_display_name" }, null, null, null);
cursor.MoveToFirst();
String realfilename = cursor.GetString(0);