rosuH / AndroidFilePicker

FilePicker is a small and fast file selector library that is constantly evolving with the goal of rapid integration, high customization, and configurability~
https://afp.rosuh.me
MIT License
991 stars 87 forks source link

急!自定义文件类型过滤器方法java无法调用 #73

Closed zaaach closed 4 years ago

zaaach commented 4 years ago

自己定义了几个文件类型,但是无法添加,java项目,大佬可以解决下这个吗? 调用时是这样的提示:方法都带release的

FilePickerManager.INSTANCE
          .from(this)
          .enableSingleChoice()
          .setSelfFileType$filepicker_release()
issue-label-bot[bot] commented 4 years ago

Issue Label Bot is not confident enough to auto-label this issue. See dashboard for more details.

rosuH commented 4 years ago

@zaaach 非常抱歉给您带来困扰。您所使用的并不是正确的 API,所有带有 $ 符号的函数都是被隐藏的函数。因为 Kotlin 的 internal 修饰符对 Java 代码无效,导致了这样的混乱的局面。您应该使用:

.filter(new AbstractFileFilter() {
    @NotNull
    @Override
    public ArrayList<FileItemBeanImpl> doFilter(@NotNull ArrayList<FileItemBeanImpl> listData) {
        return null;
    }
})
zaaach commented 4 years ago

有自定义几个类型,但好像没有起作用

.filter(new AbstractFileFilter() {
    @NotNull
    @Override
    public ArrayList<FileItemBeanImpl> doFilter(@NotNull ArrayList<FileItemBeanImpl> arrayList)
        ArrayList<FileItemBeanImpl> result = new ArrayList<>();
        for (FileItemBeanImpl impl : arrayList) {
            if ( impl.getFileType() instanceof PPTFileType
                    || impl.getFileType() instanceof ExcelFileType
                    || impl.getFileType() instanceof PdfFileType
                    || impl.isDir()){
                result.add(impl);
            }
        }
        return result;
    }
})
.forResult(FilePickerManager.REQUEST_CODE);

其中ExcelFileType是这样:

public class ExcelFileType implements FileType {
    @Override
    public int getFileIconResId() {
        return R.mipmap.file_suffix_ic_xls;
    }

    @NotNull
    @Override
    public String getFileType() {
        return "Excel";
    }

    @Override
    public boolean verify(@NotNull String fileName) {
        String suffix = FileUtils.getFileExtension(fileName).toLowerCase();
        return "xls".equals(suffix) || "xlsx".equals(suffix);
    }
}

打开后没有出来任何文件,不知道是不是我写的方式不对=。=

zaaach commented 4 years ago

可以了,原来要配合fileType方法!

.fileType(new AbstractFileType() {
    @NotNull
    @Override
    public FileItemBeanImpl fillFileType(@NotNull FileItemBeanImpl fileItemBean) {
        String suffix =  FileUtils.getFileExtension(fileItemBean.getFileName()).toLow
        switch (suffix){
            case "ppt":
            case "pptx":
                fileItemBean.setFileType(new PPTFileType());
                break;
            case "txt":
                fileItemBean.setFileType(new TxtFileType());
                break;
            case "doc":
            case "docx":
                fileItemBean.setFileType(new WordFileType());
                break;
            case "pdf":
                fileItemBean.setFileType(new PdfFileType());
                break;
            case "xls":
            case "xlsx":
                fileItemBean.setFileType(new ExcelFileType());
                break;
        }
        return fileItemBean;
    }
})
rosuH commented 4 years ago

@zaaach 新的 0.6.3 版本调整了部分接口和可见性。避免了歧义的问题。 并且增加了自定义文件类型的 demo,欢迎您使用。

感谢您的反馈~

zaaach commented 4 years ago

好的,感谢!!!

GirlFriendNotFind commented 2 years ago

