Как создать общую папку / файл в Android 10

В Android Api 29 внесены большие изменения в отношении файлов и папок. Я пока не нашел способа создать общедоступную папку во внутреннем хранилище. Каждую папку, которую я создаю, может видеть только мое приложение.

Я пишу приложение, которое создает файлы данных, которые будут использоваться другими приложениями, например Total Commander, чтобы скопировать их в место назначения. Все работало нормально, пока я не активировал Api 29. Некоторые из моих клиентов ДЕЙСТВИТЕЛЬНО используют пиксельные телефоны, и они используют Android 10.

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

Это устарело:

Environment.getExternalStorageDirectory();
Environment.getExternalStoragePublicDirectory(type);

и когда я использую

File root = context.getExternalFilesDir(null);

Созданные файлы могут видеть только мое приложение. Как добиться того же поведения, которое действовало до Android 10?

Заранее спасибо.


person Grisgram    schedule 11.10.2019    source источник
comment
Используйте ACTION_OPEN_DOCUMENT_TREE или ACTION_OPEN_DOCUMENT. С их помощью вы можете получить доступ ко всем внешним хранилищам, как внутренним, так и к карте microSD. Жизнь хороша.   -  person blackapps    schedule 11.10.2019
comment
@blackapps с этими двумя действиями пользователю предоставляется открытый диалог? Есть ли способ получить доступ (чтение / запись) без открытого диалогового API 29/30   -  person MindRoasterMir    schedule 08.09.2020
comment
Нет, нет. Пользователь вызывается с помощью этих действий.   -  person blackapps    schedule 08.09.2020


Ответы (2)


когда я использую File root = context.getExternalFilesDir(null); Созданные файлы могут быть видны только моему приложению

Их может увидеть любое приложение, использующее Storage Access Framework (например, ACTION_OPEN_DOCUMENT), если пользователь выбирает документ, который вы помещаете в этот каталог.

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

Другие приложения не имеют доступа к внешнему или съемному хранилищу на Android 10, за исключением ограниченных каталогов, таких как getExternalFilesDir(), или через средства, не связанные с файловой системой (ACTION_OPEN_DOCUMENT, MediaStore).

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

Используйте getExternalFilesDir() и связанные методы на Context. Или используйте ACTION_CREATE_DOCUMENT или ACTION_OPEN_DOCUMENT_TREE и используйте Storage Access Framework. В любом случае полученные документы могут использоваться другими приложениями, которые также используют Storage Access Framework.

