Выберите любой тип файла через намерение в Android

96

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

В настоящее время я использую (который я скопировал из исходного кода электронной почты Android для прикрепления файлов)

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
Intent i = Intent.createChooser(intent, "File");
startActivityForResult(i, CHOOSE_FILE_REQUESTCODE);

Но он показывает только «Галерея» и «Музыкальный проигрыватель» на моем Galaxy S2. На этом устройстве есть файловый менеджер, и я бы хотел, чтобы он появился в списке. Я также хотел бы, чтобы приложение камеры отображалось в списке, чтобы пользователь мог сделать снимок и отправить его через мое приложение. Если я установлю файловый менеджер Astro, он тоже отреагирует на это намерение. Мои клиенты являются владельцами только Galaxy SII, и я не хочу заставлять их устанавливать файловый менеджер Astro, поскольку у них уже есть базовый, но достаточный файловый менеджер.

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

ErGo_404
источник
Вам понадобится совсем другой код для съемки изображения, чем для выбора файла. На самом деле я не думаю, что большинство обозревателей файлов могут вернуть файл, но я могу ошибаться.
dtech
Можете ли вы указать, к каким файлам нужно обращаться в первую очередь?
subrussn90
1
@dtech: я не ожидаю, что проводник вернет файл, мне нужен только его путь.
ErGo_404
@ subrussn90: мне нужно позволить пользователю выбирать любой тип файла. Это могут быть файлы pdf, .doc, .zip, ЛЮБОЙ формат.
ErGo_404
Достаточно ли получить Uri указанного файла на sd карте ???
subrussn90

Ответы:

89

Не для камеры, а для других файлов ..

В моем устройстве я ES File Explorerустановил, и это просто работает в моем случае ..

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent, PICKFILE_REQUEST_CODE);
user370305
источник
5
Он действительно работает с внешним файловым проводником (таким как ES File Explorer или Astro File Manager, но не с файловым проводником Samsung. Кажется странным, что они не реализовали правильные фильтры намерений для ответа на это действие.
ErGo_404,
@Lukap - используйте файловый менеджер Android с открытым исходным кодом и интегрируйте его со своим приложением, тогда вам не понадобится стороннее приложение.
user370305
2
как мне получить выбранный файл? Я думаю, это путь, но как?
Франсиско Корралес Моралес
1
@FranciscoCorralesMorales - в onActivityResult()- Вы можете получить Uriиз файла.
user370305
1
PICKFILE_RESULT_CODEдолжно быть PICKFILE_REQUEST_CODE.
Арон Лоринц
50

Проводнику Samsung требуется не только настраиваемое действие ( com.sec.android.app.myfiles.PICK_DATA ), но также часть категории (Intent. CATEGORY_DEFAULT ) и mime-тип должны передаваться как дополнительные.

Intent intent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
intent.putExtra("CONTENT_TYPE", "*/*");
intent.addCategory(Intent.CATEGORY_DEFAULT);

Вы также можете использовать это действие для открытия нескольких файлов: com.sec.android.app.myfiles.PICK_DATA_MULTIPLE В любом случае вот мое решение, которое работает на Samsung и других устройствах:

public void openFile(String mimeType) {

        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType(mimeType);
        intent.addCategory(Intent.CATEGORY_OPENABLE);

        // special intent for Samsung file manager
        Intent sIntent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
         // if you want any file type, you can skip next line 
        sIntent.putExtra("CONTENT_TYPE", mimeType); 
        sIntent.addCategory(Intent.CATEGORY_DEFAULT);

        Intent chooserIntent;
        if (getPackageManager().resolveActivity(sIntent, 0) != null){
            // it is device with Samsung file manager
            chooserIntent = Intent.createChooser(sIntent, "Open file");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { intent});
        } else {
            chooserIntent = Intent.createChooser(intent, "Open file");
        }

        try {
            startActivityForResult(chooserIntent, CHOOSE_FILE_REQUESTCODE);
        } catch (android.content.ActivityNotFoundException ex) {
            Toast.makeText(getApplicationContext(), "No suitable File Manager was found.", Toast.LENGTH_SHORT).show();
        }
    }

Это решение мне подходит, а может быть, кому-то пригодится.

