Кілька типів MIME в Android


75

Чи є спосіб використовувати intent.setType()та поставити кілька широких типів (наприклад, зображення та відео)?

Я використовую ACTION_GET_CONTENT. Здається, це працює лише з типами, розділеними комами.


1
Не могли б ви бути більш конкретними. setType () на ... що? З якою метою та метою? І т. Д.
CommonsWare

Ви вже знайшли спосіб зробити це?
Рохіт Нандакумар,

Відповіді:


124

В Android 4.4 під час використання Storage Access Framework ви можете використовувати EXTRA_MIME_TYPESдля передачі декількох типів mime.

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
String[] mimetypes = {"image/*", "video/*"};
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
startActivityForResult(intent, REQUEST_CODE_OPEN);

7
Це не працює в Android 7.0. Показує лише відео.
годинник

@clocksmith Здається, це добре працює на моєму Nexus 9 з Android 7.0.
Steve M

Здається, @clocksmith чудово працює і на емуляторі Android 7.0. Чи є конкретний випадок, який не працює? Здається, це правильна відповідь, оскільки вона є частиною офіційного API.
Steve M

Працюй ідеально. Android спосіб фільтрації типів файлів.
Nikhil

2
Зверніть увагу, що EXTRA_MIME_TYPESце не замінює setType. Вам ще потрібен setTypeтакий підхід.
arlomedia

20

Насправді підтримуються кілька типів mime. Ви хоч це пробували ???

Наприклад: intent.setType("image/*,video/*") буде відображати фотографії та відео ...

Для мене це працює. Це теж має працювати для вас ...

[EDIT]: Це працює частково, оскільки не всі програми галереї вирішили реалізувати підтримку фільтрів декількох типів mime.


4
Це рішення працює ... але лише з програмами, що дозволяють використовувати два типи mime. За замовчуванням "Галерея" ні.
Корбелла

1
Насправді це залежить від встановленої вами програми "Галерея". Існують різні версії, які вони поширюються з різними ПЗУ для Android.
bazyle

У мене працює лише в незначних випадках. Вибір тих самих зображень може бути, а може і не. Android 5.0.1
Інгвеландія,

4

Для мене найкраще працювало:

intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);


Ви можете додати кілька типів mime, подібних до цього

intent.setType("image/*|application/pdf|audio/*");

Але засіб вибору намірів відображатиме лише програми, які можуть обробляти зображення, оскільки він перший у рядку типу mime.

Однак, якщо у вас встановлений файловий менеджер (я тестував із файловим менеджером CyanogenMod), ви можете вибрати файл у форматі аудіо, PDF або зображення.

Якщо тип аудіо-mime є першим, ось так:

intent.setType("audio/*|image/*|application/pdf");

Вибір намірів відображатиме лише програми, які обробляють звук.
Знову використовуючи файловий менеджер, ви можете вибрати зображення, PDF або аудіо.


3

На жаль, наразі це не підтримується. У вас є два варіанти:

(1) Використовуйте тип MIME */*і погоджуйтеся, що користувач може вибрати деякі речі, з якими ви не зможете впоратися (і мати для цього гідний шлях відновлення); або

(2) Застосуйте власний засіб вибору активності, роблячи прямі дзвінки на менеджер пакетів, щоб отримати ті дії, які можуть обробляти обидва типи MIME за наміром, об’єднуючи ці списки та відображаючи їх користувачеві.

Крім того, setType()взагалі не працює з типами, розділеними комами. Це повинен бути один і лише один тип MIME.


3
Насправді підтримуються декілька типів mime. Ви хоч це пробували ??? Наприклад: image / *, video / * відображатиме фотографії та відео ...
bazyle

@vchelbanster Кілька типів mime підтримуються не на всіх пристроях. У деяких версіях для Android, таких як <5.0, він вибирає лише перший тип mimeype.
Шивам Похріял

@ShivamPokhriyal Частково згоден - він доступний не для всіх програм. Оскільки програма, яка отримує складений тип наміру, повинна працювати з декількома типами mime, щоб це працювало, не всі додатки (наприклад, додаток галерея) працюватимуть, що може створити враження, що саме від версії ОС залежить. Насправді саме творцю програми потрібно обробляти кілька типів mime. Так що так - це обмежена підтримка. Дивіться мою відповідь.
bazyle

@vchelbanster Так, спочатку мені здалося, що це пов'язано з версією ОС. Пізніше я зрозумів, що якщо на вашому пристрої немає програми, яка обробляє подібні наміри, проблема виникне.
Шівам Pokhriyal

2

ви можете передати кілька типів mime, якщо розділити |

Intent.setType("application/*|text/*");

-3

за мою роботу з крапкою з комою.

Приклад:

intent.setType("image/*;video/*")

або

sIntent.putExtra("CONTENT_TYPE", "image/*;video/*"); 

1
Замість жорстко закодованого рядка "CONTENT_TYPE" ви можете використовувати Intent.EXTRA_MIME_TYPESконстанту. Також замість крапки з комою можна передавати масив рядків.
Фред
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.