【问题标题】:Android file chooser with specific file extensions具有特定文件扩展名的 Android 文件选择器
【发布时间】:2014-12-10 17:24:45
【问题描述】:

当我运行默认文件选择器时,我只需要在我的应用程序中显示“pdf”文件我无法过滤文件扩展名。

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

    Intent intent = Intent.createChooser(getContentIntent, "Select a file");
    startActivityForResult(intent, REQUEST_PDF_GET);

文件选择器显示任何类型的文件。我只想显示 pdf 文件。如何过滤文件选择器显示的文件。

【问题讨论】:

    标签: android android-intent android-fileprovider


    【解决方案1】:

    您不知道您的意图可能触发哪些用户安装的文件浏览器应用程序。我认为这是一个最好用手卷东西的情况。我的方法是

    a) 在外部媒体上查找具有特定扩展名的所有文件,例如(我正在寻找 .saf 扩展名,因此您需要相应地更改为 .pdf):

        public ArrayList<String> findSAFs(File dir, ArrayList<String> matchingSAFFileNames) {
        String safPattern = ".saf";
    
        File listFile[] = dir.listFiles();
    
        if (listFile != null) {
            for (int i = 0; i < listFile.length; i++) {
    
                if (listFile[i].isDirectory()) {
                    findSAFs(listFile[i], matchingSAFFileNames);
                } else {
                  if (listFile[i].getName().endsWith(safPattern)){
                      matchingSAFFileNames.add(dir.toString() + File.separator + listFile[i].getName());
                      //System.out.println("Found one! " + dir.toString() + listFile[i].getName());
                  }
                }
            }
        }    
        //System.out.println("Outgoing size: " + matchingSAFFileNames.size());  
        return matchingSAFFileNames;
    }
    

    b) 将该结果放入ListView 并让用户触摸他/她想要的文件。您可以按照自己的意愿制作列表——显示缩略图、加上文件名等。

    听起来这需要很长时间,但事实并非如此,然后您就可以了解每台设备的行为。

    【讨论】:

    • 谢谢 Jason,我会将此标记为正确答案,但我只是对 Android 不提供内置功能这样的基本工作感到失望。我只想归档文件扩展名...
    • 我也对此感到惊讶,并期待一个 Intent 来处理它。当我想向用户展示图像并让他们选择倍数等时,我也遇到过类似的问题。也许有人会在这里弹出一个更好的策略。
    • @JASONGPETERSON 这正是我所需要的。但我不知道如何阅读 dir 。我试过Environment.getExternalStorageDirectory().getPath(),但它不起作用。我需要通过存储目录中的所有文件夹找到.srt 文件并列出它们。请帮助我。
    【解决方案2】:

    一个非常巧妙的方法是使用MaterialFilePicker

    repositories {
        jcentre()
    }
    
    dependencies {
        implementation 'com.nbsp:materialfilepicker:1.9.1'
    }
    

    我正在使用它来过滤 .csv 文件,

    new MaterialFilePicker()
        .withActivity(activity)
        .withCloseMenu(true)
        .withFilter(Pattern.compile(".*\\.(csv)$"))
        .withFilterDirectories(false)
        .withTitle("Choose File to Import")
        .withRequestCode(REQUEST_CHOOSE_FILE_TO_IMPORT)
        .start();
    

    现在您可以轻松地在 onActivityResult 中抓取结果:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        if (requestCode == REQUEST_CHOOSE_FILE_TO_IMPORT && resultCode == RESULT_OK) {
            String filePath = data.getStringExtra(FilePickerActivity.RESULT_FILE_PATH);
            // Do anything with file
        }
    }
    

    【讨论】:

    • 非常好的文件选择器!与您通常在 data.getData 中找到的 Uri 相反,您可以将路径转换为 ​​Uri,如下所示:Uri fileUri = Uri.fromFile(new File(filePath));
    • 我喜欢这个,但它确实需要最小 SDK 19...
    【解决方案3】:

    看看这个文件选择器,我发现的最好的:

    https://github.com/Angads25/android-filepicker

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 2011-02-14
      • 1970-01-01
      相关资源
      最近更新 更多