Code Monkey home page Code Monkey logo

huantansheng / easyphotos Goto Github PK

View Code? Open in Web Editor NEW
3.0K 55.0 497.0 101.69 MB

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

Java 100.00%

easyphotos's Introduction

EasyPhotos

QQ交流群:EasyPhotos开发交流群:288600953 (已满)

QQ交流群:EasyPhotos开发交流群二群:212324053

demo下载

若无法下载demo,可以在QQ交流群的群文件下载,文件名为demo-release,下载最新的即可。

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

   

产品特色    

  • 兼容android 11
  • 兼容android 10
  • 支持复杂选择情况,如当用户可选视频和图片多类型时,可以设定选择视频后不可以选择图片,反之亦然。也可以设定视频和图片各自类型的选择数。
  • 支持绑定Glide、Picasso、Imageloader等所有图片加载库(fresco暂不支持),EasyPhotos并没有对他们进行依赖,不必担心冲突和体积问题。
  • 状态栏字体颜色智能适配,当状态栏颜色趋近于白色时,字体颜色智能处理为深色
  • 内部处理运行时权限,使用者无需考虑权限问题
  • 清晰预览超大图和长图
  • 拼一张功能(可配置开关,可独立作为拼图使用)    
  • 原图功能(可配置开关)
  • 广告填充(可配置开关)    
  • 过滤图片(图片宽度、图片高度、文件大小三个维度任意选择和搭配)
  • 默认勾选图片(可配置)    
  • 图片预览(可全屏,可缩放)
  • 支持动图gif显示,并支持只显示动图gif
  • 支持视频video显示,并支持只显示视频video
  • UI色值高度浓缩,仅为7种,自定义超简单    
  • 对Gif动图的处理(可配置开关是否显示,列表中以静态图+动图标识显示,预览大图时自动播放)
  • 自带Bitmap相关方法(如添加水印、把View画成Bitmap、保存Bitmap等)
  • 自带媒体库相关方法(如媒体文件更新到媒体库)

关于EasyPhotos的SDK及相关版本公示(androidx版本)

compileSdkVersion 30
minSdkVersion 15
targetSdkVersion 30  

关于EasyPhotos的SDK及相关版本公示(support版本)

compileSdkVersion 28
minSdkVersion 15
targetSdkVersion 28  
buildToolsVersion '28.0.3'

获取EasyPhotos(通过Gradle方式)

首先,在项目的 build.gradle(project) 文件里面添加:

allprojects {
	repositories {  

        maven { url "https://jitpack.io" }
		
    }
}

最后,在你需要用到EasyPhotos的module中的 build.gradle(module) 文件里面添加:

dependencies {  

        implementation 'com.github.HuanTanSheng:EasyPhotos:3.1.5'  //androidx版本,支持android 10、11,永久维护
      
        //implementation 'com.github.HuanTanSheng:EasyPhotos:2.4.5' //还没有升级到androidx的同学可以用这个版本,但不支持android 10,暂停维护
   
}

   

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

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

关于混淆    

EasyPhotos的混淆:

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

EasyPhotos文档总录

QQ交流群:288600953 (已满) QQ交流群:EasyPhotos开发交流群二群:212324053

感谢

PhotoView:一个强大的图片缩放库,由chrisbanes 大神编写

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

编者语

EasyPhotos目前还在更新,欢迎各种Issues以及加群讨论,只是目前本人精力以及本职工作原因,更新不会频繁,只能保证不定期查看反馈统一修改,希望各位理解,感谢!
QQ交流群:288600953 (已满) QQ交流群:EasyPhotos开发交流群二群:212324053

更新日志

3.1.5:

  • 新增:public AlbumBuilder setSelectedPhotos(ArrayList selectedPhotos,boolean isSequentialSelectedPhotos)
    可自定义当传入已选中图片时,是否按照之前选中的顺序排序

3.1.4:

  • 优化:多类型互斥选择时,最大选择数按照已选类型动态匹配

3.1.3:

  • 优化:线程安全
  • 优化:防止用户在外部多次点击重复打开相册页

3.1.1:

  • 修复:在Q平台直接调用相机时的空指针问题

