具有特定文件扩展名的Android文件选择器

时间:2014-12-10 17:24:46

标签: android android-intent android-fileprovider

当我运行默认文件选择器时,我只需要在我的应用程序中显示“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文件。如何过滤文件选择器显示的文件。

2 个答案:

答案 0 :(得分:6)

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

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并让用户触摸他/她想要的文件。您可以根据需要将列表设置为精美 - 显示缩略图,加上文件名等。

这听起来好像需要很长时间,但事实并非如此,您就会知道每台设备的行为。

答案 1 :(得分:1)

一种非常整洁的方法是使用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
    }
}