Как отфильтровать расширение, которое не имеет зарегистрированного MIME? - PullRequest
0 голосов
/ 05 мая 2019

Моя цель Я пишу приложение и хочу, чтобы оно открывало файлы с пользовательским расширением (скажем, ".zzz"), щелкая их ... например, в браузере файлов Android. Я работаю на Android 8 или>. Важной деталью здесь является то, что нет пантомимы , связанной с моим пользовательским расширением.

Что я узнал до сих пор . До сих пор я могу открыть файл «.zzz», если в моем фильтре объявлен подстановочный знак DataMimeType = "* / *". Это позволило мне сделать некоторые проверки ... например, когда я выбираю файл в системном браузере, я получаю следующий URI (из Intent.Data)

Содержание: // 0 @ медиа / внешний / файл / ###

где ### - это порядковый номер, скажем 2347, своего рода идентификатор файла. Обратите внимание, без расширения. Неудивительно, что mime также отсутствует, а Intent.Type для файлов ".zzz" просто нулевой (но я получаю нормальные результаты для известных типов, "text / plain" для ".txt" и т. Д.). Затем я попытался добавить все виды DataPathPatterns, с или без DataHost = "*" и т. Д., Но ничего не работает. Похоже, шаблон здесь просто полностью игнорируется. В некоторой степени это не удивительно, поскольку расширение просто отсутствует! Конечно, к истинному имени файла (с его хорошим расширением zzz) действительно можно получить доступ, но я мог только получить его, сделав запрос к ContentResolver.

В заключение, моя проблема в том, что этот фильтр ничего не фильтрует, и мое приложение зарегистрировано как своего рода универсальный обработчик. Я провел целый день, читая сообщения о похожих проблемах, но не получил однозначного ответа: возможно ли, что файл с незарегистрированным расширением, например ".zzz", не может быть отфильтрован должным образом ?! Я уверен, что это было возможно с более старыми версиями Android и с "file:" URIs ... но сейчас? Мне не нравится, чтобы мое приложение отображалось как обработчик для любого типа файла ... Одним из решений было бы зарегистрировать новый пользовательский mime, связанный с ".zzz", но я понятия не имею об этом, можно ли это сделать в все

код . Выкладываю некоторый код: вот мой фильтр, объявленный в 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);
...