3.1.0:

  • 适配:android 11
  • 重要:createAlbum方法新增useWidth参数 意义:是否需要使用图片的宽高数据 true:会保证宽高数据的正确性,耗时,扫描图片慢 false:不需要,宽高数据返回为0 特别声明:如果使用到宽高限制,则useWidth会强制为true
  • 重要:新增API:preLoad(Context cxt),预加载,不调用该方法也不影响程序使用。单类型选择建议不调用该方法,某些机型第一次扫描多类型文件可能会慢,可以在app主页面或调用EasyPhotos的上一页做一次预加载,若未授权读取权限该功能失效但不影响程序使用。
  • 重要:start的链式回调模式,增加onCancel状态回调
  • 重要:EasyPhotos.addWatermark方法,新增返回Bitmap(既加水印后的Bitmap),新增orientation参数,int类型,Bitmap的旋转角度。当useWidth为true时,Photo实体类中会有orientation,若bitmap不是用户手机内图片,填0即可。
  • 重要:新增.complexSelector(boolean singleType,int videoCount,int pictureCount),支持复杂选择情况,singleType为是否只能选择一种文件类型,如用户选择视频后不可以选择图片,若false则可以同时选择。后面两个参数为视频和图片各自类型的最大选择数。
  • 新增:内部新增加载框,可覆盖dialog_loading_easy_photos.xml文件进行自定义样式修改
  • 优化:优化图片读取速度
  • 优化:防止选择图片时多次点击完成按钮
  • 修复:三星机型添加水印后的图片旋转问题
  • 修复:部分机型取回uri为null的情况
  • 修复:只选择视频时,若视频为空时的提示语
  • 修复:android8的Only fullscreen opaque activities can request orientation 问题
  • 修复:无法调用一加8t相机问题,由群友蜗牛贡献
  • 修复:偶现的ANR情况
  • 更新:subsampling-scale-image-view-androidx:3.10.0
  • 更新:androidx.appcompat:appcompat:1.2.0
  • 更新:androidx.constraintlayout:constraintlayout:2.0.4

3.0.6:

  • 优化:优化超出选择最大数的提示信息

3.0.5:

  • 修复:fix #112
  • 感谢:该版本由XuQK贡献

3.0.4:

  • 优化:saveBitmapToDir方法兼容android10

3.0.3:

  • 修复:修复华为nova 5i pro 在相机页面点击返回时产生的崩溃问题 #87

3.0.2:

  • 重要:拼图和加水印功能适配android 10
  • 感谢:该版本由zhangshaobo87贡献

3.0.1:

  • 重要:兼容android 10
  • 重要:因为android 10 不支持用path路径显示图片,所以回调取消了单独获取path集合的回调,只保留获取Photo集合的回调,如需使用path,可以在Photo对象中获取
  • 重要:ImageEngine接口(因为android 10 不支持用path路径显示图片,所以全部改为Uri的形式),望升级用户周知

2.5.2:

  • 优化:修复ArrayList在多线程中addItem出现的角标越界问题

2.4.9:

  • 重要:升级到gradle:3.4.2,低版本studio可能因为该项升级而产生错误,建议升级studio或手动修改classpath 'com.android.tools.build:gradle:3.4.2'到你的可用版本
  • 优化:修复预览视频封面为黑色图片问题

2.4.8:

  • 优化:修复预览页预览大图片和长图片时清晰度模糊问题

2.4.7:

  • 优化:修复相册页在部分机型会闪现权限提醒UI问题

2.4.6:

  • 优化:支持androidx

2.4.5:

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

2.4.4:

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

2.4.3:

  • 新增:start(SelectCallback callback)启动方式,通过接口回调数据
  • 新增: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可定制
  • 根据图片宽高进行过滤
  • 修复无图片显示时的异常
  • 内部处理权限问题,无需配置,无需处理运行时权限

easyphotos's People

Contributors

abiubiubiupiu avatar huantansheng avatar joker-fu avatar ofexe avatar smask avatar xuqk avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

easyphotos's Issues

在选择拍照时,抛出NPE异常

java.lang.NullPointerException:Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:604)
android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:578)
android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:416)
com.huantansheng.easyphotos.ui.EasyPhotosActivity.toAndroidCamera(EasyPhotosActivity.java:260)
com.huantansheng.easyphotos.ui.EasyPhotosActivity.launchCamera(EasyPhotosActivity.java:244)
com.huantansheng.easyphotos.ui.EasyPhotosActivity.hasPermissions(EasyPhotosActivity.java:152)
com.huantansheng.easyphotos.ui.EasyPhotosActivity.onCreate(EasyPhotosActivity.java:126)