person CommonsWare    schedule 11.10.2019
comment
Спасибо. Я создал его сейчас, используя системный интерфейс с этими действиями. - person Grisgram; 13.11.2019
comment
@CommonsWare, как приложения telgram / whatsapp и т. Д. Могут создавать папки во внешнем хранилище? - person Ashish singh; 13.08.2020
comment
@Ashishsingh: Вероятно, они используют android:requestLegacyExternalStorage = "true" - person CommonsWare; 13.08.2020
comment
@CommonsWare: проверено в исходном коде Telegram, у них TargetSDKVersion = 28 вместо android: requestLegacyExternalStorage = true - person Ashish singh; 13.08.2020
comment
@Ashishsingh: Их нужно будет изменить очень скоро, иначе они больше не смогут распространять обновления в Play Store. - person CommonsWare; 13.08.2020
comment
@CommonsWare У меня есть API 30 - я создаю приложение для чтения pdf с помощью barteksc: android-pdf-viewer, и я не могу открыть pdf с помощью pdfViewer.formFile () из папки загрузки, потому что API 30 не дает доступа к внешнему хранилищу . Означает ли это, что пользователь должен всегда выбирать файл pdf, чтобы открыть его? Теперь вменяемо от гугла? - person MindRoasterMir; 08.09.2020
comment
@MindRoasterMir: Означает ли это, что пользователь всегда должен выбирать файл pdf, чтобы его открыть? - ну, в идеале, вы позволяете пользователю выбирать, где находится PDF-файл. В конце концов, это телефон пользователя и его PDF-файл. Означает ли это, что пользователь должен всегда выбирать файл pdf, чтобы открыть его? - Что касается конкретно Downloads/, я думаю, что да. Хотя мы восстановили доступ для чтения к частям внешнего хранилища, я думаю, что этот конкретный каталог по-прежнему показывает нам только наши собственные файлы, а не файлы, помещенные туда другими приложениями. - person CommonsWare; 08.09.2020
comment
@CommonsWare Спасибо за ответ. Еще я пробовал создать папку, где есть загрузки. Невозможно только с кодом. Если я создам его с помощью ACTION_CREATE_DOCUMENT, могу ли я получить к нему доступ из кода? без принуждения пользователя к открытию с открытым диалогом? - person MindRoasterMir; 08.09.2020
comment
@CommonsWare и с файлом PDF я хочу создать приложение только для одной книги в формате PDF и хочу, чтобы пользователь мог читать книгу после открытия приложения, а не заставлять его открывать документ. Он работает из ресурсов, но я хочу, чтобы приложение оставалось маленький по размеру и загрузите книгу в формате pdf при первом использовании, а затем позвольте пользователю использовать ее позже. - person MindRoasterMir; 08.09.2020
comment
@MindRoasterMir: Ну, ACTION_CREATE_DOCUMENT показывает диалог. Если вы спрашиваете, можно ли избежать второго диалога, тогда да, это должно сработать. Используйте takePersistableUriPermissions() на ContentResolver с Uri, которое вы получаете от ACTION_CREATE_DOCUMENT. загрузите книгу в формате pdf при первом использовании - гм, загрузите ее самостоятельно на getFilesDir(), и вам не придется беспокоиться ни о каких других проблемах. - person CommonsWare; 08.09.2020
comment
@CommonsWare кажется интересным. вот мой вопрос, если вы отправите мне ответ с небольшим примером кода, я приму его как ответ, спасибо. Я собираюсь попробовать это . stackoverflow.com/questions/63787884/ - person MindRoasterMir; 08.09.2020
comment
@CommonsWare загрузите его самостоятельно в getFilesDir (), у вас есть пример? Мне удалось загрузить pdf только с помощью DownloadManager, и он позволяет мне загружать только в общедоступных каталогах, то есть в Загрузках. - person MindRoasterMir; 08.09.2020
comment
@MindRoasterMir: используйте OkHttp: stackoverflow.com/a/29012988/115145 - person CommonsWare; 08.09.2020
comment
@MindRoasterMir. Я дам ему попробовать. и трюк с persistantUripermission после первого открытия с открытым диалогом работает. Спасибо - person MindRoasterMir; 08.09.2020
comment
@MindRoasterMir, исходный код Telegram открыт github.com/DrKLO/Telegram - person Ashish singh; 09.09.2020

Начиная с Android 10, вы должны использовать SAF и позволить пользователю выбирать каталог с помощью ACTION_OPEN_DOCUMENT_TREE.

Если нужен простой пример. Вы можете найти его здесь

В качестве альтернативы вы можете использовать requestLegacyExternalStorage = true в манифесте, если ваше приложение еще не выпущено. Но это то, что не следует использовать для будущих выпусков, так как это краткосрочное решение, предоставленное Google.

Примечание. В будущих версиях Android пользователь не сможет выбрать весь каталог внешних файлов и каталог загрузок, поэтому, к сожалению, имейте в виду, что у нас не будет доступа и к ним! Для получения дополнительной информации нажмите здесь

person Khamidjon Khamidov    schedule 21.06.2020
comment
Но если я использую ACTION_OPEN_DOCUMENT_TREE в android 10, он говорит, что никакие приложения не могут выполнять это действие: / - person Numan Karaaslan; 24.07.2020
comment
попробуйте приведенный мною пример. Тогда ты должен понять - person Khamidjon Khamidov; 25.07.2020
comment
Я пробовал API 29 и 30. requestLegacyExternalStorage = true у меня не сработал. используя action_open_document_tree, вы также можете использовать getContentResolver (). takePersistableUriPermission (), спасибо - person MindRoasterMir; 09.09.2020