Android: избегайте дублирования записей при поддержке ACTION_GET_CONTENT и ACTION_OPEN_DOCUMENT

http://developer.android.com/guide/topics/providers/document-provider.html заявляет:

ACTION_OPEN_DOCUMENT is not intended to be a replacement for ACTION_GET_CONTENT.
The one you should use depends on the needs of your app:

Use ACTION_GET_CONTENT if you want your app to simply read/import data.
With this approach, the app imports a copy of the data, such as an image file.
Use ACTION_OPEN_DOCUMENT if you want your app to have long term, persistent access
to documents owned by a document provider. An example would be a
photo-editing app that lets users edit images stored in a document provider.

Это означает, что большинство приложений, предоставляющих файлы, должны поддерживать оба типа намерений.

Но когда приложение поддерживает оба ACTION_GET_CONTENT (имея активность, совпадающую с ее в фильтре намерений) и ACTION_OPEN_DOCUMENT (путем реализации провайдера документов), он отображается дважды, например, при присоединении файла к Gmail. Это связано с тем, что интерфейс выбора файлов отображает как поставщиков документов, так и ACTION_GET_CONTENT спички (последний показан ниже под разделителем).

Можно ли избежать этого дублированного показа приложения, чтобы не сбить с толку пользователей?

См. Скриншот ниже и запись Box, отображающуюся дважды для примера проблемы:

Снимок экрана, на котором показана повторяющаяся запись в диалоговом окне

1 ответ

Решение

Немного ниже на той же странице в разделе Поддержка устройств под управлением Android 4.3 и ниже:

ACTION_OPEN_DOCUMENT Намерение доступно только на устройствах под управлением Android 4.4 и выше. Если вы хотите, чтобы ваше приложение поддержало ACTION_GET_CONTENT чтобы приспособить устройства под управлением Android 4.3 и ниже, вы должны отключить ACTION_GET_CONTENT Фильтр намерений в вашем манифесте для устройств под управлением Android 4.4 или выше. Поставщик документов и ACTION_GET_CONTENT следует считать взаимоисключающими. Если вы поддерживаете их обоих одновременно, ваше приложение будет дважды отображаться в интерфейсе средства выбора системы, предлагая два различных способа доступа к вашим сохраненным данным. Это будет сбивать с толку пользователей.

Раздел, на который вы ссылаетесь, находится на стороне клиента - приложения, подключающиеся к вашему DocumentsProvider можно использовать как ACTION_GET_CONTENT а также ACTION_OPEN_DOCUMENTтак что вам больше не нужен ACTION_GET_CONTENT Интент-фильтр или активность на устройствах Android 4.4 и выше.

Они предлагают создать bool ресурсы на основе кода версии (т. е. в values-v19), что позволит вам изменить android:enabled значение в манифесте, отключение или включение компонентов в зависимости от версии Android.