Android 文件管理器

news/2024/12/16 1:39:01/

特点

github:https://github.com/DyncKathline/FilePicker

该项目起源ZFileManager,由于他使用的是kotlin,我翻译成Java,后续加上链式回调和兼容Android 11,在此感谢此作者的开源精神,同时我也把修改后的项目也进行了开源。

1. 默认支持 音频,视频,图片,txt,zip,word,excel,ppt,pdf,apk 10种文件

2. 支持音频、视频播放,图片查看,zip解压,文件重命名、复制、移动、删除、查看详情

3. 支持查看指定文件类型,支持文件类型拓展

4. 支持多选,数量、文件大小限制、实时排序、指定文件路径访问

5. 支持QQ、微信文件选择(支持自定义获取)

6. 兼容 Android 11(这里使用的是StorageAccessFramework,原因是因为使用原来的已经获取不到数据了)

部分截图

基本使用 (Java使用)

Step 0. 添加依赖

implementation 'org.dync.kathline:filePicker:1.2.3'

注意:兼容Android 11

useSAF默认判断大于Android 11会自动给使用StorageAccessFramework,为了兼容过滤条件新增了一个MimeType进行过滤SAF打开文件管理器


boolean useSAF = true;
final ZFileConfiguration configuration = new ZFileConfiguration.Build().resources(resources).useSAF(useSAF).fileFilterArray(useSAF ? new String[]{MimeType.TYPE_pdf} : new String[]{ZFileContent.PDF})

Step 1. 实现ZFileImageListener,并在调用前或Application中初始化


public class MyFileImageListener extends ZFileListener.ZFileImageListener {/*** 图片类型加载*/@Overridepublic void loadImage(ImageView imageView, File file) {Glide.with(imageView.getContext()).load(file).apply(new RequestOptions().placeholder(R.drawable.ic_zfile_other).error(R.drawable.ic_zfile_other)).into(imageView);}
}// 在调用前或Application中初始化 
ZFileContent.getZFileHelp().init(new MyFileImageListener());

Step 2. 在Activity或Fragment中使用

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);main_defaultMangerBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 打开文件管理getZFileHelp().start(MainActivity.this, new ProxyListener() {@Overridepublic void onResult(int requestCode, int resultCode, Intent data) {List<ZFileBean> fileList = ZFileManageHelp.getInstance().getSelectData(getBaseContext(), requestCode, resultCode, data);if (fileList == null || fileList.size() <= 0) {return;}StringBuilder sb = new StringBuilder();for (ZFileBean bean : fileList) {sb.append(bean.toString()).append("\n\n");}resultTxt.setText(sb.toString());}});}});}}

文件类型拓展

Step 1. 新建一个类:ZFileType,重写里面的openFile()、loadingFile()方法


// 自定义的类型
public static final String APK = "apk";/*** 自定义Apk文件类型*/
public class ApkType extends ZFileType {/*** 打开文件* @param filePath  文件路径* @param view      当前视图*/@Overridepublic void openFile(String filePath, View view) {Toast.makeText(view.getContext(), "打开自定义拓展文件", Toast.LENGTH_SHORT).show();}/*** 加载文件* @param filePath 文件路径* @param pic      文件展示的图片*/@Overridepublic void loadingFile(String filePath, ImageView pic) {// 获取PackageManagerAPK的信息try {PackageManager packageManager = pic.getContext().getPackageManager();PackageInfo packageInfo = packageManager.getPackageArchiveInfo(filePath, PackageManager.GET_ACTIVITIES);if(packageInfo != null) {pic.setImageDrawable(packageInfo.applicationInfo.loadIcon(packageManager));}} catch (Throwable ignore) {pic.setImageResource(R.drawable.ic_launcher);}}
}

Step 3. 在调用前或Application中配置


ZFileContent.getZFileHelp().setFileTypeListener(new MyFileTypeListener());

QQ或微信文件选择

QQ、微信默认根据时间倒序排序,不显示隐藏文件,过滤规则默认,只显示文件,不支持长按操作
其他配置与文件管理保持一致!具体可查看这里

super_qqTxt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 打开QQ文件选择ZFileConfiguration zFileConfig = ZFileContent.getZFileConfig();zFileConfig.setBoxStyle(ZFileConfiguration.STYLE2);zFileConfig.setFilePath(ZFileConfiguration.QQ);ZFileContent.getZFileHelp().setConfiguration(zFileConfig).start(this);}});super_wechatTxt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 打开微信文件选择ZFileConfiguration zFileConfig = ZFileContent.getZFileConfig();zFileConfig.setBoxStyle(ZFileConfiguration.STYLE2);zFileConfig.setFilePath(ZFileConfiguration.WECHAT);ZFileContent.getZFileHelp().setConfiguration(zFileConfig).start(this);}});@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);List<ZFileBean> list = ZFileContent.getZFileHelp().getSelectData(getBaseContext(), requestCode, resultCode, data);StringBuilder sb = new StringBuilder();for (ZFileBean bean : list) {sb.append(bean).append("\n\n");}superResultTxt.setText(sb.toString());}

自定义文件获取


/*** 获取文件* 此方式,排序、是否显示隐藏文件、过滤规则等等操作都需要自己实现* 获取配置信息:ZFileManageHelp.getInstance().getConfiguration()*/
public class MyFileLoadListener implements ZFileLoadListener {/*** 获取手机里的文件List* @param filePath String          指定的文件目录访问,空为SD卡根目录* @return List<ZFileBean>         list*/@Overridepublic List<ZFileBean> getFileList(Context context, String filePath) {return getFileList(context, filePath);}private List<ZFileBean> getFileList(Context context, String filePath) {return null;}
}// 在调用前或Application中配置
ZFileContent.getZFileHelp().setFileLoadListener(new MyFileLoadListener());

自定义打开默认支持的文件


public class MyFileOpenListener extends ZFileOpenListener {@Override public void openAudio(String filePath, View view) {} // 音频@Override public void openImage(String filePath, View view) {} // 图片@Override public void openVideo(String filePath, View view) {} // 视频@Override public void openTXT(String filePath, View view) {} // 文本@Override public void openZIP(String filePath, View view) {} // zip压缩包@Override public void openDOC(String filePath, View view) {} // word@Override public void openXLS(String filePath, View view) {} // xls@Override public void openPPT(String filePath, View view) {} // ppt@Override public void openPDF(String filePath, View view) {} // pdf@Override public void openOther(String filePath, View view) {} // 其他文件
}// 在调用前或Application中配置
ZFileContent.getZFileHelp().setFileOpenListener(new MyFileOpenListener());

自定义文件操作


public class MyFileOperateListener extends ZFileOperateListener {/*** 文件重命名* @param filePath String   文件路径* @param context Context   Context* @param block (boolean:成功或失败;String:新名字)*/public void renameFile(final String filePath, final Context context,final Function3 block) {// 先弹出重命名Dialog,再执行重命名方法  }/*** 复制文件 耗时操作,建议放在非UI线程中执行* @param sourceFile String     源文件地址* @param targetFile String     目标文件地址* @param context Context       Context* @param block                 文件操作成功或失败后的监听*/public void copyFile(String sourceFile, String targetFile, Context context, Function2 block) {ZFileUtil.copyFile(sourceFile, targetFile, context, block);}/*** 移动文件 耗时操作,建议放在非UI线程中执行*/public void moveFile(String sourceFile, String targetFile, Context context, Function2 block) {}/*** 删除文件 耗时操作,建议放在非UI线程中执行*/public void deleteFile(final String filePath, final Context context, final Function2 block) {}/*** 解压文件 耗时操作,建议放在非UI线程中执行*/public void zipFile(String sourceFile, String targetFile, Context context, Function2 block) {}/*** 文件详情*/public void fileInfo(ZFileBean bean, Context context) {}
}// 在调用前或Application中配置
ZFileContent.getZFileHelp().setFileOperateListener(new MyFileOperateListener());
更多操作请查看demo, _ 如果觉得可以 star 一下哦

http://www.ppmy.cn/news/356502.html

相关文章

小米开源文件管理器MiCodeFileExplorer-源码研究(0)-初步研究

2011年对着书本Android应用开发揭秘&#xff0c;写了2个月的HelloWorld。 现在想复习并深入&#xff0c;我没有耐心再去一点点地敲代码了。 4年前自己是个学生&#xff0c;实习&#xff0c;现在有工作&#xff0c;只能业余时间研究。 这一点是非常不同的。 我希望通过研究别人的…

四、文件管理

初识文件管理 文件——就是一组有意义的信息/数据集合 文件的属性 文件名:由创建文件的用户决定文件名&#xff0c;主要是为了方便用户找到文件&#xff0c;同一目录下不允许有重名文件 标识符:一个系统内的各文件标识符唯一&#xff0c;对用户来说毫无可读性&#xff0c;因…

文件管理

1.下列文件物理结构中&#xff0c;适合随机访问且易于文件扩展的是() 连续结构 索引结构 链式结构且磁盘块定长 链式结构且磁盘块变长 解析&#xff1a; 文件的物理结构包括连续、链式、索引三种&#xff0c;其中链式结构不能实现随机访问&#xff0c;连续结构的文件不易…

12.文件管理

ls 目录 | wc -l 1.目录个数 find ./ -type d | wc -l2.文件个数 find ./ -type f | wc -l3.查看文件夹大小 比如查看home目录的大小&#xff1a;du -sh /home4.查看版本 cat /etc/redhat-release5.Linux下修改PATH路径 1)PATH$PATH:/etc/apache/bin2)vi /etc/profilePAT…

小米文件管理android,小米文件管理器

小米文件管理器&#xff1a;小米文件管理器Mi File Explorer是从miui中提取出来的文件管理应用&#xff0c;miui的系统的成功造就了很多原生应用的受欢迎。 官方介绍 Mi File Explorer (小米文件管理) 是内地团队开发的MIUI Android系统内建的文件管理器,功能强大,早已备受各方…

Android 13(T) Media框架 - 智能指针

Android有一套自己的智能指针管理办法&#xff0c;并且将其运用在源码的各个角落&#xff0c;所以学习Media框架之前&#xff0c;我们有必要先了解下Android智能指针。 本节代码源自于Android 13(T)&#xff0c;参考 (aospxref.com) 1 概述 与智能指针相关的总共有5个类&#…

Linux驱动开发(按键驱动)

文章目录 前言一、设备树编写二、驱动程序编写三、应用程序编写总结 前言 本篇文章我们来讲解按键的驱动程序&#xff0c;按键驱动程序的主要思路就是使用中断的方式&#xff0c;当按键按下时会发生中断这个时候就可以通过中断来获取按键的状态。 一、设备树编写 我的开发板…

【送书福利-第十期】清华社 IT BOOK 多得图书活动 ~!

大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我&#xff01; 本文目录 一、前言二、内容介绍三、抽奖方…