Android Q & Android 11存储适配(二) FileOperator文件管理框架

FileOperator 是一个适用于 Android 4.4 及以上系统的文件操作库,兼容 AndroidQ 和 Android11 的存储策略。它提供了文件选择、图片压缩等功能,并支持多种类型的文件操作。库的使用包括添加依赖、初始化、设置文件选择条件和回调。通过示例代码展示了单选图片、多选图片和多选文件的实现,以及自定义文件类型和压缩图片的用法。此外,还提供了文件操作工具类,如计算文件大小、打开文件和URL等。更新日志中修复了若干问题,提高了兼容性和安全性。

上一篇 👉 Android Q & Android 11存储适配(一) 基础知识点梳理

FileOperator

  • 🚀Android文件操作库
  • 🚀适用于Android 4.4及以上系统, 已兼容AndroidQAndroid11新的存储策略
  • 🚀KotlinJava案例 👉 app & sample_java

使用(Usage)

1. Project build.gradle:
repositories {
    maven { url 'https://dl.bintray.com/javakam/FileOperator' }
}
2. 依赖(dependencies)
implementation 'ando.file:core:1.3.8'       //核心库必选(Core library required)
implementation 'ando.file:selector:1.3.8'   //文件选择器(File selector)
implementation 'ando.file:compressor:1.3.8' //图片压缩, 核心算法采用 Luban
implementation 'ando.file:android-q:1.3.8'  //Q和11兼容库,需要额外的库:'androidx.documentfile:documentfile:1.0.1'
3. Application中初始化(Initialization in Application)
FileOperator.init(this,BuildConfig.DEBUG)
4. 混淆(Proguard)

未用到反射, 不需要混淆。(No reflection is used, no need to be confused.)

预览(Preview)

功能列表(Function list) 缓存目录(Cache directory)

文件选择(File selection)

单图+压缩(Single Image+Compress) 多图+压缩(Multiple images+Compress) 多文件+多类型(Multiple files+Multiple types)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ea1lNmng-1615774263638)(https://raw.githubusercontent.com/javakam/FileOperator/master/screenshot/pick1.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FD2qhkGC-1615774263639)(https://raw.githubusercontent.com/javakam/FileOperator/master/screenshot/pick2.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F8kEZuez-1615774263641)(https://raw.githubusercontent.com/javakam/FileOperator/master/screenshot/pick3.png)]

用法(Usage)

1. 单选图片(Single selection picture)

val optionsImage = FileSelectOptions().apply {
   
   
    fileType = FileType.IMAGE
    fileTypeMismatchTip = "文件类型不匹配 !" //File type mismatch
    singleFileMaxSize = 5242880
    singleFileMaxSizeTip = "图片最大不超过5M !" //The largest picture does not exceed 5M
    allFilesMaxSize = 10485760
    allFilesMaxSizeTip = "总图片大小不超过10M !"//The total picture size does not exceed 10M  注:单选条件下无效,只做单个图片大小判断
    fileCondition = object : FileSelectCondition {
   
   
        override fun accept(fileType: IFileType, uri: Uri?): Boolean {
   
   
            return (fileType == FileType.IMAGE && uri != null && !uri.path.isNullOrBlank() && !FileUtils.isGif(uri))
        }
    }
}
mFileSelector = FileSelector
    .with(this)
    .setRequestCode(REQUEST_CHOOSE_FILE)
    .setTypeMismatchTip("文件类型不匹配 !") //File type mismatch
    .setMinCount(1, "至少选择一个文件 !") //Choose at least one file
    .setMaxCount(10, "最多选择十个文件 !") //Choose up to ten files  注:单选条件下无效, 只做最少数量判断
    .setOverLimitStrategy(OVER_LIMIT_EXCEPT_OVERFLOW)
    .setSingleFileMaxSize(1048576, "大小不能超过1M !") //The size cannot exceed 1M  注:单选条件下无效, FileSelectOptions.singleFileMaxSize
    .setAllFilesMaxSize(10485760, "总大小不能超过10M !") //The total size cannot exceed 10M 注:单选条件下无效,只做单个图片大小判断 setSingleFileMaxSize
    .setMimeTypes("image/*") //默认不做文件类型约束为"*/*",不同类型系统提供的选择UI不一样 eg:"video/*","audio/*","image/*"
    .applyOptions(optionsImage)
    .filter(object : FileSelectCondition {
   
   
        override fun accept(fileType: IFileType, uri: Uri?): Boolean {
   
   
            return when (fileType) {
   
   
                FileType.IMAGE -> (uri != null && !uri.path.isNullOrBlank() && !FileUtils.isGif(uri))
                FileType.VIDEO -> false
                FileType.AUDIO -> false
                else -> false
            }
        }
    })
    .callback(object : FileSelectCallBack {
   
   
        override fun onSuccess(results: List<FileSelectResult>?) {
   
   
            ResultUtils.resetUI(mTvResult)
            if (results.isNullOrEmpty()) {
   
   
                toastLong("没有选取文件") //No file selected
                return
            }
            showSelectResult(results)
        }
        override fun onError(e: Throwable?) {
   
   
            FileLogger.e("FileSelectCallBack onError ${
     
     e?.message}")
            ResultUtils.setErrorText(mTvError, e)
        }
    })
    .choose()

2. 多选图片(多选+单一类型)

Multiple selection pictures (multiple selection + single type)

val optionsImage = FileSelectOptions().apply {
   
   
    fileType = FileType.IMAGE
    fileTypeMismatchTip = "文件类型不匹配 !" //File type mismatch
    singleFileMaxSize = 5242880
    singleFileMaxSizeTip = "单张图片大小不超过5M !" //The size of a single picture does not exceed 5M
    allFilesMaxSize = 10485760
    allFilesMaxSizeTip = "图片总大小不超过10M !" //The total size of the picture does not exceed 10M
    fileCondition = object : FileSelectCondition {
   
   
        override fun accept(fileType: IFileType, uri: Uri?): Boolean {
   
   
            return (fileType == FileType.IMAGE && uri != null && !uri.path.isNullOrBlank() && !FileUtils.isGif(uri))
        }
    }
}
mFileSelector = FileSelector
    .with(this)
    .setRequestCode(REQUEST_CHOOSE_FILE)
    .setMultiSelect()
    .setMinCount(1, "至少选择一个文件 !") //Choose at least one file
    .setMaxCount(2, "最多选两个文件!") //Choose up to two files
    .setSingleFileMaxSize(3145728, "单个大小不能超过3M !") //Single size cannot exceed 3M
    .setAllFilesMaxSize(20971520, "总文件大小不能超过20M !") //The total file size cannot exceed 20M
    .setOverLimitStrategy(this.mOverLimitStrategy)
    .setMimeTypes("image/*")
    .applyOptions(optionsImage)
    .filter(object : FileSelectCondition {
   
   
        override fun accept(fileType: IFileType, uri: Uri?): Boolean {
   
   
            return (fileType == FileType.IMAGE) && (uri != null && !uri.path.isNullOrBlank() && !FileUtils.isGif(uri))
        }
    })
    .callback(object : FileSelectCallBack {
   
   
        override fun onSuccess(results: List<FileSelectResult>?) {
   
   
            FileLogger.w("FileSelectCallBack onSuccess ${
     
     results?.size}")
            mAdapter.setData(null)
            if (results.isNullOrEmpty()) {
   
   
                toastLong("没有选取文件") //No file selected
                return
            }
            showSelectResult(results)
        }
        override fun onError(e: Throwable?) {
   
   
            FileLogger.e("FileSelectCallBack onError ${
     
     e?.message}")
            ResultUtils.setErrorText(mTvError, e)
            mAdapter.setData(null)
            mBtSelect.text = "$mShowText (0)"
        }
    })
    .choose()

3. 多选文件(多选+多种类型)

Multiple files (multi-select multiple types)

🌴适用于处理复杂文件选择情形, 如: 选取图片、音频文件、文本文件, 其中图片至少选择一张, 最多选择两张, 每张图片大小不超过5M, 全部图片大小不超过10M;
音频文件至少选择两个, 最多选择三个, 每个音频大小不超过20M, 全部音频大小不超过30M;
文本文件至少选择一个, 最多选择两个, 每个文本文件大小不超过5M, 全部文本文件大小不超过10M

🌴It is suitable for processing complex f

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值