{"id":37429295,"url":"https://github.com/pichsy/filepicker","last_synced_at":"2026-01-16T06:33:28.166Z","repository":{"id":301476325,"uuid":"1008705062","full_name":"pichsy/filepicker","owner":"pichsy","description":"图库选择，仿华为相册滑动选择，微信样式","archived":false,"fork":false,"pushed_at":"2025-08-27T05:44:39.000Z","size":77479,"stargazers_count":4,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-08-27T14:21:56.247Z","etag":null,"topics":["android","imagepicker","kotlin","pictureselector","slidechoose"],"latest_commit_sha":null,"homepage":"https://github.com/pichsy/filepicker","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pichsy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-26T01:11:07.000Z","updated_at":"2025-08-27T05:44:42.000Z","dependencies_parsed_at":"2025-06-27T04:52:36.571Z","dependency_job_id":"12b6fa6e-16b6-4350-bc4c-1614c2a14c54","html_url":"https://github.com/pichsy/filepicker","commit_stats":null,"previous_names":["pichsy/filepicker"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/pichsy/filepicker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pichsy%2Ffilepicker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pichsy%2Ffilepicker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pichsy%2Ffilepicker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pichsy%2Ffilepicker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pichsy","download_url":"https://codeload.github.com/pichsy/filepicker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pichsy%2Ffilepicker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28477829,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T06:30:42.265Z","status":"ssl_error","status_checked_at":"2026-01-16T06:30:16.248Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","imagepicker","kotlin","pictureselector","slidechoose"],"created_at":"2026-01-16T06:33:28.057Z","updated_at":"2026-01-16T06:33:28.146Z","avatar_url":"https://github.com/pichsy.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 图库选择器\n\n### 最新版本 ![](https://img.shields.io/maven-metadata/v.svg?label=maven-central\u0026metadataUrl=https%3A%2F%2Frepo1.maven.org%2Fmaven2%2Fcom%2Fgitee%2Fpichs%2Ffilepicker%2Fmaven-metadata.xml)\n\n- 使用最新版的 filepicker 库，必须使用最新版的xwidget库。都是 5.6.3 以上确保。\n- 用了很多，都没有丝滑的选择效果的开源库，滑动选择丝滑。闲来没事，随手写一个吧。\n- 图库选择，文件选择\n- 仿华为相册滑动选择手势逻辑，\n- 微信选择库样式风格\n- 支持多选，限制数量，不限制数量。\n- 使用场景，多用于 视频剪辑选择库，相册管理选择库。那去玩吧。\n\n### 好不好用，直接安装。\n\n- 扫码：![filepicker](https://www.pgyer.com/app/qrcode/CdA0TDQB)\n- 或者：点击下载 [app-debug.apk](app/release/app-debug.apk)\n\n# 依赖库，都是常用库，强烈建议 项目使用。\n\n- 下面的这个三方库，本maven仓库中的aar都过滤掉了。建议自己从下面引用，防止库冲突。\n\n## 最新版本\n\n1. **filepicker\n   ** ![](https://img.shields.io/maven-metadata/v.svg?label=maven-central\u0026metadataUrl=https%3A%2F%2Frepo1.maven.org%2Fmaven2%2Fcom%2Fgitee%2Fpichs%2Ffilepicker%2Fmaven-metadata.xml)\n2. **[xwidget](https://github.com/pichsy/xwidget)\n   **  ![](https://img.shields.io/maven-metadata/v.svg?label=maven-central\u0026metadataUrl=https%3A%2F%2Frepo1.maven.org%2Fmaven2%2Fcom%2Fgitee%2Fpichs%2Fxwidget%2Fmaven-metadata.xml)\n3. **BRV\n   **  ![](https://camo.githubusercontent.com/a94b501a064dd623ccd416f3c8262e8309b5a5ac74373d41980797e9ba286522/68747470733a2f2f6a69747061636b2e696f2f762f6c69616e676a696e676b616e6a692f4252562e737667)\n4. **BasePopup\n   ** ![](https://camo.githubusercontent.com/a3d2af2f4eff2d27ff650b3ae97271ec783ebc4e12db2fd6213402d57929ed9b/68747470733a2f2f696d672e736869656c64732e696f2f6d6176656e2d63656e7472616c2f762f696f2e6769746875622e72617a657264702f42617365506f707570)\n5. **androidx.media3** 这里建议使用***1.7.1***\n   稳定版 ![](https://img.shields.io/maven-metadata/v.svg?label=google-maven\u0026metadataUrl=https%3A%2F%2Fdl.google.com%2Fandroid%2Fmaven2%2Fandroidx%2Fmedia3%2Fmedia3-exoplayer%2Fmaven-metadata.xml)\n6. **glide** ![](https://img.shields.io/badge/glide-4.16.0-brightgreen.svg)\n\n```kotlin\ndependencies {\n    // 基础组件库 （必须）\n    implementation(\"com.gitee.pichs:filepicker:5.9.0\")\n\n    // 基础组件库 （必须）\n    implementation(\"com.gitee.pichs:xwidget:5.6.3\")\n\n    // glide 图片加载 （必须）\n    implementation(\"com.github.bumptech.glide:glide:4.16.0\")\n\n    //基础库（必须）\n    implementation(libs.androidx.core.ktx)\n    implementation(libs.androidx.appcompat)\n    implementation(libs.androidx.activity.ktx)\n    implementation(libs.androidx.fragment.ktx)\n    implementation(libs.material)\n    implementation(libs.androidx.recyclerview)\n    implementation(libs.androidx.annotation)\n    implementation(libs.kotlinx.coroutines.android)\n    implementation(libs.kotlinx.coroutines.core)\n\n    // brv （必须）\n    implementation(\"com.github.liangjingkanji:BRV:1.6.1\")\n    // 弹窗 （必须）\n    implementation(\"io.github.razerdp:BasePopup:3.2.1\")\n    // 视频播放库 （必须）采用exoplayer\n    implementation(\"androidx.media3:media3-exoplayer:1.7.1\")\n    implementation(\"androidx.media3:media3-ui:1.7.1\")\n}\n\n\n使用libs.version.toml用户引入方式\ndependencies {\n    api(libs.filepicker)\n    api(libs.xwidget)\n    api(libs.glide)\n    api(libs.brv)\n    api(libs.basepopup)\n    api(libs.media3.exoplayer)\n    api(libs.media3.ui)\n}\n\n# libs.version.toml中写法\n[versions]\nxwidget = \"5.6.3\"\nfilepicker = \"5.9.0\"\nbrv = \"1.6.1\"\nbasepopup = \"3.2.1\"\nglide = \"4.16.0\"\nactivityKtx = \"1.9.0\"\nfragmentKtx = \"1.6.2\"\nrecyclerview = \"1.4.0\"\nkotlinxCoroutinesAndroid = \"1.7.3\"\nkotlinxCoroutinesCore = \"1.7.3\"\nmedia3Exoplayer = \"1.7.1\"\n\n[libraries]\nandroidx-media3-exoplayer = { module = \"androidx.media3:media3-exoplayer\", version.ref = \"media3Exoplayer\" }\nandroidx-media3-ui = { module = \"androidx.media3:media3-ui\", version.ref = \"media3Exoplayer\" }\nandroidx-activity-ktx = { group = \"androidx.activity\", name = \"activity-ktx\", version.ref = \"activityKtx\" }\nandroidx-fragment-ktx = { group = \"androidx.fragment\", name = \"fragment-ktx\", version.ref = \"fragmentKtx\" }\nandroidx-recyclerview = { group = \"androidx.recyclerview\", name = \"recyclerview\", version.ref = \"recyclerview\" }\nkotlinx-coroutines-android = { group = \"org.jetbrains.kotlinx\", name = \"kotlinx-coroutines-android\", version.ref = \"kotlinxCoroutinesAndroid\" }\nkotlinx-coroutines-core = { group = \"org.jetbrains.kotlinx\", name = \"kotlinx-coroutines-core\", version.ref = \"kotlinxCoroutinesCore\" }\nxwidget = { group = \"com.gitee.pichs\", name = \"xwidget\", version.ref = \"xwidget\" }\nfilepicker = { group = \"com.gitee.pichs\", name = \"filepicker\", version.ref = \"filepicker\" }\nbasepopup = { group = \"io.github.razerdp\", name = \"BasePopup\", version.ref = \"basepopup\" }\nbrv = { group = \"com.github.liangjingkanji\", name = \"BRV\", version.ref = \"brv\" }\nglide = { group = \"com.github.bumptech.glide\", name = \"glide\", version.ref = \"glide\" }\n\n```\n\n\n# 动图效果\n\n![img2.gif](pics/img2.gif)\n\n# FilePicker 文件选择器 - 使用文档\n\n`FilePicker` 是一个支持图片、视频、文件选择的轻量级文件选择器，支持自定义配置、选中列表管理、回调返回选中数据。\n\n---\n\n## 快速入口\n\n* **支持 Activity 和 Fragment 调用**\n* **支持多选、最大数量控制、文件大小限制**\n* **支持返回原图选项**\n* **支持 UI 文案与界面定制**\n* **支持滑动选择**\n* **支持单选立即返回**\n* **支持预选列表**\n\n---\n\n## 基本用法\n\n### 1. 在 Activity 中启动\n\n```kotlin\nFilePicker.with(this) // this: FragmentActivity\n    .setSelectType(FilePicker.ofImage()) // 设置选择类型\n    .setMaxSelectNumber(9) // 设置最大选择数量\n    .setSlideChooseEnable(true) // 开启滑动选择\n    .setOnSelectCallback(object : OnSelectCallback {\n        override fun onSelectedCallback(isUseOriginal: Boolean, list: MutableList\u003cMediaEntity\u003e) {\n            // 选择完成回调\n            println(\"是否使用原图: $isUseOriginal\")\n            list.forEach {\n                println(\"文件路径: ${it.path}\")\n            }\n        }\n        override fun onCancel() {\n            // 取消选择\n        }\n    })\n    .setUiConfig(\n        FilePickerUIConfig(\n            isHideSelectTab = false,\n            allAlbumName = \"全部\",\n            confirmBtnText = \"发送\",\n            isShowOriginal = false,\n            isPreviewPageIndexMode = true,\n            isShowSelectedListDeleteIcon = true,\n            folderNickNameMap = hashMapOf(\n                \"DCIM\" to \"相册\"\n            )\n        )\n    ).\n    .start()\n```\n\n### 2. 在 Fragment 中启动\n\n```kotlin\nFilePicker.with(this) // this: Fragment\n    .setSelectType(FilePicker.ofImage())\n    .setMaxSelectNumber(5)\n    .setMaxFileSize(50 * 1024 * 1024) // 50MB\n    .setMinFileSize(1 * 1024) // 1KB\n    .setOnSelectCallback { isUseOriginal, list -\u003e\n        // 选择完成回调\n    }\n    .setUiConfig(\n        FilePickerUIConfig(\n            isHideSelectTab = true,\n            allAlbumName = \"全部\",\n            confirmBtnText = \"下一步\",\n            isShowOriginal = false,\n            isPreviewPageIndexMode = true,\n            isShowSelectedListDeleteIcon = true,\n            folderNickNameMap = hashMapOf(\n                \"DICM\" to \"相机\",\n                \"Download\" to \"下载\"\n            )\n        )\n    ).\n    .start()\n```\n\n---\n\n## API 文档\n\n### FilePicker\n\n| 方法名                         | 描述                        |\n|-----------------------------|---------------------------|\n| `with(activity)`            | 使用 `FragmentActivity` 初始化 |\n| `with(fragment)`            | 使用 `Fragment` 初始化         |\n| `ofImage()`                 | 只选择图片                     |\n| `ofVideo()`                 | 只选择视频                     |\n| `ofAll()`                   | 选择图片和视频                   |\n| `ofAllWithGif()`            | 选择图片、视频和GIF               |\n| `ofGif()`                   | 只选择GIF                    |\n| `ofAudio()`                 | 只选择音频                     |\n| `ofDocument()`              | 选择所有文档类型                  |\n| `ofPdf()`                   | 只选择PDF                    |\n| `ofDoc()`                   | 只选择DOC和DOCX               |\n| `ofPpt()`                   | 只选择PPT和PPTX               |\n| `ofExcel()`                 | 只选择XLS和XLSX               |\n| `ofTxt()`                   | 只选择TXT                    |\n| `ofApk()`                   | 只选择APK                    |\n| `ofZipAll()`                | 选择所有压缩包类型                 |\n| `ofZip()`                   | 只选择ZIP                    |\n| `ofRar()`                   | 只选择RAR                    |\n| `of7Z()`                    | 只选择7Z                     |\n| `ofTar()`                   | 只选择TAR                    |\n| `ofGz()`                    | 只选择GZ                     |\n| `ofBz2()`                   | 只选择BZ2                    |\n| `ofIso()`                   | 只选择ISO                    |\n| `convertToPathList(list)`   | 将 `MediaEntity` 列表转换为路径列表 |\n| `convertToEntityList(list)` | 将路径列表转换为 `MediaEntity` 列表 |\n\n### Builder\n\n| 方法名                             | 描述                                               |\n|---------------------------------|--------------------------------------------------|\n| `setSelectType(type)`           | 设置选择的文件类型                                        |\n| `setMaxSelectNumber(num)`       | 设置最大选择数量                                         |\n| `setMaxFileSize(size)`          | 设置最大文件大小（字节）                                     |\n| `setMinFileSize(size)`          | 设置最小文件大小（字节）                                     |\n| `setSlideChooseEnable(enable)`  | 是否启用滑动选择，默认 `true`                               |\n| `setSingleClickEnable(enable)`  | 是否启用单选立即返回，默认 `false`。仅在 `maxSelectNumber` 为1时生效 |\n| `setSelectedList(list)`         | 设置已选中的 `MediaEntity` 列表                          |\n| `setSelectedPathList(list)`     | 设置已选中的文件路径列表                                     |\n| `setUiConfig(config)`           | 设置自定义UI配置                                        |\n| `setOnSelectCallback(callback)` | 设置选择结果回调                                         |\n| `start()`                       | 启动选择器                                            |\n\n### UI 自定义配置 (FilePickerUIConfig)\n\n通过 `FilePicker.with(this).setUiConfig(uiConfig)` 进行设置。\n\n```kotlin\nval uiConfig = FilePickerUIConfig().apply {\n    isHideSelectTab = false\n    confirmBtnText = \"完成\"\n    allAlbumName = \"所有文件\"\n    // ... 更多配置\n}\n```\n\n| 属性                                       | 类型                        | 描述                | 默认值                 |\n|------------------------------------------|---------------------------|-------------------|---------------------|\n| `isHideSelectTab`                        | `Boolean`                 | 是否隐藏顶部分类Tab       | `false`             |\n| `confirmBtnText`                         | `String`                  | 确定按钮的文本           | `\"确定\"`              |\n| `isPreviewPageIndexMode`                 | `Boolean`                 | 预览页面是否显示页码        | `true`              |\n| `allAlbumName`                           | `String`                  | “全部”文件夹的显示名称      | `\"全部\"`              |\n| `previewText`                            | `String`                  | 预览页面的标题           | `\"预览\"`              |\n| `isShowBottomPreviewText`                | `Boolean`                 | 是否显示底部预览按钮        | `true`              |\n| `previewSelectText`                      | `String`                  | 预览页面底部“选择”按钮文本    | `\"选择\"`              |\n| `originalText`                           | `String`                  | “原图”选项的文本         | `\"原图\"`              |\n| `isShowOriginal`                         | `Boolean`                 | 是否显示“原图”选项        | `true`              |\n| `isOriginalChecked`                      | `Boolean`                 | “原图”选项是否默认选中      | `false`             |\n| `isShowHomePageSelectedBottomListWidget` | `Boolean`                 | 是否显示主页底部已选列表      | `true`              |\n| `isShowSelectedListDeleteIcon`           | `Boolean`                 | 是否显示已选列表项的删除按钮    | `false`             |\n| `selectedListDeleteIconResId`            | `Int`                     | 已选列表项删除按钮的图标资源ID  | `0`                 |\n| `selectedListDeleteIconBackgroundColor`  | `Int`                     | 已选列表项删除按钮的背景色     | `Color.TRANSPARENT` |\n| `atLeastSelectOneToastContent`           | `String`                  | 未选择任何文件时的提示       | `\"至少选择一个\"`          |\n| `selectMaxNumberOverToastContent`        | `String`                  | 超出最大选择数量时的提示      | `\"已达到最大选择数量\"`       |\n| `folderNickNameMap`                      | `HashMap\u003cString, String\u003e` | 文件夹名称映射，用于自定义显示名称 | `emptyHashMap()`    |\n\n---\n\n\u003c/br\u003e\n## !!!温馨提示： 如果UI效果与你的需求差距较大，强烈建议下载源码，自己修改一下。fork代码，自己改。!!!\n\u003c/br\u003e\n\n---\n\n## 结束语\n\n`FilePicker` 旨在提供简洁、灵活、可定制的文件选择功能，广泛适用于相册、文件管理、视频选择等场景。\n\n如需深入定制或遇到问题，欢迎补充需求，我可以帮您生成对应的开发指导。\n\n## 特别鸣谢\n\n本项目在开发过程中参考和使用了以下优秀的开源项目，特此致谢：\n\n- [xwidget](https://github.com/pichsy/xwidget) - 提供了超级方便的基础组件。\n- [BRV](https://github.com/liangjingkanji/BRV) —— 便捷的 RecyclerView 适配器库\n- [BasePopup](https://github.com/razerdp/BasePopup) —— 强大的弹窗库\n- [Glide](https://github.com/bumptech/glide) —— 高效的图片加载库\n- [androidx.media3](https://developer.android.com/jetpack/androidx/releases/media3) —— 官方视频播放组件\n\n感谢你们的无私奉献，让开发变得更加高效和有趣！\n\n## 升级日志\n\n### 5.9.0\n\n- 解决选择图片过多，intent超过1M的问题。随便选无上限\n- 优化index数字过大展示不全的问题。目前支持到 99999 张\n- 增加文件夹别名设置setUiConfig中folderNickNameMap里自行添加，默认不添加。也可做翻译文件夹用。仅文件夹哦。\n- 其他的UI上的文字都在FilePickerUIConfig中有对应属性，请仔细查看文档。\n\n\n### 5.8.0 stable版本\n\n- 修复最后一行选中图片被遮挡的问题\n- 优化放大图标，更好看了。\n\n### 5.7.0\n\n- 优化过多图片首屏展示慢的问题。\n\n### 5.6.3\n\n- 修复音频播放放到后台还在继续的问题。\n\n### 5.6.2\n\n- 适配xwidget的工具类，适配底部导航栏。xwidget库务必使用最新 5.6.2 版本。\n- 为了让版本 跟[xwidget](https://github.com/pichsy/xwidget)关联，方便使用和记忆，版本号跟[xwidget](https://github.com/pichsy/xwidget)统一了。\n\n### 4.6.1\n\n- 剔除日志影响\n\n### 4.6.0\n\n- 新版UI 点击更丝滑\n\n### 4.5.1\n\n- 适配底部小横导航栏\n- 优化UI选择样式\n\n### 4.3.0 (预计)\n\n- **新增**：支持更多文件类型选择，如文档（audio, pdf, doc, ppt, excel, txt）、APK、各类压缩包等。\n- **新增**：`setSingleClickEnable(boolean)` API，支持单选模式下单击立即返回。\n- **新增**：`setSlideChooseEnable(boolean)` API，可禁用滑动选择手势。\n- **新增**：`FilePickerUIConfig` 中增加 `isHideSelectTab`、`allAlbumName`、`isShowBottomPreviewText` 等UI配置项。\n\n### 4.2.0\n\n- 修复maxFileSize默认值:目前改为Long.MAX_VALUE .\n\n### 4.1.0\n\n- 适配手机底部导航栏，为屏幕内虚拟三键的情况。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpichsy%2Ffilepicker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpichsy%2Ffilepicker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpichsy%2Ffilepicker/lists"}