是没有配置FileProvider吗?

在选择图片的时候点击所有图片收回的时候崩溃了

java.lang.ClassCastException: com.huantansheng.easyphotos.ui.EasyPhotosActivity$5 cannot be cast to android.animation.Animator$AnimatorListener
at android.animation.AnimatorSet.start(AnimatorSet.java:737)
at android.animation.AnimatorSet.start(AnimatorSet.java:684)
at com.huantansheng.easyphotos.ui.EasyPhotosActivity.showAlbumItems(EasyPhotosActivity.java:664)
at com.huantansheng.easyphotos.ui.EasyPhotosActivity.onAlbumItemClick(EasyPhotosActivity.java:704)
at com.huantansheng.easyphotos.ui.adapter.AlbumItemsAdapter$1.onClick(AlbumItemsAdapter.java:94)
at android.view.View.performClick(View.java:6329)
at android.view.View$PerformClick.run(View.java:25002)
at android.os.Handler.handleCallback(Handler.java:809)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7555)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)

闪退了

我是最大选择9张,选了9张后,在最后一张上点击选择按钮,无效,一直点击就会出现空指针
java.lang.RuntimeException: Unable to resume activity {com.example.xintiaotime.androiddemo/com.huantansheng.easyphotos.ui.EasyPhotosActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=13, result=0, data=null} to activity {com.example.xintiaotime.androiddemo/com.huantansheng.easyphotos.ui.EasyPhotosActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setTextColor(int)' on a null object reference
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3586)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3626)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2876)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6523)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=13, result=0, data=null} to activity {com.example.xintiaotime.androiddemo/com.huantansheng.easyphotos.ui.EasyPhotosActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setTextColor(int)' on a null object reference
at android.app.ActivityThread.deliverResults(ActivityThread.java:4284)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3558)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3626) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2876) 
at android.app.ActivityThread.-wrap12(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567) 
at android.os.Handler.dispatchMessage(Handler.java:105) 
at android.os.Looper.loop(Looper.java:156) 
at android.app.ActivityThread.main(ActivityThread.java:6523) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setTextColor(int)' on a null object reference
at com.huantansheng.easyphotos.ui.EasyPhotosActivity.processOriginalMenu(EasyPhotosActivity.java:578)
at com.huantansheng.easyphotos.ui.EasyPhotosActivity.onActivityResult(EasyPhotosActivity.java:312)
at android.app.Activity.dispatchActivityResult(Activity.java:7188)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4280)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3558) 
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3626) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2876) 
at android.app.ActivityThread.-wrap12(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567) 
at android.os.Handler.dispatchMessage(Handler.java:105) 
at android.os.Looper.loop(Looper.java:156) 
at android.app.ActivityThread.main(ActivityThread.java:6523) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832) 

BUG

当我点击相册拒绝权限时,停留在相册页面,返回按钮无效

2.4.6版本添加到项目会失败appComponentFactory

2.4.6版本添加到项目会失败,2.4.5的没问题,但是2.4.5打开相机就崩溃,华为honor10 系统android 9.0
Error:
Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from [com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18-91
is also present at [androidx.core:core:1.0.1] AndroidManifest.xml:22:18-86 value=(androidx.core.app.CoreComponentFactory).
Suggestion: add 'tools:replace="android:appComponentFactory"' to element at AndroidManifest.xml:69:5-259:19 to override.

FAILURE: Build failed with an exception.

  • What went wrong:
    Execution failed for task ':app:processDebugManifest'.

Manifest merger failed with multiple errors, see logs

  • Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

  • Get more help at https://help.gradle.org

BUILD FAILED in 10s

华为p10选择照片奔溃 android8.0

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.endsWith(java.lang.String)' on a null object reference

at com.huantansheng.easyphotos.models.album.AlbumModel.initAlbum(AlbumModel.java:129)

at com.huantansheng.easyphotos.models.album.AlbumModel.access$000(AlbumModel.java:29)

at com.huantansheng.easyphotos.models.album.AlbumModel$1.run(AlbumModel.java:65)

at java.lang.Thread.run(Thread.java:784)

"拼一张"功能选择的图片过大导致oom

选择了9张拍的照片,然后就oom了
java.lang.OutOfMemoryError: Failed to allocate a 8294412 byte allocation with 6914568 free bytes and 6MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:639)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:615)
at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:391)
at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:419)
at com.huantansheng.easyphotos.ui.PuzzleActivity.getScaleBitmap(PuzzleActivity.java:330)
at com.huantansheng.easyphotos.ui.PuzzleActivity.access$800(PuzzleActivity.java:60)
at com.huantansheng.easyphotos.ui.PuzzleActivity$3.run(PuzzleActivity.java:274)
at java.lang.Thread.run(Thread.java:818)