1. mFileTypeList = new ArrayList<>(); mFileTypeList.add(new CustomFileType()); 2. FilePickerManager.INSTANCE .from(MyOrdeDetailActivity.this) .enableSingleChoice() .registerFileType(mFileTypeList,false) .forResult(FilePickerManager.REQUEST_CODE); 3. public class CustomFileType implements FileType {

@Override
public int getFileIconResId() {
    return R.drawable.ic_unknown_file_picker;
}

@NotNull
@Override
public String getFileType() {
    return "Excel";
}

@Override
public boolean verify(@NotNull String fileName) {
    boolean isHasSuffix = fileName.contains(".");
    if (!isHasSuffix) {
        // 如果没有 . 符号,即是没有文件后缀
        return false;
    }
    String suffix = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();

    return "pdf".equals(suffix)
            || "ppt".equals(suffix)
            || "pptx".equals(suffix)
            || "doc".equals(suffix)
            || "docx".equals(suffix)
            || "xls".equals(suffix)
            || "xlsx".equals(suffix);
}

}

我这样使用还是显示不出pdf等文件,版本是用0.8.0,这个版本看文档是直接registerFileType注入自定义类型CustomFileType就行了,但是没有生效,是我的CustomFileType类写得有问题吗?

rosuH commented 2 years ago

@GirlFriendNotFind registerFileType 第二个参数传 true 试试看?

rosuH commented 2 years ago

确定是有 pdf 文件的吗?你先去掉注册自定义类型,然后打印一下结果看看有没有。 @GirlFriendNotFind

GirlFriendNotFind commented 2 years ago

@rosuH 感谢回复,传true只剩下文件夹能显示,文件都没有了。 有的,系统文件管理能看到pdf文件,去掉注册只使用最基本的api能看到mp3和图片等文件,也没看到pdf。使用手机是小米11

rosuH commented 2 years ago

@rosuH 感谢回复,传true只剩下文件夹能显示,文件都没有了。 有的,系统文件管理能看到pdf文件,去掉注册只使用最基本的api能看到mp3和图片等文件,也没看到pdf。使用手机是小米11

有点奇怪...之前也有反馈 pdf 查不出来的问题。晚上我写 demo 试试看,现在暂时没有时间。 你可以自己先用 File.listFiles 的 api 看看能不能列出来,如果可以就是库的 bug。 @GirlFriendNotFind

GirlFriendNotFind commented 2 years ago

@rosuH 好的,是使用过滤器打印的意思吗?

FilePickerManager.INSTANCE .from(MyOrdeDetailActivity.this) .enableSingleChoice() //.registerFileType(mFileTypeList, false)//注释掉自定义类型 .filter(aFilter)//添加过滤器 .forResult(FilePickerManager.REQUEST_CODE);

AbstractFileFilter aFilter = new AbstractFileFilter() { @NotNull @Override public ArrayList doFilter(@NotNull final ArrayList arrayList) { ArrayList fileItemBeans = new ArrayList<>(); for (FileItemBeanImpl fileItemBean : arrayList){

            String fileName = fileItemBean.getFileName();

            Log.v("aaa===", "fileName="+fileName);//====打印====

            fileItemBeans.add(fileItemBean);
        }
        return fileItemBeans;
    }
};

打印结果是只打印出根目录的文件夹名称和mp3文件名称,根目录下的pdf文件没有打印

GirlFriendNotFind commented 2 years ago

@rosuH 找到解决方法了,要跟#152那个哥们那样处理才行#152 ,要多申请一个权限,这样才能读出文档文件,应该是高版本的限制

rosuH commented 2 years ago

@rosuH 找到解决方法了,要跟#152那个哥们那样处理才行#152 ,要多申请一个权限,这样才能读出文档文件,应该是高版本的限制

理论上也不应该会这样...而且通常不见增加文件管理的权限。今晚手头没电脑,我周末试试看🐦

rosuH commented 2 years ago

此问题已确认,在 Android 11 的平台上,申请 READ_EXTERNAL_STORAGE 只能读取媒体文件,文档类型和二进制文件将会被忽略。解决方案其实就是申请文件管理权限,或者降低 target API 的等级。 感谢您的反馈!