Чупик
источник
У меня это почти работает, за исключением того факта, что sIntent при запуске не принимает файлы любого типа. Я могу просматривать папки, но это все.
Radu
Проблема в том, что в намерении должен быть mimeType: "file / *", в то время как для Samsung sIntent требуется "* / *" - без пробелов между * / *
Раду
1
А как насчет других 11к Android-устройств.
Оливер Диксон
1
Как установить URI для этого намерения, не могли бы вы мне помочь?
PriyankaChauhan
1
В случае намерения Samsung («com.sec.android.app.myfiles.PICK_DATA») вы можете попробовать добавить строку «FOLDERPATH» или «START_FOLDER»
Чупик
41

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

private void openFile(Int  CODE) {
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.setType("*/*");
    startActivityForResult(intent, CODE);
}

здесь проложите путь в onActivityResultактивности.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     String Fpath = data.getDataString();
    // do somthing...
    super.onActivityResult(requestCode, resultCode, data);

}
Алиреза
источник
6
Как преобразовать получение uri в файл util.file?
Ананд Савджани
Не уверен в получении java.io.File, но его можно открыть с помощью: developer.android.com/reference/android/content/ ... Как получить простое имя здесь: stackoverflow.com/a/23270545/755313
demaksee,
3
как выбрать папку?
hornet2319
8

Это дает мне лучший результат:

    Intent intent;
    if (android.os.Build.MANUFACTURER.equalsIgnoreCase("samsung")) {
        intent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
        intent.putExtra("CONTENT_TYPE", "*/*");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
    } else {

        String[] mimeTypes =
                {"application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", // .doc & .docx
                        "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.presentationml.presentation", // .ppt & .pptx
                        "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", // .xls & .xlsx
                        "text/plain",
                        "application/pdf",
                        "application/zip", "application/vnd.android.package-archive"};

        intent = new Intent(Intent.ACTION_GET_CONTENT); // or ACTION_OPEN_DOCUMENT
        intent.setType("*/*");
        intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
    }
Ислам Халед
источник
Можете ли вы поделиться своим onActivityResultCode @Islam Khaled
Kishan Donga
1
См. Также третий вариант в org.openintents.action.PICK_FILE. openintents.org/action/org-openintents-action-pick-file Ваш код также предполагает, что все пользователи телефонов Samsung используют и (по-прежнему) имеют файловый менеджер Samsung. Использование intent.resolveActivity с Samsung в качестве запасного варианта было бы более надежным.
Маркус Вольшон
1

Оказывается, файловый менеджер Samsung использует настраиваемое действие. Вот почему я мог видеть файловый менеджер Samsung при поиске файла в приложениях Samsung, но не в моем.

Действие: com.sec.android.app.myfiles.PICK_DATA.

Я создал настраиваемое средство выбора действий, которое отображает действия, фильтрующие оба намерения.

ErGo_404
источник
Привет, можешь объяснить это поподробнее? Для телефонов Samsung Galaxy я использую Intent selectFile = new Intent ("com.sec.android.app.myfiles.PICK_DATA"); но это вызывает ошибку
steliosf
Я не уверен прямо сейчас, но могу проверить позже. Я думаю, это исключение Activity Not Found. У вас есть какое-нибудь рабочее решение? Практически все перепробовал и исправить не удалось
steliosf
Это намерение сработало у меня на Galaxy SII. Пробовал на GT-B5510 (Galaxy Y Pro), и это не сработало. Я думаю, что это просто ненадежно, если вы хотите настроить таргетинг на все устройства Samsung. В итоге я интегрировал в свое приложение файловый менеджер с открытым исходным кодом, но это тяжелое решение для такой базовой потребности.
ErGo_404 04
Как установить URI для этого намерения, не могли бы вы мне помочь?
PriyankaChauhan
0

Если вы хотите знать это, существует библиотека с открытым исходным кодом под названием aFileDialog , небольшая и простая в использовании, которая предоставляет средство выбора файлов.

Отличие от других библиотек выбора файлов для Android заключается в том, что aFileDialog дает вам возможность открывать средство выбора файлов как диалоговое окно и как действие.

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

Данигонлина
источник
0

Остальные ответы не неверны. Однако теперь есть больше возможностей для открытия файлов. Например, если вы хотите, чтобы приложение имело долгосрочный постоянный доступ к файлу, вы можете использовать ACTION_OPEN_DOCUMENTвместо этого. См. Официальную документацию: Открытие файлов с помощью структуры доступа к хранилищу . Также обратитесь к этому ответу .

Милош Черниловский
источник