权限问题

建议权限请求在跳转之前进行请求

拼接图片中重新选择图片拼接后预览问题

不得不说这是个非常好的图片选择库,非常赞👍。有一些小问题:在进入拼一张中重新选择一张图片后保存拼接图片,回到图片选择列表,点击刚拼接的图片,会显示下一张图片而不会显示当前拼接的图片,不过返回是正确的,希望楼主看一下

拼图照片选择问题

我发现demo拼图照片选择和介绍上面的截图不一样,demo中可以只选择一张,这样点进去会出现问题

工程会有内存泄漏

不知道作者测试过没有?我的偶尔还会因此产生ANR警告,但程序并没有卡死
泄漏信息:
static AlbumModel.insatnce
reference AlbumModel.callBack
leaks com.huantansheng.easy.photos.ui.EasyPhotosActivity
instance

数组越界

java.lang.IndexOutOfBoundsException: Index: 8, Size: 8
at java.util.ArrayList.get(ArrayList.java:411)
at com.huantansheng.easyphotos.result.Result.getPhotoPath(Result.java:82)
at com.huantansheng.easyphotos.ui.PreviewActivity.onPreviewPhotoClick(PreviewActivity.java:416)
at com.huantansheng.easyphotos.ui.PreviewFragment.onPhotoClick(PreviewFragment.java:55)
at com.huantansheng.easyphotos.ui.adapter.PreviewPhotosFragmentAdapter$1.onClick(PreviewPhotosFragmentAdapter.java:63)
at android.view.View.performClick(View.java:5646)
at android.view.View$PerformClick.run(View.java:22459)
at android.os.Handler.handleCallback(Handler.java:761)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6523)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)

紧急:关于拍照返回崩溃问题

我把相册里的照片全部删除,然后点击相册(有相机,单选或多选),提示没有符合的图片,拍一张吧。
点击拍照,确认时,返回崩溃(但目录下已经保存图片),当我第二次点击相册(有相机,单选或多选),还是同样的提示:没有符合的图片,拍一张吧。请作者测试一下

java.lang.ArrayIndexOutOfBoundsException

java.lang.ArrayIndexOutOfBoundsException: length=10; index=10 at java.util.ArrayList.add(ArrayList.java:468) at com.huantansheng.easyphotos.models.album.entity.AlbumItem.addImageItem(AlbumItem.java:24) at com.huantansheng.easyphotos.models.album.AlbumModel.initAlbum(AlbumModel.java:164) at com.huantansheng.easyphotos.models.album.AlbumModel.access$000(AlbumModel.java:31) at com.huantansheng.easyphotos.models.album.AlbumModel$1.run(AlbumModel.java:62) at java.lang.Thread.run(Thread.java:780)

设备是DRA-AL00 | 8.1.0

相册返回不执行onActivityResult

在fragment 内启动相册,代码:
EasyPhotos.createAlbum(getActivity(), false, GlideEngine.getInstance())
.setCount(9)
.start(TAKE_PHOTO);
GlideEngine使用的是Wiki中提供的Demo
Glide版本:4.5.0
也没有报错提示
测试机型:小米5s 系统版本7.0(另也使用了华为7.0版本的手机测试,结果相同)
使用之前写的相机功能是正常的,能够执行onActivityResult
EasyPhotos:2.2.8

不支持选择视频

从Mattise过来的,感觉这个库比Mattise稳定好用,唯一的缺点是不能选视频,能加上视频就好了。

图片加载慢

机型:mix2
android版本:8.0
EasyPhoto版本:2.4.3
图片数量:1W6

