Разница между получением данных через Storage Access Framework и получением контента через Intent.ACTION_GET_CONTENT
В чем принципиальная разница между обращению к файлам на устройстве используя Storage Access Framework:
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "image/*"
startActivityForResult(intent, READ_REQUEST_CODE)
И вот таким кодом:
val intent = Intent()
intent.type = "image/*"
intent.action = Intent.ACTION_GET_CONTENT
startActivityForResult(Intent.createChooser(intent, "Select Picture"), READ_REQUEST_CODE)}
Я попробовал оба метода и визуальный результат одинаковый. Очень хочется понимать чем первый способ лучше второго.
Ответы (2 шт):
ACTION_GET_CONTENT- работает с API=1ACTION_OPEN_DOCUMENT- введен с API=19 (одновременно с SAF)
Если у вас targetSdk >=19, то оба Intentа будут работать одинаково, если нет, то 2-й не будет работать, только 1-й.
В совсем старых Android'ах ACTION_GET_CONTENT ничего не вызывал и надо было самому лепить Activity, который его обрабатывал. Были популярные либы, в которых был реализован обработчик ACTION_GET_CONTENT - например как такой
В Android версии 4.3 и ниже для того, чтобы приложение могло получать файл от другого приложения, оно должно активизировать намерение, например, ACTION_PICK или ACTION_GET_CONTENT. После этого пользователь должен выбрать какое-либо одно приложение, чтобы получить файл, а оно должно предоставить пользователю интерфейс, с помощью которого он сможет выбирать и получать файлы.
Начиная с Android 4.4 и выше, у разработчика имеется дополнительная возможность — намерение ACTION_OPEN_DOCUMENT, которое отображает пользовательский интерфейс элемента выбора, управляемого системой. Этот элемент предоставляет пользователю обзор всех файлов, доступных в других приложениях. Благодаря этому единому интерфейсу, пользователь может выбрать файл в любом из поддерживаемых приложений.
Намерение ACTION_OPEN_DOCUMENT не является заменой для намерения ACTION_GET_CONTENT. Разработчику следует использовать то, которое лучше соответствует потребностям приложения:
- используйте
ACTION_GET_CONTENT, если приложению нужно просто прочитать или импортировать данные. При таком подходе приложение импортирует копию данных, например, файл с изображением. - используйте
ACTION_OPEN_DOCUMENT, если приложению нужна возможность долговременного, постоянного доступа к документам, принадлежащим поставщику документов. В качестве примера можно назвать редактор фотографий, позволяющий пользователям обрабатывать изображения, хранящиеся в поставщике документов.