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