Android文件选择器 路径选择 支持安卓4.4 ~ 13 支持Android/data目录访问 支持SD卡 适配Android11

这篇具有很好参考价值的文章主要介绍了Android文件选择器 路径选择 支持安卓4.4 ~ 13 支持Android/data目录访问 支持SD卡 适配Android11。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android文件路径选择器

Android上进行文件选择或操作的第三方库,自动申请存储权限,支持 Android4.4 ~ 13,再也不用为了适配各种版本而苦恼了,快速集成,一句代码搞定,完善的文档,支持无root权限访问和操作Android/data和Android/obb目录(适配Android 13),支持SD卡,高度自定义UI满足你的所有需求,使用非常灵活,支持国际化,对于Android文件选择你只需要关注你的业务代码即可其他的都交给它。

特性

  • 自动申请存储权限
  • 安卓 4.4 ~ 13
  • Android/data和Android/obb目录访问和操作
  • SD卡
  • 高度自定义UI
  • 国际化
  • 搜索功能

前言

在开始之前可以给项目一个Star吗?非常感谢,你的支持是我唯一的动力。欢迎Star和Issues!
项目地址:
Github地址
Gitee地址

demo演示:

系统版本:Android 13
下载链接:体验APP

Android文件选择器 路径选择 支持安卓4.4 ~ 13 支持Android/data目录访问 支持SD卡 适配Android11

一、快速开始

第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 文件中加入远程依赖
dependencies {
    ...
    // 请将"版本"替换成具体的版本号,如 1.1.14
    implementation 'io.github.molihuan:pathselector:版本'
}
第3步:基本用法示范:
//如果没有权限会自动申请权限
PathSelector.build(this, MConstants.BUILD_DIALOG)//Dialog构建方式
        .setMorePopupItemListeners(
                new CommonItemListener("OK") {
                    @Override
                    public boolean onClick(View v, List<FileBean> selectedFiles, String currentPath, BasePathSelectFragment pathSelectFragment) {

                        StringBuilder builder = new StringBuilder();
                        builder.append("you selected:\n");
                        for (FileBean fileBean : selectedFiles) {
                            builder.append(fileBean.getPath() + "\n");
                        }
                        Mtools.toast(builder.toString());

                        return false;
                    }
                }
        )
        .show();//开始构建

二、基本设置

打开调试模式
//开启调试模式,生产环境请关闭
PathSelectorConfig.setDebug(true);
//或者PathSelector.setDebug(true);
1、Activity构建模式:
//Activity构建方式
PathSelectFragment selector = PathSelector.build(this, MConstants.BUILD_ACTIVITY)
        .setRequestCode(635)
        .setMorePopupItemListeners(
                new CommonItemListener("OK") {
                    @Override
                    public boolean onClick(View v, List<FileBean> selectedFiles, String currentPath, BasePathSelectFragment pathSelectFragment) {

                        StringBuilder builder = new StringBuilder();
                        builder.append("you selected:\n");
                        for (FileBean fileBean : selectedFiles) {
                            builder.append(fileBean.getPath() + "\n");
                        }
                        Mtools.toast(builder.toString());

                        return false;
                    }
                }
        )
        .show();
2、Fragment构建模式:
第1步:在你需要显示的布局文件xml中使用FrameLayout占位
<FrameLayout
    android:id="@+id/fragment_select_show_area"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
第2步:编写代码
//获取PathSelectFragment实例然后在onBackPressed中处理返回按钮点击事件
PathSelectFragment selector = PathSelector.build(this, MConstants.BUILD_FRAGMENT)
        .setFrameLayoutId(R.id.fragment_select_show_area)//加载位置,FrameLayout的ID
        .setMorePopupItemListeners(
                new CommonItemListener("OK") {
                    @Override
                    public boolean onClick(View v, List<FileBean> selectedFiles, String currentPath, BasePathSelectFragment pathSelectFragment) {

                        StringBuilder builder = new StringBuilder();
                        builder.append("you selected:\n");
                        for (FileBean fileBean : selectedFiles) {
                            builder.append(fileBean.getPath() + "\n");
                        }
                        
                        Mtools.toast(builder.toString());
                        return false;
                    }
                }
        )
        .show();//开始构建
第3步:重写onBackPressed()方法让路径选择器优先处理返回按钮点击事件
非常重要!!!
非常重要!!!
非常重要!!!
重要的事情说三遍
@Override
public void onBackPressed() {

    //让PathSelectFragment先处理返回按钮点击事件
    if (selector != null && selector.onBackPressed()) {
        return;
    }
    ......
    super.onBackPressed();
}
3、Dialog构建模式 & 常用设置:
//获取PathSelectFragment实例然后在onBackPressed中处理返回按钮点击事件
PathSelectFragment selector = PathSelector.build(this, MConstants.BUILD_DIALOG)
        //.setBuildType(MConstants.BUILD_DIALOG)//已经在build中已经设置了
        //.setContext(this)//已经在build中已经设置了
        .setRootPath("/storage/emulated/0/")//初始路径
        .setShowSelectStorageBtn(true)//是否显示内部存储选择按钮
        .setShowTitlebarFragment(true)//是否显示标题栏
        .setShowTabbarFragment(true)//是否显示面包屑
        .setAlwaysShowHandleFragment(true)//是否总是显示长按弹出选项
        .setShowFileTypes("", "mp3", "mp4")//只显示(没有后缀)或(后缀为mp3)或(后缀为mp4)的文件
        .setSelectFileTypes("", "mp3")//只能选择(没有后缀)或(后缀为mp3)的文件
        .setMaxCount(3)//最多可以选择3个文件,默认是-1不限制
        .setRadio()//单选
        .setSortType(MConstants.SORT_NAME_ASC)//按名称排序
        .setTitlebarMainTitle(new FontBean("My Selector"))//设置标题栏主标题,还可以设置字体大小,颜色等
        .setTitlebarBG(Color.GREEN)//设置标题栏颜色
        .setFileItemListener(//设置文件item点击回调(点击是文件才会回调,如果点击是文件夹则不会)
                new FileItemListener() {
                    @Override
                    public boolean onClick(View v, FileBean file, String currentPath, BasePathSelectFragment pathSelectFragment) {
                        Mtools.toast("you clicked path:\n" + file.getPath());
                        return false;
                    }
                }
        )
        .setMorePopupItemListeners(//设置右上角选项回调
                new CommonItemListener("SelectAll") {
                    @Override
                    public boolean onClick(View v, List<FileBean> selectedFiles, String currentPath, BasePathSelectFragment pathSelectFragment) {
                        pathSelectFragment.selectAllFile(true);
                        return false;
                    }
                },
                new CommonItemListener("DeselectAll") {
                    @Override
                    public boolean onClick(View v, List<FileBean> selectedFiles, String currentPath, BasePathSelectFragment pathSelectFragment) {
                        pathSelectFragment.selectAllFile(false);
                        return false;
                    }
                }
        )
        .setHandleItemListeners(//设置长按弹出选项回调
                new CommonItemListener("OK") {
                    @Override
                    public boolean onClick(View v, List<FileBean> selectedFiles, String currentPath, BasePathSelectFragment pathSelectFragment) {
                        StringBuilder builder = new StringBuilder();
                        builder.append("you selected:\n");
                        for (FileBean fileBean : selectedFiles) {
                            builder.append(fileBean.getPath() + "\n");
                        }
                        Mtools.toast(builder.toString());
                        return false;
                    }
                },
                new CommonItemListener("cancel") {
                    @Override
                    public boolean onClick(View v, List<FileBean> selectedFiles, String currentPath, BasePathSelectFragment pathSelectFragment) {
                        pathSelectFragment.openCloseMultipleMode(false);
                        return false;
                    }
                }
        )
        .show();

三、高级设置(自定义UI)

UI布局:

Android文件选择器 路径选择 支持安卓4.4 ~ 13 支持Android/data目录访问 支持SD卡 适配Android11

1、自定义选项样式(以HandleItem为例子)
方式1:通过FontBean来设置样式
PathSelectFragment selector = PathSelector.build(this, MConstants.BUILD_DIALOG)
        .setHandleItemListeners(//设置长按弹出选项回调
                //FontBean可以设置文本、字的大小、字的颜色、字左边的图标
    			//R.drawable.ic_test_mlh是你自己的图片资源id
                new CommonItemListener(new FontBean("OK", 18, Color.RED, R.drawable.ic_test_mlh)) {
                    @Override
                    public boolean onClick(View v, List<FileBean> selectedFiles, String currentPath, BasePathSelectFragment pathSelectFragment) {
                        Mtools.toast("You Click");
                        return false;
                    }
                }
        )
        .show();
什么?这种方式还不能满足你,那么试试方式2
方式2:重写CommonItemListener的setViewStyle方法来自定义样式
PathSelectFragment selector = PathSelector.build(this, MConstants.BUILD_DIALOG)
        .setHandleItemListeners(
                //重写CommonItemListener的setViewStyle方法来自定义样式
                new CommonItemListener("OK") {
                    @Override
                    public boolean setViewStyle(RelativeLayout container, ImageView leftImg, TextView textView) {
                        textView.setTextSize(18);
                        textView.setTextColor(Color.RED);
                        //默认是不显示图标的
                        leftImg.setVisibility(View.VISIBLE);
                        leftImg.setImageResource(R.drawable.ic_test_mlh);
                        leftImg.getLayoutParams().width = 90;
                        leftImg.getLayoutParams().height = 90;
                        return true;
                    }

                    @Override
                    public boolean onClick(View v, List<FileBean> selectedFiles, String currentPath, BasePathSelectFragment pathSelectFragment) {
                        Mtools.toast("You Click");
                        return false;
                    }
                }
        )
        .show();
什么?什么?这种方式还不能满足你,那么你来写UI它来帮你添加,试试高度自定义UI
2、高度自定义UI(以Titlebar为例子):
第1步:新建一个布局文件,如:fragment_custom_titlebar.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <Button
        android:id="@+id/my_btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="btn1" />

    <Button
        android:id="@+id/my_btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="selectAll" />
    
</LinearLayout>
第2步:新建一个类,如:CustomTitlebarFragment.class使其继承AbstractTitlebarFragment并关联第1步中的布局文件
public class CustomTitlebarFragment extends AbstractTitlebarFragment {
    private Button btn1;
    private Button btn2;
    
    @Override
    public int setFragmentViewId() {
        return R.layout.fragment_custom_titlebar;
    }

    @Override
    public void getComponents(View view) {
        btn1 = view.findViewById(R.id.my_btn1);
        btn2 = view.findViewById(R.id.my_btn2);
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Mtools.toast("The current path is:\n" + psf.getCurrentPath());
            }
        });
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                psf.selectAllFile(true);
            }
        });
    }
}
第3步:编写代码
//获取PathSelectFragment实例然后在onBackPressed中处理返回按钮点击事件
PathSelectFragment selector = PathSelector.build(this, MConstants.BUILD_DIALOG)
        .setTitlebarFragment(new CustomTitlebarFragment())
        .show();

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

IConfigDataBuilder
方法 注释 备注
setFrameLayoutId(int id) 设置加载位置FrameLayoutID 当构建模式为MConstants.BUILD_FRAGMENT时必须设置
setRequestCode(int code) 设置请求码 当构建模式为MConstants.BUILD_ACTIVITY时必须设置
setRootPath(String path) 设置开始默认路径 默认为内部存储根路径
setMaxCount(int maxCount) 设置最大选择数量 不设置默认为-1 即无限
setShowFileTypes(String… fileTypes) 设置显示文件类型 没有后缀请用""
setSelectFileTypes(String… fileTypes) 设置选择文件类型 没有后缀请用""
setSortType(int sortType) 设置排序规则 类型请看MConstants
setRadio() 设置单选 默认多选
setShowSelectStorageBtn(boolean var) 设置是否显示内部存储选择按钮 默认true
setShowTitlebarFragment(boolean var) 是否显示标题栏 默认true
setShowTabbarFragment(boolean var) 是否显示面包屑 默认true
setAlwaysShowHandleFragment(boolean var) 是否总是显示长按弹出选项 默认false
setTitlebarMainTitle(FontBean titlebarMainTitle) 设置标题栏主标题 还可以设置字体大小,颜色等
setTitlebarBG(Integer titlebarBG) 设置标题栏背景颜色
setFileItemListener(FileItemListener fileItemListener) 设置文件item点击回调 点击是文件才会回调,如果点击是文件夹则不会
setMorePopupItemListeners(CommonItemListener… morePopupItemListener) 设置右上角选项回调
setHandleItemListeners(CommonItemListener… handleItemListener) 设置长按弹出选项回调
setTitlebarFragment(AbstractTitlebarFragment titlebarFragment) 设置自定义标题栏UI 自己的Fragment必须继承AbstractTitlebarFragment
setHandleFragment(AbstractHandleFragment handleFragment) 设置长按弹出自定义UI 自己的Fragment必须继承AbstractHandleFragment
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设置一致

版本升级
  • 新版本往往解决了旧版本的一些问题、增加了性能、可扩展性…建议升级新版本
  • 请注意因为重构了项目导致了旧版本与新版本不兼容。1.0.x升级1.1.x为非兼容升级,请注意学习新的API
体积过大
  • 已经集成了Blankj/AndroidUtilCode

    如果项目对大小有严格要求请自行下载源码并精简AndroidUtilCode模块

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

特别鸣谢

  • getActivity/XXPermissions

  • CymChad/BaseRecyclerViewAdapterHelper

  • Blankj/AndroidUtilCode

  • xuexiangjys/XTask

  • ZLYang110/FileSelector

  • zzy0516alex/FileSelectorRelease

