ACTION_GET_CONTENT Намерение не показывать внешнее хранилище

Я реализую функцию импорта для моего приложения для Android. Я хотел позволить пользователю выбирать файлы, которые они хотят импортировать, из внешнего хранилища на своем устройстве (точнее, в каталоге загрузок) и других онлайн-хранилищ, таких как DropBox и Google Drive.

Я реализовал его и протестировал на эмуляторе и двух устройствах Android. Когда я тестировал его на эмуляторе Android версии 6.0, поскольку на нем не установлены DropBox и GoogleDrive, я вижу то, что ожидаю, - возможность выбрать файл из каталога Downloads: введите описание изображения здесь

Когда я тестировал его на телефоне Google Pixel, Android версии 7.1.2, все работало так, как я ожидал. Я могу выбрать файл из каталога загрузок, Google Drive и DropBox: введите описание изображения здесь

Однако, когда я тестировал его на устройстве Samsung Galaxy 4, Android версии 5.0.1, я смог выбрать файл из Google Drive и Dropbox, но у меня нет возможности выбрать файл из каталога загрузок.: введите описание изображения здесь

Это мой код для выбора файла:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("text/*");
startActivityForResult(intent, GET_FILE_RESULT_CODE);

Пожалуйста, дайте мне знать, что я могу сделать, чтобы решить эту проблему. Спасибо!

2 ответа

Решение

В итоге я использовал ACTION_OPEN_DOCUMENT, который добился цели. Теперь я могу выбрать файл из моего внешнего хранилища для Android 5.0.1.

Однако ACTION_OPEN_DOCUMENT поддерживается только для API 19 и выше.

Так вот что я сделал:

if (Build.VERSION.SDK_INT >= 19) {
                Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                intent.setType("text/*");
                intent.addCategory(Intent.CATEGORY_OPENABLE);
                startActivityForResult(intent, GET_FILE_RESULT_CODE);
            }
            else {
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("text/*");
                intent.addCategory(Intent.CATEGORY_OPENABLE);
                startActivityForResult(intent, GET_FILE_RESULT_CODE);
            }

Надеюсь, это может помочь кому-то, кто сталкивается с той же проблемой. Пожалуйста, дайте мне знать, если кто-нибудь выяснит, почему я не могу получить ACTION_GET_CONTENT для выбора из внешнего хранилища для Android 5.0.1. Спасибо!

Чтобы приложение DocumentsActivity отображалось вместе с другими поставщиками контента, такими как Dropbox и ASTRO File Manager в версиях Android>= = KITKAT, необходимо всегда вызывать

    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("*/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE)

Чтобы установить соответствующий тип MIME, вы должны позвонить putExtra() с именем строки Intent.EXTRA_MIME_TYPES и массив типов MIME. С другой стороны, для версий Android до KITKAT вам необходимо определить тип MIME напрямую при вызове setType(),

Я не мог найти ничего об этом в официальной документации, но я проверил это как на JELLY_BEAN, так и на KITKAT, и это работает.

В итоге попробуйте изменить свой код следующим образом:

if (Build.VERSION.SDK_INT >= 19) {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("*/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[]{"text/*"});   
    startActivityForResult(intent, GET_FILE_RESULT_CODE);
}
else {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("text/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    startActivityForResult(intent, GET_FILE_RESULT_CODE);
}
Другие вопросы по тегам