Как открыть приложение галереи по умолчанию с определенным альбомом или папкой для Android Q?

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

fun openDirectoryInGallery(context: Context, directory: String) {
        val intent = Intent(Intent.ACTION_VIEW)
        val file = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
            File(Environment.getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_PICTURES), directory)
        } else {
            File(Environment.DIRECTORY_PICTURES.plus(File.separator).plus(directory))
        }

        intent.setDataAndType(Uri.withAppendedPath(Uri.fromFile(file), directory), "*/*")
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        startActivity(context, Intent.createChooser(intent, "Open folder"), Bundle())
    }

person Vishal Patoliya ツ    schedule 03.01.2020    source источник
comment
Я не совсем уверен, позволяет ли он открывать определенную папку в галерее, поскольку в списке будет несколько приложений с намерением выбора, и возможно, что ни одно из них не сможет обработать намерение открыть определенную папку. Я бы посоветовал вам отсканировать эту папку и создать свой собственный вид галереи. Таким образом, он будет одинаковым на всех устройствах.   -  person Shivam Pokhriyal    schedule 03.01.2020
comment
@ShivamPokhriyal Я нашел решение, но оно не работает #44858906" title="как открыть приложение галереи по умолчанию с определенным альбомом или папкой"> stackoverflow.com/questions/44858799/   -  person Vishal Patoliya ツ    schedule 03.01.2020
comment
то, что решение работает на 2017, не означает, что оно работает и на 2020.   -  person KuLdip PaTel    schedule 03.01.2020
comment
Как я уже упоминал, этот подход не гарантирует, что приложение галереи откроет указанную вами папку. Подумайте об этом так: предположим, вы создали приложение-галерею, которое будет отображать все фотографии на вашем мобильном телефоне, и какой-то другой разработчик хочет открыть определенную папку в галерее и использует вышеуказанное намерение. Теперь ваше приложение также будет указано в намерении выбора, но вы не обработали намерение показать конкретную папку. Если выбрано ваше приложение, оно покажет все фотографии. Вот почему я посоветовал вам создать собственную галерею, так как это может быть несовместимо со всеми устройствами.   -  person Shivam Pokhriyal    schedule 03.01.2020
comment
Я надеюсь, что эта ссылка может помочь вам. stackoverflow.com/questions/13418807/   -  person Shivam Pokhriyal    schedule 03.01.2020


Ответы (2)


Никогда не было поддержки для этого в ОС. Это вопрос установленных приложений на устройстве.

Никогда не было требования, чтобы на устройстве было приложение галереи, способное отвечать на ACTION_VIEW для каталога.

Ваше приложение должно давать сбой с FileUriExposedException на Android 7.0+, и наличие этого исключения является причиной того, что все меньше и меньше приложений заботятся о поддержке схемы file.

В Android 10+ схема fileUri.fromFile() по расширению) просто бессмысленна, как будто ваше приложение может получить доступ к файлу, а другие приложения не могут.

Наконец, Environment.DIRECTORY_PICTURES.plus(File.separator).plus(directory) не является допустимым путем файловой системы.

person CommonsWare    schedule 03.01.2020
comment
Похоже, отличный ответ, не могли бы вы помочь мне сделать вывод, можем ли мы перейти к галерее в определенную папку на Android Q и Prior OS? - person Vishal Patoliya ツ; 03.01.2020
comment
На любой версии Android нет надежного способа сделать это. А на Android 10+ вы понятия не имеете, существует ли вообще нужная вам папка. Если вы хотите продолжать использовать свой ненадежный код, вам нужно, чтобы пользователь выбирал папку через ACTION_OPEN_DOCUMENT_TREE, а затем молился, чтобы на устройстве было приложение-галерея, поддерживающее ACTION_VIEW из content Uri, которое указывает на дерево, а не на часть контента. . - person CommonsWare; 03.01.2020
comment
Не могли бы вы дать ссылку на DocumentsContract.EXTRA_INITIAL_URI? В настоящее время передается uri в формате file://... в этом параметре, но он не перемещается внутри папки с изображениями, требуется ли какой-либо другой формат Uri для вышеуказанного параметра? - person Vishal Patoliya ツ; 04.01.2020
comment
@VishalPatoliyaツ: В настоящее время в этом параметре передается uri в формате file://..., но он не перемещается внутри папки с изображениями - ну, конечно. DocumentsContract предназначен для Storage Access Framework, а не для файлов. Требуется ли какой-либо другой формат Uri для вышеуказанного параметра? -- это должен быть Uri, который вы получили от Storage Access Framework, например ACTION_OPEN_DOCUMENT. Не могли бы вы дать справочную ссылку -- developer.android.com/reference/android/ провайдер/ - person CommonsWare; 04.01.2020
comment
Спасибо за ответ, но структура доступа к хранилищу исходит от Android Q, но мой вопрос все еще остается открытым с предшествующей версией Android Q. - person Vishal Patoliya ツ; 04.01.2020
comment
@VishalPatoliyaツ: Платформа доступа к хранилищу взята из Android Q — платформа доступа к хранилищу существует с Android 4.4. - person CommonsWare; 04.01.2020

person    schedule
comment
Не отвечает на вопрос. OP хочет открыть определенную папку в галерее, а не всю галерею. - person Shivam Pokhriyal; 03.01.2020
comment
@ShivamPokhriyal прав, это не решит проблему. И нетерпеливый принц, пожалуйста, поймите вопрос, предоставленное вами решение позволит выбрать только файлы изображений, будь то где угодно, но постановка проблемы несколько иная. Кроме того, Если вы не можете объяснить это просто, вы недостаточно хорошо это понимаете - по Эйнштейну Вместо того, чтобы говорить, что это не моя проблема, пожалуйста, приложите усилия, чтобы объяснить вещи. - person Shadow Droid; 03.01.2020