{"id":17102781,"url":"https://github.com/lucksiege/pictureselectorlight","last_synced_at":"2025-04-13T00:40:30.958Z","repository":{"id":108437479,"uuid":"90223695","full_name":"LuckSiege/PictureSelectorLight","owner":"LuckSiege","description":"Picture Selector Library for Android  or 图片选择器","archived":false,"fork":false,"pushed_at":"2019-12-19T06:07:52.000Z","size":4610,"stargazers_count":152,"open_issues_count":20,"forks_count":37,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-03-26T18:43:41.013Z","etag":null,"topics":["camera","image","photos","pictureselector","video"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LuckSiege.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2017-05-04T05:06:51.000Z","updated_at":"2024-12-16T06:53:45.000Z","dependencies_parsed_at":"2023-06-01T02:15:10.711Z","dependency_job_id":null,"html_url":"https://github.com/LuckSiege/PictureSelectorLight","commit_stats":null,"previous_names":[],"tags_count":20,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LuckSiege%2FPictureSelectorLight","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LuckSiege%2FPictureSelectorLight/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LuckSiege%2FPictureSelectorLight/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LuckSiege%2FPictureSelectorLight/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LuckSiege","download_url":"https://codeload.github.com/LuckSiege/PictureSelectorLight/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248650414,"owners_count":21139671,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["camera","image","photos","pictureselector","video"],"created_at":"2024-10-14T15:29:58.935Z","updated_at":"2025-04-13T00:40:30.931Z","avatar_url":"https://github.com/LuckSiege.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PictureSelectorLight 2.0 无裁剪功能版  \n  一款针对android平台下的图片选择器，支持从相册或拍照选择图片或视频、音频，支持动态权限获取、压缩、主题自定义配置等功能、适配android 6.0+系统的开源图片选择框架。 \n  \n  \n  项目会一直维护(有bug修复完成，一般周末会更新)，发现问题欢迎提出会第一时间修复，QQ交流群 [619458861](http://shang.qq.com/wpa/qunwpa?idkey=91eb68229f9106b90ae9fa12d01b74815dd86b26c6c8d1dcbc9a27c1d87c42a0)，个人QQ 893855882@qq.com  希望用得着的朋友点个star。 \n  \n  [PictureSelector 2.0完整版](https://github.com/LuckSiege/PictureSelector)\n  \n  [我的博客地址](http://blog.csdn.net/luck_mw) \n  \n[![](https://jitpack.io/v/LuckSiege/PictureSelectorLight.svg)](https://jitpack.io/#LuckSiege/PictureSelectorLight)\n[![PRs Welcome](https://img.shields.io/badge/PRs-Welcome-brightgreen.svg)](https://github.com/LuckSiege)\n[![CSDN](https://img.shields.io/twitter/url/http/blog.csdn.net/luck_mw.svg?style=social)](http://blog.csdn.net/luck_mw)\n[![I](https://img.shields.io/github/issues/LuckSiege/PictureSelector.svg)](https://github.com/LuckSiege/PictureSelector/issues)\n\n## 目录\n-[功能特点](#功能特点)\u003cbr\u003e\n-[集成方式](#集成方式)\u003cbr\u003e\n-[常见错误](#常见错误)\u003cbr\u003e\n-[功能配置](#功能配置)\u003cbr\u003e\n-[缓存清除](#缓存清除)\u003cbr\u003e\n-[主题配置](#主题配置)\u003cbr\u003e\n-[常用功能](#常用功能)\u003cbr\u003e\n-[结果回调](#结果回调)\u003cbr\u003e\n-[更新日志](#更新日志)\u003cbr\u003e\n-[混淆配置](#混淆配置)\u003cbr\u003e\n-[兼容性测试](#兼容性测试)\u003cbr\u003e\n-[演示效果](#演示效果)\u003cbr\u003e\n\n### 功能特点  \n\n* 1.适配android6.0+系统\n* 2.解决图片过大oom闪退问题\n* 3.动态获取系统权限，避免闪退\n* 4.支持相片or视频的单选和多选\n* 5.支持视频预览\n* 6.支持gif图片\n* 7.支持.webp格式图片 \n* 8.支持一些常用场景设置：如:是否预览图片、是否显示相机等\n* 9.新增自定义主题设置\n* 10.新增图片勾选样式设置\n* 11.新增图片压缩处理\n* 12.新增录视频最大时间设置\n* 13.新增视频清晰度设置\n* 14.新增QQ选择风格，带数字效果\n* 15.新增自定义 文字颜色 背景色让风格和项目更搭配\n* 16.新增LuBan多图压缩\n* 17.新增单独拍照功能\n* 18.新增压缩大小设置\n* 19.新增Luban压缩档次设置\n* 20.新增音频功能查询\n\n******那些遇到拍照闪退问题的同学，请记得看清下面适配6.0的配置~******\n\n重要的事情说三遍记得添加权限\n\n```\n  \u003cuses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" /\u003e\n  \u003cuses-permission android:name=\"android.permission.CAMERA\" /\u003e\n    \n```\n\n******注：适配android6.0以上拍照问题，请在AndroidManifest.xml中添加标签******\n\n```\n\u003cprovider\n   android:name=\"android.support.v4.content.FileProvider\"\n   android:authorities=\"${applicationId}.provider\"\n   android:exported=\"false\"\n   android:grantUriPermissions=\"true\"\u003e\n     \u003cmeta-data\n         android:name=\"android.support.FILE_PROVIDER_PATHS\"\n         android:resource=\"@xml/file_paths\" /\u003e\n\u003c/provider\u003e\n\n```\n\n## 集成方式\n\n方式一 compile引入\n\n```\ndependencies {\n    compile 'com.github.LuckSiege:PictureSelectorLight:v2.1.1'\n}\n\n```\n\n项目根目录build.gradle加入 \n\n```\nallprojects {\n   repositories {\n      jcenter()\n      maven { url 'https://jitpack.io' }\n   }\n}\n```\n\n方式二 maven引入 \n\nstep 1.\n```\n\u003crepositories\u003e\n       \u003crepository\u003e\n       \u003cid\u003ejitpack.io\u003c/id\u003e\n\t\u003curl\u003ehttps://jitpack.io\u003c/url\u003e\n       \u003c/repository\u003e\n \u003c/repositories\u003e\n```\nstep 2.\n```\n\u003cdependency\u003e\n   \u003cgroupId\u003ecom.github.LuckSiege\u003c/groupId\u003e\n   \u003cartifactId\u003ePictureSelectorLight\u003c/artifactId\u003e\n   \u003cversion\u003ev2.1.1\u003c/version\u003e\n\u003c/dependency\u003e\n\n\n```\n\n## 常见错误\n```\n 问题一：\n rxjava冲突：在app build.gradle下添加\n packagingOptions {\n   exclude 'META-INF/rxjava.properties'\n }  \n \n 问题二：\n java.lang.NullPointerException: \n Attempt to invoke virtual method 'android.content.res.XmlResourceParser \n android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)'\n on a null object reference\n \n application下添加如下节点:\n \n \u003cprovider\n      android:name=\"android.support.v4.content.FileProvider\"\n      android:authorities=\"${applicationId}.provider\"\n      android:exported=\"false\"\n      android:grantUriPermissions=\"true\"\u003e\n       \u003cmeta-data\n         android:name=\"android.support.FILE_PROVIDER_PATHS\"\n         android:resource=\"@xml/file_paths\" /\u003e\n\u003c/provider\u003e\n\n注意：如已添加其他sdk或项目中已使用过provider节点，\n[请参考我的博客](http://blog.csdn.net/luck_mw/article/details/54970105)的解决方案\n\n问题三：\nPhotoView 库冲突，可以删除自己项目中引用的，Picture_library中已经引用过\ncom.github.chrisbanes.photoview:library:1.2.4\n \n问题四：\n经测试在小米部分低端机中，Fragment调用PictureSelector 2.0 拍照有时内存不足会暂时回收activity,\n导致其fragment会重新创建 建议在fragment所依赖的activity加上如下代码:\nif (savedInstanceState == null) {\n      // 添加显示第一个fragment\n      \tfragment = new PhotoFragment();\n      \t\tgetSupportFragmentManager().beginTransaction().add(R.id.tab_content, fragment,\n                    PictureConfig.FC_TAG).show(fragment)\n                    .commit();\n     } else {\n      \tfragment = (PhotoFragment) getSupportFragmentManager()\n          .findFragmentByTag(PictureConfig.FC_TAG);\n}\n这里就是如果是被回收时，则不重新创建 通过tag取出fragment的实例。\n\n```\n\n## 功能配置\n```\n// 进入相册 以下是例子：不需要的api可以不写\n   PictureSelector.create(MainActivity.this)\n         .openGallery()// 全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()\n         .theme()//主题样式(不设置为默认样式) 也可参考demo values/styles下 例如：R.style.picture.white.style\n         .maxSelectNum()// 最大图片选择数量 int\n         .minSelectNum()// 最小选择数量 int \n\t .imageSpanCount(4)// 每行显示个数 int \n         .selectionMode()// 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE\n         .previewImage()// 是否可预览图片 true or false\n         .previewVideo()// 是否可预览视频 true or false\n\t .enablePreviewAudio() // 是否可播放音频  true or false\n         .compressGrade()// luban压缩档次，默认3档 Luban.THIRD_GEAR、Luban.FIRST_GEAR、Luban.CUSTOM_GEAR\n         .isCamera()// 是否显示拍照按钮 ture or false\n\t .isZoomAnim(true)// 图片列表点击 缩放效果 默认true\n\t .sizeMultiplier(0.5f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效\n\t .setOutputCameraPath(\"/Chinayie/App\")// 自定义拍照保存路径,可不填\n         .compress()// 是否压缩 true or false\n         .compressMode()//系统自带 or 鲁班压缩 PictureConfig.SYSTEM_COMPRESS_MODE or LUBAN_COMPRESS_MODE\n         .glideOverride()// glide 加载宽高，越小图片列表越流畅，但会影响列表图片浏览的清晰度 int\n         .isGif()// 是否显示gif图片 true or false\n         .openClickSound()// 是否开启点击声音 true or false \n         .selectionMedia()// 是否传入已选图片 List\u003cLocalMedia\u003e list\n         .previewEggs()// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中) true or false      \n         .compressMaxKB()//压缩最大值kb compressGrade()为Luban.CUSTOM_GEAR有效 int \n         .compressWH() // 压缩宽高比 compressGrade()为Luban.CUSTOM_GEAR有效 int \n         .videoQuality()// 视频录制质量 0 or 1 int \n         .videoSecond()//显示多少秒以内的视频or音频也可适用 int \n\t .recordVideoSecond()//录制视频秒数 默认60s int \n         .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code\n```\n## 缓存清除\n```\n //包括压缩后的缓存，要在上传成功后调用，注意：需要系统sd卡权限 \n PictureFileUtils.deleteCacheDirFile(MainActivity.this);\n \n```\n## 主题配置\n\n```\n\u003c!--默认样式 注意* 样式只可修改，不能删除任何一项 否则报错--\u003e\n    \u003cstyle name=\"picture.default.style\" parent=\"Theme.AppCompat.Light.DarkActionBar\"\u003e\n        \u003c!-- Customize your theme here. --\u003e\n        \u003c!--标题栏背景色--\u003e\n        \u003citem name=\"colorPrimary\"\u003e@color/bar_grey\u003c/item\u003e\n        \u003c!--状态栏背景色--\u003e\n        \u003citem name=\"colorPrimaryDark\"\u003e@color/bar_grey\u003c/item\u003e\n        \u003c!--是否改变图片列表界面状态栏字体颜色为黑色--\u003e\n        \u003citem name=\"picture.statusFontColor\"\u003efalse\u003c/item\u003e\n        \u003c!--返回键图标--\u003e\n        \u003citem name=\"picture.leftBack.icon\"\u003e@drawable/picture_back\u003c/item\u003e\n        \u003c!--标题下拉箭头--\u003e\n        \u003citem name=\"picture.arrow_down.icon\"\u003e@drawable/arrow_down\u003c/item\u003e\n        \u003c!--标题上拉箭头--\u003e\n        \u003citem name=\"picture.arrow_up.icon\"\u003e@drawable/arrow_up\u003c/item\u003e\n        \u003c!--标题文字颜色--\u003e\n        \u003citem name=\"picture.title.textColor\"\u003e@color/white\u003c/item\u003e\n        \u003c!--标题栏右边文字--\u003e\n        \u003citem name=\"picture.right.textColor\"\u003e@color/white\u003c/item\u003e\n        \u003c!--图片列表勾选样式--\u003e\n        \u003citem name=\"picture.checked.style\"\u003e@drawable/checkbox_selector\u003c/item\u003e\n        \u003c!--开启图片列表勾选数字模式--\u003e\n        \u003citem name=\"picture.style.checkNumMode\"\u003efalse\u003c/item\u003e\n        \u003c!--选择图片样式0/9--\u003e\n        \u003citem name=\"picture.style.numComplete\"\u003efalse\u003c/item\u003e\n        \u003c!--图片列表底部背景色--\u003e\n        \u003citem name=\"picture.bottom.bg\"\u003e@color/color_fa\u003c/item\u003e\n        \u003c!--图片列表预览文字颜色--\u003e\n        \u003citem name=\"picture.preview.textColor\"\u003e@color/tab_color_true\u003c/item\u003e\n        \u003c!--图片列表已完成文字颜色--\u003e\n        \u003citem name=\"picture.complete.textColor\"\u003e@color/tab_color_true\u003c/item\u003e\n        \u003c!--图片已选数量圆点背景色--\u003e\n        \u003citem name=\"picture.num.style\"\u003e@drawable/num_oval\u003c/item\u003e\n        \u003c!--预览界面标题文字颜色--\u003e\n        \u003citem name=\"picture.ac_preview.title.textColor\"\u003e@color/white\u003c/item\u003e\n        \u003c!--预览界面已完成文字颜色--\u003e\n        \u003citem name=\"picture.ac_preview.complete.textColor\"\u003e@color/tab_color_true\u003c/item\u003e\n        \u003c!--预览界面标题栏背景色--\u003e\n        \u003citem name=\"picture.ac_preview.title.bg\"\u003e@color/bar_grey\u003c/item\u003e\n        \u003c!--预览界面底部背景色--\u003e\n        \u003citem name=\"picture.ac_preview.bottom.bg\"\u003e@color/bar_grey_90\u003c/item\u003e\n        \u003c!--预览界面状态栏颜色--\u003e\n        \u003citem name=\"picture.status.color\"\u003e@color/bar_grey_90\u003c/item\u003e\n        \u003c!--预览界面返回箭头--\u003e\n        \u003citem name=\"picture.preview.leftBack.icon\"\u003e@drawable/picture_back\u003c/item\u003e\n        \u003c!--是否改变预览界面状态栏字体颜色为黑色--\u003e\n        \u003citem name=\"picture.preview.statusFontColor\"\u003efalse\u003c/item\u003e\n        \u003c!--裁剪页面标题背景色--\u003e\n        \u003citem name=\"picture.crop.toolbar.bg\"\u003e@color/bar_grey\u003c/item\u003e\n        \u003c!--裁剪页面状态栏颜色--\u003e\n        \u003citem name=\"picture.crop.status.color\"\u003e@color/bar_grey\u003c/item\u003e\n        \u003c!--裁剪页面标题文字颜色--\u003e\n        \u003citem name=\"picture.crop.title.color\"\u003e@color/white\u003c/item\u003e\n        \u003c!--相册文件夹列表选中图标--\u003e\n        \u003citem name=\"picture.folder_checked_dot\"\u003e@drawable/orange_oval\u003c/item\u003e\n    \u003c/style\u003e\n\n```\n## 常用功能\n\n******启动相册并拍照******       \n```\n  PictureSelector.create(MainActivity.this)\n       .openGallery(PictureMimeType.ofImage())\n       .forResult(PictureConfig.CHOOSE_REQUEST);\n```\n\n******单独启动拍照或视频 根据PictureMimeType自动识别******       \n```\n PictureSelector.create(MainActivity.this)\n       .openCamera(PictureMimeType.ofImage())\n       .forResult(PictureConfig.CHOOSE_REQUEST);\n```\n******预览图片******       \n```\n // 预览图片 可自定长按保存路径\nPictureSelector.create(MainActivity.this).externalPicturePreview(position, \"/custom_file\", selectList);\nPictureSelector.create(MainActivity.this).externalPicturePreview(position, selectList);\n\n```\n******预览视频****** \n```\nPictureSelector.create(MainActivity.this).externalPictureVideo(video_path);\n```\n## 结果回调\n```\n    @Override\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n        if (resultCode == RESULT_OK) {\n            switch (requestCode) {\n                case PictureConfig.CHOOSE_REQUEST:\n                    // 图片选择结果回调\n                    selectList = PictureSelector.obtainMultipleResult(data);\n                    // 例如 LocalMedia 里面返回两种path\n                    // 1.media.getPath(); 为原图path\n                    // 2.media.getCompressPath();为压缩后path，需判断media.isCompressed();是否为true \n                    adapter.setList(selectList);\n                    adapter.notifyDataSetChanged();\n                    DebugUtil.i(TAG, \"onActivityResult:\" + selectList.size());\n                    break;\n            }\n        }\n    }\n    \n```\n\n## 更新日志\n\n### 当前版本：\n* v2.1.1\n* 升级glide4.0为正式版\n\n### 历史版本：\n* v2.1.0\n* 修复android 7.1.1系统 PopupWindow弹出位置不对问题\n* 删除多余代码\n* 修复全部模式下设置查询视频秒数无效问题\n\n* v2.0.9\n* 修复直接播放视频闪退bug\n* 升级glide为4.0.0 rc1\n* 新增图片列表点击缩放效果api\n\n* v2.0.7\n* 修复已知bug\n\n* v2.0.6\n* 新增拍照自定义保存路径\n\n### 项目使用第三方库：\n* glide:4.0.0 RC1\n* rxjava:2.0.5\n* rxandroid:2.0.1\n* PhotoView:1.2.4\n* luban\n\n## 混淆配置\n```\n#PictureSelector 2.0\n -keep class com.luck.picture.lib.** { *; }\n   \n #rxjava\n-dontwarn sun.misc.**\n-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {\n long producerIndex;\n long consumerIndex;\n}\n-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {\n rx.internal.util.atomic.LinkedQueueNode producerNode;\n}\n-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {\n rx.internal.util.atomic.LinkedQueueNode consumerNode;\n}\n\n#rxandroid\n-dontwarn sun.misc.**\n-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {\n   long producerIndex;\n   long consumerIndex;\n}\n-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {\n    rx.internal.util.atomic.LinkedQueueNode producerNode;\n}\n-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {\n    rx.internal.util.atomic.LinkedQueueNode consumerNode;\n}\n\n#glide\n-keep public class * implements com.bumptech.glide.module.GlideModule\n-keep public class * extends com.bumptech.glide.AppGlideModule\n-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flucksiege%2Fpictureselectorlight","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flucksiege%2Fpictureselectorlight","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flucksiege%2Fpictureselectorlight/lists"}