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

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

В настоящее время я использую (который я скопировал из исходного кода электронной почты 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, поскольку у них уже есть базовый, но достаточный файловый менеджер.

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

8 ответов

Решение

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

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

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent, PICKFILE_REQUEST_CODE);

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

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 minmeType) {

        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType(minmeType);
        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", minmeType); 
        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();
        }
    }

Это решение хорошо работает для меня, и, возможно, будет полезно для кого-то еще.

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

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);

}

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

    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);
    }

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

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

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

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

ES File Explorer больше не существует в Google Play, в качестве альтернативы вы можете использовать FS File Explorer, это приложение позволяет выбирать файлы любого типа. Со временем я создал библиотеку, которая облегчает взаимодействие с FS File Explorer:https://github.com/YounesHass/fs-selection

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

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

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

Другие вопросы по тегам