退回到2.4.1版本加载速度明显快很多,大概1秒左右就能加载出来,在2.4.1+版本上就加载很慢,大概半分钟才加载出来,希望能帮忙看看。

报告一个问题,关于glide的版本导致的问题

glide4.4.0将会导致崩溃:

java.lang.NoSuchMethodError: No virtual method into(Landroid/widget/ImageView;)Lcom/bumptech/glide/request/target/Target; in class Lcom/bumptech/glide/RequestBuilder; or its super classes (declaration of 'com.bumptech.glide.RequestBuilder' appears in /data/app/com.hdl.apsp-1/base.apk:classes4.dex)
at com.huantansheng.easyphotos.ui.adapter.PhotosAdapter.onBindViewHolder(PhotosAdapter.java:75)

请问,可以使用自定义的GlideEngine()嘛?Glide版本不同导致的问题挺麻烦的。

选择图片状态栏问题

当我设置项目<item name="android:windowTranslucentStatus">true</item> 就会出现这种情况
tim 20180530154912
内容跑到了状态栏之上

相册(支持video和gif),点击相机拍照返回崩溃

相册(支持video和gif),点击相机拍照,完成后崩溃

2019-03-25 10:32:37.318 17615-17615/com.huantansheng.easyphotos.demo E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.huantansheng.easyphotos.demo, PID: 17615
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=11, result=-1, data=null} to activity {com.huantansheng.easyphotos.demo/com.huantansheng.easyphotos.ui.EasyPhotosActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.huantansheng.easyphotos.models.album.entity.AlbumItem.addImageItem(int, com.huantansheng.easyphotos.models.album.entity.Photo)' on a null object reference
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4222)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4265)
        at android.app.ActivityThread.-wrap20(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1614)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:163)
        at android.app.ActivityThread.main(ActivityThread.java:6388)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:930)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:820)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.huantansheng.easyphotos.models.album.entity.AlbumItem.addImageItem(int, com.huantansheng.easyphotos.models.album.entity.Photo)' on a null object reference
        at com.huantansheng.easyphotos.ui.EasyPhotosActivity.addNewPhoto(EasyPhotosActivity.java:388)
        at com.huantansheng.easyphotos.ui.EasyPhotosActivity.onCameraResult(EasyPhotosActivity.java:462)
        at com.huantansheng.easyphotos.ui.EasyPhotosActivity.onActivityResult(EasyPhotosActivity.java:336)
        at android.app.Activity.dispatchActivityResult(Activity.java:7118)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4218)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4265) 
        at android.app.ActivityThread.-wrap20(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1614) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:163) 
        at android.app.ActivityThread.main(ActivityThread.java:6388) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:930) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:820) 

EasyPhotos拍照保存的图片不存在

java.lang.RuntimeException: Unable to resume activity {com.zwang.znc/com.huantansheng.easyphotos.ui.EasyPhotosActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=11, result=-1, data=null} to activity {com.zwang.znc/com.huantansheng.easyphotos.ui.EasyPhotosActivity}: java.lang.RuntimeException: EasyPhotos拍照保存的图片不存在 at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3790) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3830) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3038) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6944) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=11, result=-1, data=null} to activity {com.zwang.znc/com.huantansheng.easyphotos.ui.EasyPhotosActivity}: java.lang.RuntimeException: EasyPhotos拍照保存的图片不存在 at android.app.ActivityThread.deliverResults(ActivityThread.java:4491) at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3762) ... 10 more Caused by: java.lang.RuntimeException: EasyPhotos拍照保存的图片不存在 at com.huantansheng.easyphotos.ui.EasyPhotosActivity.onActivityResult(EasyPhotosActivity.java:318) at android.app.Activity.dispatchActivityResult(Activity.java:7556) at android.app.ActivityThread.deliverResults(ActivityThread.java:4487) ... 11 more

华为手机选择照相奔溃

E/MemoryLeakMonitorManager: MemoryLeakMonitor.jar is not exist!
E/cr_VariationsUtils: Failed reading seed file "/data/user/0/com.xxx.xxx/app_webview/variations_seed_new": /data/user/0/com.xxx.xxx/app_webview/variations_seed_new (No such file or directory)
E/CrashReport: --------------------------------------------------------------------------------------------
E/CrashReport: --------------------------------------------------------------------------------------------
E/Minikin: Could not get cmap table size!
E/JVMContainer VMSG: RegisterNatives
E/iGraphics: failed to load file: /product/etc/xml/igraphics_config_cust.xml

