Как сделать aim.setType для файла pdf, xlsx и txt android?

Я хочу выбрать только файл pdf, xlsx и txt из памяти, но int.setType может выполнять только один файл (только файл pdf (только файл pdf). Можно ли получить все три файла путем кодирования намерения .setType() и есть ли способ сделать?

Вот мой код.

  private void showFileChooser() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("application/pdf");
    intent.addCategory(Intent.CATEGORY_OPENABLE);

    try {
        startActivityForResult(
                Intent.createChooser(intent, "Select txt file"),
                0);
    } catch (android.content.ActivityNotFoundException ex) {
        // Potentially direct the user to the Market with a Dialog

    }
}

Ответ 1

@Fatehali Asamadi путь в порядке, но нужно что-то добавить для надлежащего использования. Для документов Microsoft используются оба расширения (.doc или .docx), (.ppt или .pptx), (.xls или .xlsx). Для поддержки или просмотра этих расширений вам нужно добавить больше mimeTypes.

Используйте метод ниже для просмотра документов, где REQUEST_CODE_DOC является requestCode для onActivityResult (final int requestCode, final int resultCode, final Intent data) метод @Override.

private void browseDocuments(){

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

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

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        intent.setType(mimeTypes.length == 1 ? mimeTypes[0] : "*/*");
        if (mimeTypes.length > 0) {
            intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
        }
    } else {
        String mimeTypesStr = "";
        for (String mimeType : mimeTypes) {
            mimeTypesStr += mimeType + "|";
        }
        intent.setType(mimeTypesStr.substring(0,mimeTypesStr.length() - 1));
    }
    startActivityForResult(Intent.createChooser(intent,"ChooseFile"), REQUEST_CODE_DOC);

}

Вы можете получить четкую концепцию и добавить необходимые mimeTypes из здесь.

Ответ 2

intent.setType("image/*|application/pdf|audio/*");

Возможно, это то, что вы хотите.

Ответ 3

Похоже, вы просто хотите увидеть, могут ли быть решены эти намерения. Это может быть лучшим подходом:

 private void showFileChooser() {

    Intent intentPDF = new Intent(Intent.ACTION_GET_CONTENT);
    intentPDF.setType("application/pdf");
    intentPDF.addCategory(Intent.CATEGORY_OPENABLE);

    Intent intentTxt = new Intent(Intent.ACTION_GET_CONTENT);
    intentTxt.setType("text/plain");
    intentTxt.addCategory(Intent.CATEGORY_OPENABLE);

    Intent intentXls = new Intent(Intent.ACTION_GET_CONTENT);
    intentXls.setType("application/x-excel");
    intentXls.addCategory(Intent.CATEGORY_OPENABLE);

    PackageManager packageManager = getPackageManager();

    List activitiesPDF = packageManager.queryIntentActivities(intentPDF,
    PackageManager.MATCH_DEFAULT_ONLY);
    boolean isIntentSafePDF = activitiesPDF.size() > 0;

    List activitiesTxt = packageManager.queryIntentActivities(intentTxt,
    PackageManager.MATCH_DEFAULT_ONLY);
    boolean isIntentSafeTxt = activitiesTxt.size() > 0;

    List activitiesXls = packageManager.queryIntentActivities(intentXls,
    PackageManager.MATCH_DEFAULT_ONLY);
    boolean isIntentSafeXls = activitiesXls.size() > 0;

    if (!isIntentSafePDF || !isIntentSafeTxt || !isIntentSafeXls){

        // Potentially direct the user to the Market with a Dialog

    }

}

Ссылки:

http://developer.android.com/training/basics/intents/sending.html

Как определить, может ли Android обрабатывать PDF?

Ответ 4

Вы можете использовать Intent.ACTION_OPEN_DOCUMENT,

Каждый документ представлен как URI контента://, поддерживаемый DocumentsProvider, который может быть открыт как поток с openFileDescriptor(Uri, String) или запрошен для метаданных DocumentsContract.Document.

Все выбранные документы возвращаются вызывающему приложению с постоянными разрешениями на чтение и запись. Если вы хотите поддерживать доступ к документам во всех перезагрузках устройств, вам необходимо явно использовать устойчивые разрешения с помощью takePersistableUriPermission(Uri, int).

Вызывающие должны указывать допустимые типы документов MIME через setType(String). Например, чтобы выбрать фотографии, используйте image/*. Если допустимы несколько непересекающихся MIME-типов, определите их в EXTRA_MIME_TYPES и setType(String) до */*.

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

http://developer.android.com/reference/android/content/Intent.html#ACTION_OPEN_DOCUMENT

Обратите внимание, что это доступно только на уровне API 19 +.

Ответ 5

Вы должны использовать системную функцию для поиска определенного mimeType файла, к которому вы пытаетесь получить доступ (например, "application/pdf" ). Если вы имеете дело с каким-либо неизвестным типом, вероятно, будет трудно найти этот тип. Надеюсь, этот код спасет вас!

String url=Environment.getExternalStorageDirectory().getAbsolutePath()+"/Saves/contacts.vcf";
File file = new File(url);
Intent intent = new Intent(Intent.ACTION_VIEW);
String mimeType=MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url));
intent.setDataAndType(Uri.fromFile(file), mimeType);
Intent intent1 = Intent.createChooser(intent, "Open With");
startActivity(intent1);

Источник ЗДЕСЬ

Ответ 6

Вы должны проверить эту ссылку http://www.androidsnippets.com/open-any-type-of-file-with-default-intent.html. Также прочитайте Mime Type.

Вот как я реализовал для любого файла или выбранного файла типа MIME

String[] mimeTypes =
{"image/*","application/pdf","application/msword","application/vnd.ms-powerpoint","application/vnd.ms-excel","text/plain"};

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

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    intent.setType(mimeTypes.length == 1 ? mimeTypes[0] : "*/*");
    if (mimeTypes.length > 0) {
       intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
    }
} else {
    String mimeTypesStr = "";
    for (String mimeType : mimeTypes) {
        mimeTypesStr += mimeType + "|";
    }
    intent.setType(mimeTypesStr.substring(0,mimeTypesStr.length() - 1));
}
startActivityForResult(Intent.createChooser(intent,"ChooseFile"), 0);