Как проверить, есть ли приложение, которое может открыть определенный файл - PullRequest
0 голосов
/ 11 января 2019

В данный момент я застрял в этой ситуации, и, похоже, по этому конкретному вопросу не задают никаких вопросов.

Я пытаюсь открыть файл .txt после загрузки, и я хочу проверить, есть ли у пользователя приложение, которое сможет открыть этот файл, до его фактической загрузки.

На моем эмулированном телефоне с API 26 есть встроенный редактор HTML, который может открывать текстовые файлы, а также приложение браузера Chrome.

Я уже впервые открыл эти приложения на случай, если это может помешать, и я до сих пор не могу заставить это работать.

Чтобы проверить, можно ли открыть файл, я использую следующий метод:

getPackageManager().queryIntentActivities(intent, 0);

И это никогда не работает, оно всегда возвращает 0 действий, но как только я устанавливаю специальный текстовый редактор, он возвращается в запросе, но только один. Однако, как только я перехожу к меню приглашения, в нем перечислены 3 способа открытия текстового файла: браузер Chrome, редактор HTML и текстовый редактор.

Таким образом, он распознает браузер Chrome и HTML-редактор как способный читать файлы .txt во время запроса, но запрос явно не может этого сделать.

Вот как я строю Намерение:

intent = new Intent(Intent.ACTION_VIEW);
intent.setType(fileExtension); // this can be a String .txt .pdf etc

Как я могу узнать, существуют ли на самом деле приложения, способные открывать файл, когда queryIntentActivities явно не работает правильно?

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Я не знаю, намеренно ли вы пропустили URI или нет (setData()), но без него он не будет работать должным образом.

Кроме того, без URI это также может отличаться для разных устройств, потому что с вашим кодом на моих устройствах я даже не вижу Chrome и HTML-редактор, независимо от того, был ли я до или после текстового редактора. Да, это странно.

В любом случае, придерживаясь своего кода, просто добавьте dummy uri , и вы сможете получить все нужные приложения:

Uri uri = Uri.parse("content://dummy");
intent.setDataAndType(uri, "text/plain");

Но если у вас есть действительный URI до проверки этого решения, я не вижу вашей проблемы. Поддельный URI или нет, я могу видеть все приложения, которые могут справиться с этим.

Sidenote: с действительным URI рекомендуется использовать FileProvider сейчас, см .:

0 голосов
/ 11 января 2019

Я не уверен, почему queryIntentActivities каждый раз возвращает 0 результатов, если честно. Вы пробовали другой подход? Попробуйте удалить приложение текстового редактора, а затем посмотрите, вернет ли это правильное значение:

if (intent.resolveActivity(getPackageManager()) == null) {
    // Nothing can handle this intent
}
else{
    // Something actually can
}
...