Чи є спосіб використовувати intent.setType()
та поставити кілька широких типів (наприклад, зображення та відео)?
Я використовую ACTION_GET_CONTENT
. Здається, це працює лише з типами, розділеними комами.
Чи є спосіб використовувати intent.setType()
та поставити кілька широких типів (наприклад, зображення та відео)?
Я використовую ACTION_GET_CONTENT
. Здається, це працює лише з типами, розділеними комами.
Відповіді:
В 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);
EXTRA_MIME_TYPES
це не замінює setType
. Вам ще потрібен setType
такий підхід.
Насправді підтримуються кілька типів mime. Ви хоч це пробували ???
Наприклад: intent.setType("image/*,video/*")
буде відображати фотографії та відео ...
Для мене це працює. Це теж має працювати для вас ...
[EDIT]: Це працює частково, оскільки не всі програми галереї вирішили реалізувати підтримку фільтрів декількох типів mime.
Для мене найкраще працювало:
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 або аудіо.
На жаль, наразі це не підтримується. У вас є два варіанти:
(1) Використовуйте тип MIME */*
і погоджуйтеся, що користувач може вибрати деякі речі, з якими ви не зможете впоратися (і мати для цього гідний шлях відновлення); або
(2) Застосуйте власний засіб вибору активності, роблячи прямі дзвінки на менеджер пакетів, щоб отримати ті дії, які можуть обробляти обидва типи MIME за наміром, об’єднуючи ці списки та відображаючи їх користувачеві.
Крім того, setType()
взагалі не працює з типами, розділеними комами. Це повинен бути один і лише один тип MIME.
за мою роботу з крапкою з комою.
Приклад:
intent.setType("image/*;video/*")
або
sIntent.putExtra("CONTENT_TYPE", "image/*;video/*");
Intent.EXTRA_MIME_TYPES
константу. Також замість крапки з комою можна передавати масив рядків.