mlhfileselectorlib

Introduction: 🔥🔥🔥Android 文件选择器 路径选择器,自动申请存储权限,支持安卓 4.4 ~ 12,支持 Android/data 目录访问,支持自定义 UI,支持 SD 卡。(Provide file or path selection, automatically apply for storage permission, support Android 4.4 to 12, support Android/data directory access, support custom UI,Support SD card.The Keyword:file selector operator android/data android 11)
More: Author   ReportBugs   
Tags:

Maven Central API license: Apache-2.0 (shields.io) bilibili: 玲莫利 (shields.io) 博客园: molihuan (shields.io) CSDN: molihuan (shields.io)

提供文件或路径选择,自动申请存储权限,支持安卓 4.4 ~ 12,支持 Android/data 目录访问,支持自定义 UI,支持 SD 卡。(Provide file or path selection, automatically apply for storage permission, support Android 4.4 to 12, support Android/data directory access, support custom UI,Support SD card.The Keyword:file selector operator android/data android 11)

语言(Language)

中文 | English

前言

在开始之前可以给我一个小星星吗?

非常感谢,你的支持是我唯一动力。

欢迎 Star 和 Issues!

项目地址:

Github 地址

Gitee 地址

一、如何使用

第 1 步:添加仓库:

  • 如果你的项目 Gradle 配置是在 7.0 以下,需要在 build.gradle 文件中加入
allprojects {
    repositories {
        ...
        mavenCentral()
        maven { url 'https://jitpack.io' }
    }
}
  • 如果你的 Gradle 配置是 7.0 及以上,则需要在 settings.gradle 文件中加入
dependencyResolutionManagement {
    repositories {
        ...
        mavenCentral()
        maven { url 'https://jitpack.io' }
    }
}

第 2 步:添加远程依赖:

  • 配置完远程仓库后,在项目 app 模块下的 build.gradle 文件中加入远程依赖
  • 最新发布版:Maven Central
dependencies {
    ...
    // 版本请自行选择建议使用最新的
    implementation 'io.github.molihuan:pathselector:版本'
}

第 3 步:基本用法示范:

//如果没有权限会自动申请权限
PathSelector.build(MainActivity.this, Constants.BUILD_ACTIVITY)//跳转 Activity 方式
    .requestCode(10011)//请求码
    //toolbar 选项
    .setMoreOPtions(new String[]{"选择"},
                    new boolean[]{true},//选择后结束掉 Activity 结果会给到 onActivityResult()
                    new SelectOptions.onToolbarOptionsListener() {
                        @Override
                        public void onOptionClick(View view, String currentPath, List<FileBean> fileBeanList, List<String> callBackData, TabbarFileListAdapter tabbarAdapter, FileListAdapter fileAdapter, List<FileBean> callBackFileBeanList) {
                            //for (String callBackDatum : callBackData) {
                            //Mtools.toast(getBaseContext(),callBackDatum);//也可一在这里拿到选择的结果
                            //}
                        }
                    }
                   )
    .start();//开始构建

第 4 步:获取返回的数据(也可以在点击回调中获取数据):

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 10011) {
        if(data!=null){
            List<String> pathData = data.getStringArrayListExtra(Constants.CALLBACK_DATA_ARRAYLIST_STRING);//获取数据
            StringBuilder builder = new StringBuilder();
            for (String path : pathData) {
                builder.append(path).append("");
            }
            Mtools.toast(MainActivity.this,builder.toString());
        }
    }
}

demo 演示:

系统版本:Android 11

链接:体验 App

pathSelectorDemo1.gif

二、更多设置

1、Activity&所有设置模式:

//Constants.BUILD_ACTIVITY 为 ACTIVITY 模式
PathSelector.build(MainActivity.this, Constants.BUILD_ACTIVITY)
    .requestCode(10011)//请求码
    .setRootPath("/storage/emulated/0")//设置根目录(注意最后没有/)
    .setMaxCount(3)//设置最大选择数量,默认是 -1 不限制
    //.setToolbarFragment(new TestFragment())//加载自定义 ToolbarFragment
    //.setMoreChooseFragment(new TestFragment())//加载自定义 MoreChooseFragment
    //.setShowFileTypes("mp4","")//设置显示文件类型如果无后缀请使用""
    //.setSelectFileTypes("mp3","mp4","ppt","")//设置选择文件类型如果无后缀请使用""
    .setSortType(Constants.SORT_NAME_ASC)//设置排序类型
    //.isSingle()//单选模式不能多选
    .showToolBarFragment(true)//是否显示 ToolbarFragment
    .setToolbarMainTitle("路径选择器")//设置 ToolbarFragment 主标题
    .setToolbarSubtitleTitle("MLH")//设置 ToolbarFragment 副标题
    .setToolbarSubtitleColor(Color.BLACK)//ToolbarFragment 副标题颜色
    //设置多选 item 和其回调
    .setMoreChooseItems(
    new String[]{"全选", "删除"},
    //匿名对象
    new SelectOptions.onMoreChooseItemsListener() {
        @Override
        public void onItemsClick(View view, String currentPath, List<FileBean> fileBeanList, List<String> callBackData, TabbarFileListAdapter tabbarAdapter, FileListAdapter fileAdapter, List<FileBean> callBackFileBeanList) {
            Mtools.toast(getBaseContext(),"点击了全选");
        }
    },
    //lambda 表达式 为了简洁下面都使用 lambda 表达式
    (view,currentPath, fileBeanList,callBackData,tabbarAdapter,fileAdapter,callBackFileBeanList) -> {
        Mtools.toast(getBaseContext(),"点击了删除");
    }
)
    //设置 toolbarFragment 更多选项 item 和其回调
    .setMoreOPtions(
    new String[]{"选择"},
    new boolean[]{false},//选择结束后是否需要销毁当前 Activity
    (view,currentPath, fileBeanList,callBackData,tabbarAdapter,fileAdapter,callBackFileBeanList) -> {
        Mtools.toast(getBaseContext(),"点击了选择"+callBackData.get(0));
    }
)
    //设置文件列表中 FileItem 和其回调
    .setFileItemListener(new com.molihuan.pathselector.dao.SelectOptions.onFileItemListener() {
        @Override
        public boolean onFileItemClick(View view, String currentPath, List<com.molihuan.pathselector.entities.FileBean> fileBeanList, List<String> callBackData, TabbarFileListAdapter tabbarAdapter, com.molihuan.pathselector.adapters.FileListAdapter fileAdapter,FileBean fileBean) {
            Mtools.toast(getBaseContext(),currentPath);
            return false;
        }
        @Override
        public boolean onLongFileItemClick(View view, String currentPath, List<com.molihuan.pathselector.entities.FileBean> fileBeanList, List<String> callBackData, TabbarFileListAdapter tabbarAdapter, com.molihuan.pathselector.adapters.FileListAdapter fileAdapter,FileBean fileBean) {
            return false;
        }
    })
    .start();//开始构建

2、Fragment 模式:

//获取 PathSelectFragment 实例 onBackPressed 中处理返回按钮点击事件
mPathSelectFragment = PathSelector.build(MainActivity.this, Constants.BUILD_FRAGMENT)
    .frameLayoutID(R.id.fragment_select_show_area)//加载位置,FrameLayout 的 ID
    .requestCode(10011)//请求码
    .showToolBarFragment(false)//是否显示 ToolbarFragment
    //设置多选 item 和其回调
    .setMoreChooseItems(
    new String[]{"全选", "删除"},
    (view,currentPath, fileBeanList,callBackData,tabbarAdapter,fileAdapter,callBackFileBeanList) -> {
        Mtools.toast(getBaseContext(),"点击了全选");
    },
    (view,currentPath, fileBeanList,callBackData,tabbarAdapter,fileAdapter,callBackFileBeanList) -> {
        Mtools.toast(getBaseContext(),"点击了删除"+callBackData.get(0));
    }
)
    .start();//开始构建
onBackPressed()中
@Override
public void onBackPressed() {
    //让 PathSelectFragment 先处理返回按钮点击事件
    if (mPathSelectFragment!=null&&mPathSelectFragment.onBackPressed()){
        return;
    }
    super.onBackPressed();
}

3、Dialog 模式:

//获取 PathSelectFragment 实例 onBackPressed 中处理返回按钮点击事件
mPathSelectFragment = PathSelector.build(MainActivity.this, Constants.BUILD_DIALOG)
    .frameLayoutID(R.id.fragment_select_show_area)//加载位置 FrameLayout 的 ID
    .requestCode(10011)//请求码
    .showToolBarFragment(true)//是否显示 ToolbarFragment
    //设置 toolbarFragment 更多选项 item 和其回调
    .setMoreOPtions(
    new String[]{"选择"},
    new boolean[]{true},
    (view,currentPath, fileBeanList,callBackData,tabbarAdapter,fileAdapter,callBackFileBeanList) -> {
        Mtools.toast(getBaseContext(),"点击了选择"+currentPath);
    }
)
    .start();//开始构建

4、自定义 Toolbar:

//获取 PathSelectFragment 实例 onBackPressed 中处理返回按钮点击事件
mPathSelectFragment = PathSelector.build(MainActivity.this, Constants.BUILD_ACTIVITY)
    .requestCode(10011)//请求码
    .showToolBarFragment(true)//是否显示 ToolbarFragment 如果自定义必须为 true 默认为 true
    .setToolbarFragment(new CustomToolbarFragment())
    .setToolbarViewClickers(
    new SelectOptions.onToolbarListener() {
        @Override
        public void onClick(View view, String currentPath, List<FileBean> fileBeanList, List<String> callBackData, TabbarFileListAdapter tabbarAdapter, FileListAdapter fileAdapter,List<FileBean> callBackFileBeanList) {
            Mtools.toast(getBaseContext(),"点击了按钮 1");
        }
    }
)
    .start();//开始构建

三、类与方法(尽量看源码,都写了注释,懒得写文档)

SelectManager
方法 注释 备注
frameLayoutID(int id) 设置加载位置 FrameLayoutID
requestCode(int code) 设置请求码
setRootPath(String path) 设置开始默认路径
setMaxCount(int maxCount) 设置最大选择数量 不设置默认为 -1 即无限
setShowFileTypes(String... fileTypes) 设置显示文件类型
setSelectFileTypes(String... fileTypes) 设置选择文件类型
setSortType(int sortType) 设置排序规则
isSingle() 设置单选
showToolBarFragment(boolean var) 设置 ToolBarFragment 是否显示
setMoreOPtions(String[] optionsName ,SelectOptions.onToolbarOptionsListener ...optionListeners) 设置一些 Toolbar 选项(有重载)
setToolbarViewClickers(SelectOptions.onToolbarListener ...listeners) 设置一些 Toolbar 点击
SelectManager setMoreChooseItems(String[] ItemsName ,SelectOptions.onMoreChooseItemsListener ...itemListeners) 设置一些 MoreChooseItems 选项(有重载)
setFileItemListener(SelectOptions.onFileItemListener onFileItem) FileItem 点击/长按回调
setToolbarMainTitle(String title) 设置 Toolbar 主标题 标题相关选项一系列不一一列举
setToolbarFragment(Fragment fragment) 设置自定义标题栏 UI 建议继承 AbstractToolbarFragment
setMoreChooseFragment(Fragment fragment) 设置自定义多选 UI
start() 开始构建 必须调用
...... ......

四、!!!特别注意!!!

分区存储

该库以及适配了分区存储,不需要额外适配,你只需要写你的业务代码即可,其他的交给它。
  • 注意该库已经在库的AndroidManifest.xml中添加了:

    <!-- 外部存储的写权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- 安卓 11 额外权限 -->
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
        tools:ignore="ScopedStorage" />
    <!-- 已经适配了分区存储特性 -->
    <application
            android:preserveLegacyExternalStorage="true"
            android:requestLegacyExternalStorage="true"
            >
    
  • 可能会报错:

    Execution failed for task ':app:processDebugMainManifest'.
    > Manifest merger failed with multiple errors, see logs
    

    请在你的项目中的AndroidManifest.xml设置一致

代码混淆

  • 一般来说无需配置,会自动导入混淆规则

非常感谢

ZLYang110/FileSelector: Android 文件选择器,指定选择文件夹还是文件,根据后缀名过滤,支持多选 (github.com)

zzy0516alex/FileSelectorRelease: lib (github.com)

getActivity/XXPermissions: Android 权限请求框架,已适配 Android 12 (github.com)

CymChad/BaseRecyclerViewAdapterHelper: BRVAH:Powerful and flexible RecyclerAdapter (github.com)

Blankj/AndroidUtilCode: Android developers should collect the following utils(updating). (github.com)

开源项目以及其依赖项目。

LICENSE

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools