特点
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());