开源项目以及其依赖项目。文章来源地址https://www.toymoban.com/news/detail-444329.html

到了这里,关于Android文件选择器 路径选择 支持安卓4.4 ~ 13 支持Android/data目录访问 支持SD卡 适配Android11的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android将Uri转为路径字符串(适配安卓全版本)并使用第三方应用打开文件(适配Android7.0+)

    做这个功能时在网上找了无数篇例子,有些方法是有问题的,故自己写一篇完整实现的总结,作备忘也作案例。顺便说一句,Android对存储权限的给予真的越来越严格 目录 1.Uri转为路径String以获得文件名  2.获取文件后缀名 3.通过后缀名获取文件MIME类型  4.设置Intent的Uri与权限

    2024年02月19日
    浏览(24)
  • Android13预装APP到data分区

    修改步骤与Android11是差不多的,只是有部分代码所在位置不一样。 Android 11®内置APP到data/app Android 8(O)预置APP到data/app 1970-01-01 08:03:54.499 1177-1177/system_process I/PackageManager: /data/app/xx changed; collecting certs 1970-01-01 08:03:54.547 1177-1177/system_process W/PackageManager: Failed to scan /data/app/xx: Appl

    2024年01月21日
    浏览(10)
  • Android 5.0 ~ 14访问Android/data(obb)目录的方法

    众所周知,安卓每次出新版本的时候都会收紧权限,存储权限也不例外。虽说官方的意思是为了保护隐私安全,但这些改动着实令开发者和用户感到头疼,尤其是Android/data、Android/obb目录的访问。毕竟用户更难操作,开发者也要费力适配。那么今天就来探索下怎么适配这些变

    2024年03月24日
    浏览(26)
  • Android 13 关于安卓判断通知权限

    判断权限是否开启: public class NoticePermissionUtil {       private static final String CHECK_OP_NO_THROW = \\\"checkOpNoThrow\\\";     private static final String OP_POST_NOTIFICATION = \\\"OP_POST_NOTIFICATION\\\";       //调用该方法获取是否开启通知栏权限     public static boolean isNotifyEnabled(Context context) {        

    2023年04月13日
    浏览(20)
  • 升级到Android12后Termux不能访问Android/data目录该怎么办

    最近手机从HarmonyOS 2.0 升级到HarmonyOS 3.0后,发现Termux不能访问Android/data目录,导致以前写的工具都不能用了。 读取不到Android/data目录 后来发现原来从Android11开始访问Android/data目录需要用户给APP应用授权,但Termux用命令行去访问Android/data目录,只显示 \\\".\\\": Permission denied (os err

    2024年02月11日
    浏览(23)
  • Android13-图片选择器

    在compileSDK = 33 时,谷歌在安卓新增了 图片选择器 功能,支持单选、多选、选图片、视频等操作,并且不需要额外获取照片/音频权限。 具体实现如下: 1:请求 2:响应 单选 多选

    2024年02月07日
    浏览(21)
  • Android13-图片视频选择器

    在compileSDK = 33 时,谷歌在安卓新增了 图片选择器 功能,支持单选、多选、选图片、视频等操作,并且不需要额外获取照片/音频权限。 具体实现如下: 1:请求 2:响应 2.1单选: 2.2多选:

    2024年02月09日
    浏览(20)
  • Python获取与处理文件路径/目录路径

      1.1 获取当前文件的绝对路径 使用**os.path.abspath()**获取当前文件的绝对路径。 输出:   1.2.1 获取当前文件的所在目录 使用**os.path.dirname()**获取当前文件的所在目录。 输出:   1.2.2 获取当前文件的所在目录的上一级目录 使用多个**os.path.dirname()**嵌套以获取当前文件的所

    2024年01月17日
    浏览(27)
  • 解决Docker文件不存在错误:找不到文件或目录:‘./data/train‘

    在使用Docker容器时,有时会遇到文件不存在的错误。特别是在处理数据时,例如在训练机器学习模型时,可能会遇到类似于\\\"FileNotFoundError: No such file or directory: ‘./data/train’\\\"的错误。这个错误提示表明在容器中找不到指定的文件或目录。在本文中,我们将探讨这个问题的可能

    2024年02月03日
    浏览(40)
  • Android免Root执行脚本,无Root可以修改权限的目录 :/data/local/tmp

    在Android中,访问data目录是需要root权限,但是有个例外那就是/data/local/tmp目录,这个目录通过使用ADB来打开就会拥有读写权限! 注意: (1)这个目录不能一级一级的打开,需要通过cd  /data/local/tmp 一次性进入 (2)该目录下的文件属性,权限都是可以修改的,例如chmod 777 /d

    2024年02月09日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包