Как открыть внешний / общий каталог хранилища моего приложения

#android #file #directory #file-browser

#Android #файл #каталог #файловый браузер

Вопрос:

У меня есть уведомление, отображающее ход загрузки файла. По завершении нажатие на него должно открыть каталог, в котором был сохранен файл (каталог внешнего хранилища моего приложения). Намерение настраивается следующим образом и позже передается в PendingIntent.

 val dir = getExternalFilesDir("storage")
val intent = Intent(Intent.ACTION_VIEW)
intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
intent.data = FileProvider.getUriForFile(context, authority, dir)
intent.type = DocumentsContract.Document.MIME_TYPE_DIR
  

Что на самом деле происходит — открывается проводник, но вместо этого отображается «Недавний» каталог (?).

Что еще я пробовал:

  • передача абсолютного пути вместо URI содержимого, но это не имеет никакого значения
  • установив значение «/«, он затем предоставляет выбор, с помощью какого приложения открывать каталог, но результат в конечном итоге тот же — «Недавний»
  • вместо этого используйте намерение ACTION_OPEN_DOCUMENT, чтобы узнать, есть ли у него такая же проблема, и да, он также указывает на «Недавний»

Примечание: FileProvider настроен просто отлично, uri, переданный в данные намерения, является правильным. Также обратите внимание: я хочу избежать сохранения этих файлов в «Загрузках», если это возможно.

Ответ №1:

По завершении нажатие на него должно открыть каталог, в котором был сохранен файл (каталог внешнего хранилища моего приложения).

Это никогда не было особенностью Android.

Намерение настраивается следующим образом и позже передается в PendingIntent.

FileProvider не поддерживает каталоги. ACTION_VIEW по умолчанию каталоги не поддерживаются, хотя некоторые файловые менеджеры могут. DocumentsContract не имеет никакого отношения к FileProvider .

передача абсолютного пути вместо URI содержимого, но это не имеет никакого значения

Это должно привести к сбою вашего приложения с FileUriExposedException помощью .

Комментарии:

1. 1. Чтобы было ясно, под «должен» я просто подразумеваю, что это желаемый результат. 2. DocumentsContract указывает mime-тип каталога, поэтому intent автоматически открывает приложение File Explorer вместо представления выбора приложений. 3. Это не так…

2. @Serge: «DocumentsContract указывает тип mime каталога, поэтому он автоматически открывает приложение File Explorer» — только для устройств с приложением «file Explorer», которое обращает внимание на этот тип MIME. Существуют десятки тысяч моделей устройств Android. Сколько вы планировали протестировать? Это также не меняет того факта, что FileProvider не поддерживает каталоги.

3. Я слышал этот аргумент раньше, но пока, похоже, это не было проблемой, плюс все источники были довольно старыми, это все еще проблема в наши дни?

4. @Serge: я бы не стал считать ACTION_VIEW надежным для любого типа MIME на любом устройстве. Даже для такой простой вещи, как «открыть браузер», у вас возникают проблемы (например, пользователь не имеет доступа к веб-браузеру из-за работы в ограниченном профиле или из-за политики владельца устройства). Я бы никогда не предположил, что ACTION_VIEW для неофициального типа MIME будет работать и vnd.android.document/directory является неофициальным . Производители устройств могут делать то, что хотят.

5. Что вы имеете в виду, когда FileProvider не поддерживает каталоги? Он используется только для получения uri (содержимого) каталога, который, как я отметил в сообщении, предоставляется просто отлично. uri не поддерживает каталоги?