如何为 pdf、xlsx 和 txt 文件 Android 制作 intent.setType?

Posted

技术标签:

【中文标题】如何为 pdf、xlsx 和 txt 文件 Android 制作 intent.setType?【英文标题】:how to make intent.setType for pdf,xlsx and txt file android? 【发布时间】:2015-05-12 18:26:11 【问题描述】:

我只想从存储中选择 pdf、xlsx 和 txt 文件,但 intent.setType 只能执行一个文件(例如,仅 .txt 文件(或)仅 pdf 文件)。是否可以通过编码intent.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

    

【问题讨论】:

你应该看看***.com/a/33117677/5597641 how to pick few type of file via intent in android?的可能重复 【参考方案1】:

@Fatehali Asamadi 的方式还可以,但需要添加一些东西以供适当使用。 对于 Microsoft 文档(.doc 或 .docx)、(.ppt 或 .pptx)、(.xls 或 .xlsx)扩展名都使用。要支持或浏览这些扩展,您需要添加更多 mimeType。

使用以下方法浏览文档,其中 REQUEST_CODE_DOC 为 onActivityResult(final int requestCode, final int resultCode,final Intent data) @Override 方法的 requestCode。

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


您可以从 Here 获得清晰的概念并添加所需的 mimeTypes

【讨论】:

在使用此代码时,我无法在应用程序中查看文档。你能帮忙吗 我的应用支持 Kitkat 及更高版本。所以,我只使用第一个逻辑条件。但是,不知何故,它显示了所有内容,而不仅仅是预期的内容。我怀疑这条线intent.setType(mimeTypes.length == 1 ? mimeTypes[0] : "*/*");。它不是让它显示一切吗? 该行的目的是什么? intent.setType(mimeTypes.length == 1 ? mimeTypes[0] : "/");. 花了太多时间寻找 docx Mime 类型“application/vnd.openxmlformats-officedocument.wordprocessingml.document”,这是我需要的 CrossFilePicker.Current.PickFile() allowedTypes 参数。谢谢:) 使用此代码检测 mimetype File file = new File(filePath);字符串扩展 = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString()); String mimeType = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);【参考方案2】:
intent.setType("image/*|application/pdf|audio/*");

也许这就是你想要的。

【讨论】:

这是否记录在某处?当我尝试像这样组合多种类型时,意图没有选择任何文件类型。 是的,它更清晰,但不适用于 '|'接线员,我试过了,没用。【参考方案3】:

您应该检查此链接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);

【讨论】:

【参考方案4】:

您似乎只是想看看是否可以解决这些意图。 这可能是更好的方法:

 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

How do I determine if Android can handle PDF

【讨论】:

【参考方案5】:

简单的解决办法是

   Intent gallery=new Intent();
        gallery.setType("application/*");
        gallery.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(gallery,pick);

注意:pick 是 int 变量。

【讨论】:

【参考方案6】:

您可以使用 Intent.ACTION_OPEN_DOCUMENT,

每个文档都表示为由 DocumentsProvider 支持的 content:// URI,可以使用 openFileDescriptor(Uri, String) 将其作为流打开,或查询 DocumentsContract.Document 元数据。

所有选定的文档都将返回给调用应用程序,并授予持久的读写权限。如果您想在设备重启后保持对文档的访问权限,则需要使用 takePersistableUriPermission(Uri, int) 显式获取持久权限。

调用者必须通过setType(String) 指明可接受的文档 MIME 类型。例如,要选择照片,请使用image/*。如果可以接受多个不相交的 MIME 类型,请在 EXTRA_MIME_TYPESsetType(String)*/* 中定义它们。

更多详情请参考此链接

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

请注意,这仅适用于 API 级别 19+。

【讨论】:

【参考方案7】:

您应该使用系统函数来查找您尝试访问的文件的特定 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);

来源HERE

【讨论】:

以上是关于如何为 pdf、xlsx 和 txt 文件 Android 制作 intent.setType?的主要内容,如果未能解决你的问题,请参考以下文章

这个简单、易于实现的库可以将HTML表导出为xlsx、xls、csv和txt文件。

Reportlab:如何为 pdf 文件添加页脚

如何为选定的 pdf 查看器打开 pdf 到 iphone?

沙盒:如何为用户选择的文件的封闭文件夹添加书签?

如何根据文件头识别doc、docx、pdf、xls和xlsx

如何为 html 和 pdf 创建加权、带标签的汇总表?