fragment问题

EasyPhotos.createAlbum只能传入activity,这样fragment的 onActivityResult没有调用

[建议]能否将预览页单独出一个图片预览功能

目前的预览页功能非常赞
能否单独再加一个预览页面,用来预览图片,在九宫格选中后或者其它场景中使用。
传值是图片的列表,图片可能是url链接,可能是file。
然后在预览页面中可以预览和左右切换。

thanks

Android 4.4.3的手机,使用相机的时候报错了!

02-02 20:39:54.321 9868-9868/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.android.camera2, PID: 9868
java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{427bc788 9868:com.android.camera2/u0a40} (pid=9868, uid=10040) that is not exported from uid 10011
at android.os.Parcel.readException(Parcel.java:1472)
at android.os.Parcel.readException(Parcel.java:1426)
at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2860)
at android.app.ActivityThread.acquireProvider(ActivityThread.java:4459)
at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2208)
at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1425)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:906)
at android.content.ContentResolver.openOutputStream(ContentResolver.java:669)
at android.content.ContentResolver.openOutputStream(ContentResolver.java:645)
at com.android.camera.PhotoModule.onCaptureDone(PhotoModule.java:1525)
at com.android.camera.PhotoUI$4.onClick(PhotoUI.java:436)
at android.view.View.performClick(View.java:4615)
at android.view.View$PerformClick.run(View.java:18784)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5061)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:603)
at dalvik.system.NativeStart.main(Native Method)
02-02 20:39:57.041 1518-8030/? E/HttpSender: IOException while sending report: failed to connect to er.ydevices.com/5.200.42.210 (port 80) after 6000ms
02-02 20:40:06.051 1518-8030/? E/HttpSender: IOException while sending report: failed to connect to er.ydevices.com/5.200.42.210 (port 80) after 9000ms
02-02 20:40:06.051 1518-8030/? E/ReportUploadService: Failed to send report 1517331601000_359694060470397.usagestats.txt.gz
com.yotadevices.crashreportuploader.ReportSenderException: IOException while sending report(retries exceeded)
at com.yotadevices.crashreportuploader.HttpSender.sendUsageStats(HttpSender.java:274)
at com.yotadevices.crashreportuploader.ReportUploadService.checkAndSendReports(ReportUploadService.java:123)
at com.yotadevices.crashreportuploader.ReportUploadService.onHandleIntent(ReportUploadService.java:85)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.os.HandlerThread.run(HandlerThread.java:61)
Caused by: java.net.SocketTimeoutException: failed to connect to er.ydevices.com/5.200.42.210 (port 80) after 9000ms
at libcore.io.IoBridge.connectErrno(IoBridge.java:159)
at libcore.io.IoBridge.connect(IoBridge.java:112)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:460)
at java.net.Socket.connect(Socket.java:833)
at com.android.okhttp.internal.Platform.connectSocket(Platform.java:152)
at com.android.okhttp.Connection.connect(Connection.java:101)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294)
at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:197)
at com.yotadevices.crashreportuploader.HttpSender.sendUsageStats(HttpSender.java:227)
at com.yotadevices.crashreportuploader.ReportUploadService.checkAndSendReports(ReportUploadService.java:123) 
at com.yotadevices.crashreportuploader.ReportUploadService.onHandleIntent(ReportUploadService.java:85) 
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:136) 
at android.os.HandlerThread.run(HandlerThread.java:61) 
02-02 20:40:09.071 1518-8030/? E/HttpSender: IOException while sending report: failed to connect to er.ydevices.com/5.200.42.210 (port 80) after 3000ms
02-02 20:40:15.101 1518-8030/? E/HttpSender: IOException while sending report: failed to connect to er.ydevices.com/5.200.42.210 (port 80) after 6000ms

很奇怪的问题, 我用4.4.3的手机测试(手机品牌为: YouTaPhone) 相机的时候 提示我相机停止运行,而不是这个demo停止运行 不明白咋回事,另外使用其他的库没发现相机停止运行的问题

小建议

当选中的图片为0时,右上角的确定按钮其实可以不用隐藏,因为目前感觉框架是只能添加图片,不能删除

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.