7

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

4

2 回答 2

8

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

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) 将该结果放入 aListView并让用户触摸他/她想要的文件。您可以根据需要使列表变得花哨 - 显示缩略图,加上文件名等。

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

于 2014-12-10T18:01:43.127 回答
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
    }
}
于 2020-08-10T23:44:36.013 回答