EasyPhotos

Project Url: joker-fu/EasyPhotos
Introduction: 兼容 android 10,自定义相机拍照。android 图片选择、裁剪、压缩,自定义相机仿微信拍照,相册选择(单选/多选),文件夹图片选择(单选/多选),各界面根据状态栏颜色智能适配状态栏字体颜色变色为深色或浅色,根据使用场景智能适配沉浸式状态栏,内部处理运行时权限,支持 Glide/Picasso/Fresco/Imageloader 等所有图片加载框架库的带默认勾选选中图片的能填充自定义广告的自定义 Ui 相机相册图片浏览选择器;更有拼图/文字贴纸/贴图/图片缩放/Bitmap 图片添加水印/媒体文件更新到媒体库等众多 Bitmap 图片编辑功能的 android Bitmap 图片处理工具框架库。
More: Author   ReportBugs   
Tags:

EasyPhotos地址

适配完成 Android10 之后,将主要维护 master 分支(AndroidX),support 分支仅修复 bug。

Download License

demo 下载 QQ 群

无选中状态(默认 UI 色调) 选中状态( 自定义 UI 色调 其他功能(各功能可自选)
专辑列表(默认 UI 色调) 相册带广告( 自定义 UI 色调 专辑列表带广告
预览页 预览页单击图片转全屏模式 预览页缩放图片
预览页单击缩放图片显示操作栏 拼图选择页 拼图选择页
拼图页 拼图页拼图功能 拼图页文字贴纸功能
文字贴纸编辑页 示例功能列表 示例功能列表
覆盖层

产品特色

  • 支持单选/多选场景,支持设置单选直接返回,支持单图裁剪
  • 支持绑定 Glide、Picasso、Imageloader 等所有图片加载库(fresco 暂不支持),EasyPhotos 并没有对他们进行依赖,不必担心冲突和体积问题。
  • 状态栏字体颜色智能适配,当状态栏颜色趋近于白色时,字体颜色智能处理为深色
  • 内部处理运行时权限,使用者无需考虑权限问题
  • 拼一张功能(可配置开关,可独立作为拼图使用)
  • 原图功能(可配置开关)
  • 广告填充(可配置开关)
  • 过滤图片(图片宽度、图片高度、文件大小三个维度任意选择和搭配)
  • 默认勾选图片(可配置)
  • 图片预览(可全屏,可缩放,支持长图)
  • 支持动图 gif 显示,并支持仅选择动图 gif
  • 支持视频 video 显示,并支持仅选择 Video
  • UI 色值高度浓缩,自定义超简单
  • 对 Gif 动图的处理(可配置开关是否显示,列表中以静态图+动图标识显示,预览大图时自动播放)
  • 自带 Bitmap 相关方法(如添加水印、把 View 画成 Bitmap、保存 Bitmap 等)
  • 自带媒体库相关方法(如媒体文件更新到媒体库)
  • 支持仿微信拍照和视频录制,并支持添加覆盖蒙层(指示层),适用于拍证件等
  • 外部可调用 EasyPhotos 进行图片预览
  • 支持外部扩展视频播放(由外部实现视频播放逻辑)
  • 支持外部扩展图片/视频压缩操作(由外部实现压缩逻辑)
  • 支持 Support 和 AndroidX
  • 兼容 API19 ~ API29

获取 EasyPhotos(通过 Gradle 方式)

  1. 在项目的 build.gradle(project) 文件里面添加:
    allprojects {
     repositories {  
         maven { url "https://jitpack.io" }
     }
    }
    
  2. 你需要用到 EasyPhotos 的 module 中的 build.gradle(module) 文件里面添加:

Download

dependencies {  
   implementation 'com.joker.HuanTanSheng:EasyPhotos:_latestVersion'  

   //例如:
   //support:implementation 'com.joker.HuanTanSheng:EasyPhotos:2.5.0'
   //androidX:implementation 'com.joker.HuanTanSheng:EasyPhotos:andX-2.5.0'
}

如果你的 android studio 版本不同于 3.4.2 正式版,有可能会打不开我的 Demo,只需要修改 Demo 里面 build.gradle(project) 文件中的:

dependencies {
    //把 3.4.2 改成你对应的版本即可,如果不清楚对应版本可以看看你其他正常项目的这里是怎么写的  
    classpath 'com.android.tools.build:gradle:3.4.2'
}

关于混淆

EasyPhotos 的混淆:


-keep class com.huantansheng.easyphotos.models.** { *; }

EasyPhotos 文档总录

QQ 交流群:288600953 )

编者语

EasyPhotos 将在高颜值、高兼容、高性能、强功能的道路上持续更新,欢迎各种 Issues,我将及时反馈,谢谢!
QQ 交流群:288600953

更新日志

2.5.3:

  • 修复 attr 问题

2.5.2:

  • 补发 UCrop 兼容包,它兼容 Android10,其他与原库无异,等原库兼容将替换为原库
  • 调整交互

2.5.1:

  • 调整 UCrop 为无 JNI 版本(之前用了 JNI 版本)
  • 调整 UCrop 裁剪兼容 Android10 方案
  • 调整 UI
  • 因漏发 UCrop 兼容包,已删除

2.5.0:

  • 兼容 Android10,且 Photo.path 低于 10 返回绝对路径,高于 10 返回 uri.toString(拼图/水印/裁剪/自定义相机拍照,由于 UCrop 还未兼容 10,所以暂时改为源码依赖)
  • 调整默认 Setting 相机参数(默认使用系统相机)
  • 因兼容 Android10,调整部分方法参数(saveBitmapToDir 去掉 dirPath, namePrefix 参数,默认存储在 DCIM;startPuzzleWithPhotos/startPuzzleWithPaths 去掉 puzzleSaveDirPath, puzzleSaveNamePrefix 参数 )
  • 因漏发 UCrop 兼容包,已删除

2.4.8_beta9:

  • 调整自定义属性名称

2.4.8_beta8:

  • 修复初次获取权限时 FileProvider 问题

2.4.8_beta7:

  • 修复视频预览回调 bug

2.4.8_beta6:

  • 优化覆盖层
  • 增加覆盖层 demo
  • 优化代码

2.4.8_beta5:

  • 优化
  • 增加 enableSingleCheckedBack(bool),支持单选场景选中直接返回

2.4.8_beta4:

  • 修复拼图 bug

2.4.8_beta3:

  • 支持系统相机和仿微信相机切换 enableSystemCamera(bool)
  • 优化文件存储

2.4.8_beta2:

  • 优化长图预览双击
  • 优化加载进度显示

2.4.8_beta1:

  • 修改预览问题
  • 修改 callback 返回路径集合
  • 优化部分代码

2.4.8:

  • 优化相机参数/调整录制比特率
  • 整理项目包结构

2.4.7:

  • 发布 2.4.7 正式版
  • 支持 AndroidX
  • 2.4.8 开始调整版本顺序为 x.x.x->x.x.x_betax

2.4.7_beta3:

  • bugfix

2.4.7_beta2:

  • 优化代码
  • 增加压缩引擎 CompressEngine 接口(具体由外部实现压缩逻辑)
  • 增加压缩相关 API(isCompress(bool)、setCompressEngine(CompressEngine))

2.4.7_beta1:

  • 提供 EasyPhotos 预览供外部使用
  • 互斥选择支持分开计数(感谢hubin920218
  • 优化部分代码和 Strings.xml

2.4.6:

  • 优化图片预览

2.4.6_beta9:

  • 更换图片预览实现,支持长图预览

2.4.6_beta8:

  • 支持文件最大 Size 限制 setMaxFileSize
  • 支持互斥选择(不能同时选择图片或视频) setSelectMutualExclusion
    新增互斥选择文案:
    <string name="selector_mutual_exclusion_easy_photos">不能同时选择图片或视频</string>
    
    2.4.6_beta7:
  • 优化根据路径默认选中代码
  • 优化代码中一些命名

2.4.6_beta6:

  • 修复 setSelectedPhotoPaths 不能默认选中问题

注意:

 //推荐使用 setSelectedPhotos 方式

2.4.6_beta5:

  • 新增动图 gif 单独显示,注意先 showGif()

2.4.6_beta4:

  • 新增相机提示文字控制 enableCameraTips
  • 新增相机界面配色
  • 优化相机录像提示文字逻辑
    新增相机界面配色
    <color name="easy_photos_camera_fg_primary">#ffffff</color>//ffffff 相机前景主色,如字体颜色、icon 颜色
    <color name="easy_photos_camera_fg_accent">#00AA00</color>//578fff 相机前景突出色,如录制进度颜色,对焦框颜色 0xEE16AE16
    

2.4.6_beta3:

  • 新增:setHideBottomControls 控制 UCrop 底部控制栏是否显示
  • 优化:移除 setFileProviderAuthority 方法(注意:如已添加其他 sdk 或项目中已使用过 provider 节点, 请参考博客的解决方案)

2.4.6_beta2:

  • 优化:优化选中和默认选中等逻辑
  • 优化:Photo 支持裁剪路径和原图路径

2.4.6_beta1:

  • 新增:支持点击拍照和长按录像,替换系统相机功能,CameraView 基础上实现
  • 新增:基于 uCrop 图片单张裁剪,依赖 uCrop 实现
  • 优化:相册读取,提升读取速度(2.1W 张图片和视频由原本 1s+提升到 300+ms)
  • 优化:优化部分 API,移除过时代码
  • 优化:支持水印文本换行显示

说明: 2.4.5 及之前版本或有意使用原版请前往EasyPhotos

2.4.5:

  • 修复:当相机按钮位置在图片第一张时,点击相册页底部中间的编辑按钮会导致右下角相机按钮也显示出来
  • 修复:仅显示视频时,全部视频文件夹视频重复添加问题
  • 修复:点击视频无法播放问题
  • 感谢:该版本由SMask贡献

2.4.4:

  • 修复:修复 2.4.3 版本引发的图片数据加载缓慢问题
  • 感谢:该版本由joker-fu贡献

2.4.3:

  • 新增:start(SelectCallback callback)启动方式,通过接口回调(注意:如果 callback 不回调,请检查你调用处的 spuper.onActivityResult()是否删除)
  • 新增:filter(String... types)方式控制只显示的文件类型,支持 Type.GIF 和 Type.VIDEO,前提是已经选择显示了 gif 和 video
  • 新增:对显示视频的时长过滤 api
  • 新增:单独对图片和视频的最大选择数控制
  • 新增:支持相机按钮位置设置,setCameraLocation(@Setting.Location int cLocation)//默认左下角,通过设置可设置为相册第一张图片的位置
  • 优化:预览页
  • 感谢:该版本由joker-fuSMask贡献
  • 提示:新的 api 详见wiki

2.4.1:

  • 优化:2.4.0 中的代码
  • 感谢:该版本由joker-fuSMask贡献

2.4.0:

  • 感谢:该版本由joker-fu贡献
  • 新增:视频选择功能
  • 新增 API:是否启动视频选择,setVideo(boolean shouldShow)
  • 优化:默认不显示 gif 图,可通过 setGif(boolean shouldShow)控制是否显示

2.3.6:

  • 修复:2.3.5 出现的拼图错误
  • 优化:解决部分机型在全屏预览图片返回到相册选择界面时状态栏闪烁的问题(感谢@wqxcloud)
  • 优化:相册 UI(将原底部操作栏中间的设置按钮样式改为编辑样式)
  • 新增:相册页底部操作栏中间的编辑按钮,会根据开发者配置的清空按钮、原图按钮、拼图按钮使用情况进行显示或隐藏。(当清空按钮、原图按钮、拼图按钮都不显示时,编辑按钮隐藏。其余条件均显示。)
  • 新增:可配置相册页清空按钮是否显示(详见 wiki)

2.3.5:

  • 修复:修复文字贴纸自动生成日期错误
  • 优化:AlbumModel 类,更加节省内存 (感谢@ofexe)
  • 升级:compileSdkVersion 升级为 28,buildToolsVersion 升级为 '28.0.3'

2.3.4:

  • 修复:坚果 pro 和荣耀 8 在特殊情况下无法获取媒体文件路径的问题

2.3.3:

  • 优化:过滤媒体库中存在但实际不存在的图片

2.3.2:

  • 优化:状态栏颜色独立为 easy_photos_status_bar

2.3.1:

  • 新增:调用相册支持 Fragment 直接调用,走 Fragment 的 result 回调
  • 修复:三星 S3 拍照错误
  • 修复:魅族用户在极端操作下的权限错误
  • 修复:app 在后台时,因设备内存不足而回收资源后,在任务列表中启动 app 后的异常

2.3.0:

  • 修复 4.4.3YouTaPhone 拍照时相机停止运行错误
  • 修复相册中没有图片情况下,EasyPhotos 自动前往相机拍照时,发生的错误

2.2.9:

  • 重要修改:Photo 类中的 time 字段的单位改为毫秒
  • 优化:图片排序算法调整为与系统相册排序算法类似
  • 优化:内存泄露情况
  • 修复:部分机型出现少许图片丢失情况
  • 修复:部分机型不读扩展 SD 卡中照片的情况
  • 修复:三星的部分机型 clearFilterColor()方法无效的情况
  • 修复:三星的部分机型因在 xml 中绑定点击事件导致的点击无效的情况
  • 修改:单选选中图标改为数字 1
  • 其他:demo 中新增了内存泄露检测工具,如使用中发现内存泄露,麻烦告知,我将第一时间处理,感谢!

2.2.8:

  • bug 修复:在预览页点击最后一张的选择无效,以及因此产生的数组越界 bug
  • bug 修复:极少情况下的预览页直接返回产生的空指针问题
  • 感谢@zijinzhiyun 反馈以上 bug

2.2.6:

  • api 修改:为统一 api 标准,将所有返回 Key 统一为 EasyPhotos.RESULT_PHOTOS 和 EasyPhotos.RESULT_PATHS。带来的改变就是单独使用拼图功能时的图片返回 Key 改为 EasyPhotos.RESULT_PHOTOS 和 EasyPhotos.RESULT_PATHS,去除原来的 EasyPhotos.RESULT_PUZZLE_PHOTO 和- EasyPhotos.RESULT_PUZZLE_PATH 这两个 Key。
  • UI 修改:预览页状态栏颜色与 colorPrimaryDark 色值对应。若其色值趋近于白色,在无虚拟按键的手机中状态栏字体颜色智能适配为深色,有虚拟按键的手机中状态栏智能优化为透明色。(除预览页外,其他页面若状态栏颜色趋近于白色,无论任何机型均为智能优化字体颜色为深色,查看详情。
  • 错误修复:修复努比亚机型的预览页占用导航栏问题

2.2.4:

  • 优化:单独启动相机时无需配置图片加载引擎
  • 优化:示例中配置 Glide4.x 为图片加载引擎的示例文件改为单例模式

2.2.3:

  • 修复拼一张更换图片时发生的错误
  • 修复单独启动相机时的权限错误
  • 优化混淆规则

2.2.2:

  • 重大更新:EasyPhotos 去除了 Glide 的依赖,并对外提供 ImageEngine 接口,通过对 ImageEngine 接口的实现,使用者可以快速绑定如 Glide、picasso、fresco、Imageloader 等你正在使用的任意图片加载库。点击查看详情
  • 界面优化:优化单选图标
  • 修改文字贴纸的文字编辑页面中,底部操作栏的背景色为固定色值(其实也可以改,看看 EasyPhotos 的 color 文件你就知道怎么改)

2.1.0:

  • 新增功能:EasyPhotos 智能识别状态栏的背景颜色,当其趋近于白色时,智能适配深色状态栏字体。(该功能仅对 6.0 以上系统生效,并没有适配 6.0 以下的小米和魅族,如有需要可以加群交流)
  • 新增功能:可配置是否显示 Gif 动图
  • 功能优化:Gif 动图的处理方式。
  • 界面优化:Gif 动图、相机按钮等。
  • 新增字段:

    <string name="gif_easy_photos">动图</string>
    

    具体查看11-多语言

  • 内部升级:最新版编译工具和最新版 sdk

2.0.2:

  • 升级:Glide 到 4.5.0(不影响低版本使用)
  • 修复:拼一张功能因图片过多过大导致的 oom 问题
  • 感谢@Beiler 提出的反馈

2.0.1:

  • 修复 bug:单独使用拼图功能时,以图片路径为参数时产生的数组越界 bug。

2.0.0:

  • 新增功能:相册内部自带拼一张功能(可通过配置不使用该功能,该模式拼图保存的图片存储在 sd 卡根目录/你的 app_name 文件夹下)
  • 新增功能:拼图页面增加文字贴纸功能
  • 界面优化:无权限时的相册界面优化,使之更加友好
  • 界面优化:相机按钮优化,视觉和体验上都更加友好
  • 界面优化:专辑列表细节优化,更加自然、大气
  • 功能优化:相册界面打开相机,拍照后不直接返回,而是默认选中拍完的图片,停留在相册界面
  • 字段增加:具体查看11-多语言
  • 重要修改:Photo 对象去除 isCamera 成员变量。构造函数也因此相应改变,少了一个参数。
  • 重要修改:setFileProviderAuthoritiesText()方法更改为 setFileProviderAuthority()方法
  • 重要修改:UI 色值重新定义,由原来的三十几种色值统一修改为 7 个色值,自定义起来更加方便。具体查看10-自定义 UI 样式

1.3.2:

  • 新增功能:
    • 拼图(最多对 9 张图片进行拼图,无需关心运行时权限,内部处理好了)
    • 把 View 画成 Bitmap
    • 保存 bitmap 到本地(可设置是否更新到媒体库,如果调用此方法前没有进入过 EasyPhotos 的相册或相机,则需要你自己处理读写权限)
  • 更换相册单选的选中图标样式
  • 修复回调选中地址的 key:RRESULT_PATHS 修复为 RESULT_PATHS。(ps:对如此智障的疏忽表示歉意。)
  • 修复永久不给权限情况下,退出相册时发生的错误
  • 修复调用系统权限设置页返回时,相册页面或拼图页面自销毁情况
  • 新增字符串:
      <string name="done_easy_photos">完成</string>
      <string name="cancel_easy_photos">取消</string>
      <string name="template_easy_photos">模板</string>
    
  • 新增色值:

      <!--图片预览页-->
      <color name="preview_status_easy_photos">#d73c3d41</color>//api21 以上预览页状态栏颜色为该色值;api19 和 api20 状态栏为透明色;其余 api 状态栏或透明或黑或灰,取决于各家 rom 和有无实体按键等因素。注:其余页面状态栏根据你的主题走
    
      <!--拼图页-->
      <color name="puzzle_background_easy_photos">#000000</color>//拼图页面背景色
      <color name="puzzle_selected_frame_easy_photos">#57a457</color>//拼图页面当前处理 item 的边框颜色
      <color name="puzzle_selected_controller_easy_photos">#00AA00</color>//拼图页面当前处理 item 的操作 bar 颜色,就是 item 边框中凸起矩形的色值
      <color name="puzzle_menu_easy_photos">#969696</color>//拼图页面的文字按钮和示例图片颜色
      <color name="puzzle_menu_done_easy_photos">#009700</color>//拼图页面的完成按钮文字颜色
      <color name="puzzle_bottom_bar_line_easy_photos">#ee3a3a3e</color>//拼图的底部栏间隔颜色
      <color name="puzzle_photo_background">#ffffff</color>//图片的背景颜色
    

1.2.8:

  • 修复'选中图片列表'点击状态下与'大图列表和选择器'的联动错误

1.2.7:

  • 大图预览页新增:大图列表与选中图片列表联动
  • 升级 classpath 'com.android.tools.build:gradle:3.0.1'
  • 新增色值:
    <color name="preview_bottom_bar_easy_photos">#eb212123</color>//预览页的底部栏和选中图片列表背景颜色    
    <color name="preview_bottom_bar_line_easy_photos">#ee3a3a3e</color>//预览页的底部栏与选中图片列表的分割线颜色
    

1.2.6:

  • 正式开放,投入使用
  • 广告 view 可以传空,适用于 VIP 不显示广告场景

1.2.3:

  • 优化图片限制方式:最小宽度、最小高度、最小文件大小
  • 如果单一设置,满足条件即过滤
  • 如果多项设置,满足一项即过滤

1.2.2:

  • 新增返回结果:图片地址集合
  • 新增返回结果:用户是否选中原图选项
  • 新增返回结果:图片信息集合
  • 新增设置默认勾选图片集合方式:图片地址集合
  • 新增设置默认勾选图片集合方式:图片信息集合

1.2.1:

  • 优化预览界面全屏动效
  • 优化 Photo 实体对象

1.2.0:

  • 升级图片选取返回信息(图片地址/宽高/文件大小/文件修改时间/文件类型/用户是否点击原图选项/文件名)
  • 图片选择新增原图选项
  • 预览界面支持选择完成
  • 预览界面支持当前图片位置显示

1.1.1:

  • 优化相机和相册的调用 API,使之更加友好

1.1.0:

  • 增加图片添加水印功能
  • 增加媒体文件更新到媒体库功能

1.0.9:

  • 优化三星部分机型因图片更新到媒体库时没有更新宽高信息时 EasyPhotos 相册不显示该图片问题

1.0.8:

  • 优化自定义 UI 和多语言

1.0.7:

  • 性能优化

1.0.6:

  • 修复华为 VNS-L31 机型拍照无返回问题

1.0.5:

  • 修复拍照切换横竖屏发生内存泄漏
  • 修复切换语言时产生错误
  • 升级 glide 为最新版 4.3.0

1.0.4:

  • 直接启动相机
  • 相册单选
  • 相册多选
  • 相册中支持添加自定义广告
  • 图片预览(缩放/全屏)
  • UI 可定制
  • 根据图片宽高进行过滤
  • 修复无图片显示时的异常
  • 内部处理权限问题,无需配置,无需处理运行时权限

感谢

subsampling-scale-image-view:一个强大的大图长图缩放库,由[davemorrissey](https://github.com/davemorrissey 编写。

PhotoView:一个强大的图片缩放库,由[chrisbanes](https://github.com/chrisbanes 编写。

PuzzleView:一个强大的拼图库,我的拼图功能是在此基础上实现,这个库由wuapnjie 编写。

CameraView:一个仿微信点击拍照长按录像,由CJT2325编写.

uCrop:一个知名强大的图片裁剪库,由Yalantis编写

除 uCrop PhotoView 外,其他都依赖源码修改实现,大可不必担心有冲突情况

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools