0°

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用

内容预览:
  • “   二、保存选中图片 当选择图片完之后,需要将选中的图片进行保...~
  • 而我们的最终目的是把选中的图片,供外界使用(初始Activity/Fragment)~
  • 首先在AndroidManifest.xml清单文件中添加以下代码: ZFileProvider是一...~

始发于微信公众号: 程序员小乐

分享编程技能、互联网技术、生活感悟、打造干货分享平台,将总结的技术、心得、经验分享给大家,这里不只限于技术!值得你去关注,点击上方 蓝字 快速关注。本号支持 投稿


对于大多数Android开发者来说,(拍照+本地相册)选择图片是再平常不过的功能,几乎每一个APP都会用到,但是现今的Android市场,机型,版本等各个方面都存在着不同,那么如何找到一个合适自己的方式呢?下面我们将封装一套属于自己的图片选择器。


  一、选择图片



选择图片,无外乎拍照和本地相册选择,那么在Android手机中如何实现呢?


A、启动本地相册(2种方式)

第一种方式:

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


第二种方式:


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


B、启动拍照


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


注意:要在清单文件AndroidManifest.xml添加拍照权限android.permission.CAMERA。


  二、保存选中图片



当选择图片完之后,需要将选中的图片进行保存,一般保存到一个临时文件当中。而我们的最终目的是把选中的图片,供外界使用(初始Activity/Fragment)。这个时候就要使用startActivityForResult来启动拍照或本地相册,方便进行数据回调。


如下:启动本地相册和启动拍照可以写出如下形式。


启动本地相册:


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


注:RESULT_LOAD _CODE是表示启动本地相册请求码。

启动拍照:将拍照图片保存到一个临时文件当中。

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


注:这里需要自定义静态变量photoUri和静态整形常量RESULT_PHOTO _CODE。其中photoUri为Uri,是用来保存拍照URI。RESULT_PHOTO _CODE是表示启动拍照请求码。


可能存在的问题


在Android7.0+版本中,不再允许在app中把file://Uri暴露给其他app。所以如果采用临时文件的方法可能会引起的FileUriExposedException异常。可以利用FileProvider来解决这个问题。那么该如何使用FileProvider呢?这里针对启动拍照3进行修改。


首先在AndroidManifest.xml清单文件中添加以下代码:


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


ZFileProvider是一个空类,该类继承FileProvider,没有任何结构体。


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


zdialog_file_paths文件为res/xml/中的文件:


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


修改启动拍照3:


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


在清单文件AndroidManifest.xml添加拍照权限,如果是保存到临时文件中,还要添加对文件的读写权限。


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


  三、接收返回值



裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


到这里,选择图片的相关逻辑已经分析清楚,那怎么去封装图片选择功能呢?


  四、封装选择图片Dialog



A、创建选择图片管理类(这里只是对上面的分析,进行进一步的封装),这里我创建一个叫做ChoosePictrueUtil的类,封装对拍照和从本地相册选择方法,如下:


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


注:其中ZDialogConstantUtil类是用来保存常量。


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


B、选择图片Dialog。


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用

选择图片Dialog


如何自定义这个Dialog呢?其实就是将一个将布局和对于操作方式封装到一个类当中即可,这里我创建一个叫做ChoosePictrueDialog的类。


首先:XML布局,对于上面的布局来说,一个线性布局包裹三个Button即可。


其实:定义一个Dialog操作类,同时要对当前布局文件内容进行操作。


思路:创建ChoosePictrueDialog,在该类中定义一个全局变量Dialog,在该类进行创建操作的时候,进行Dialog初始化,同时将初始化XML布局控件,并设置布局文件三个Button的点击事件,最后将XML文件添加到Dialog中去。


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


这里有一个地方需要注意,由于Android 6.0之后,对权限的限制非常多,在启动拍照的时候要对SD和系统拍照进行操作,所以这里几个权限的判断必不可少。


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


在初始化Dialog的时候,细心的同学,可能看到Dialog dialog=new Dialog(context,R.style.diydialog),那么R.style.diydialog是什么呢?这个是设置Dialog主题文件,需要在styles.xml中进行书写:


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


至于bg_white_gray_border为背景文件,是在drawable文件夹下:


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


ChoosePictrueDialog类需要对外外提供修改样式和功能的类,这些都是采用构造者模式,例如:


1、设置Dialog显示位置


Dialog在屏幕当中显示位置,无外乎上、下、左、右、中五种,这里采用枚举enum来标记几种状态,然后通过设置window.getAttributes().gravity便可实现Dialog在窗体中的位置。


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


2、设置背景层透明度


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


3、设置Window动画


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


按照这样的规则,可以定义出很多方法,其他方法这里不再列出。


对选择图片的封装,到这儿就已经写完了,一共建了三个类,ZDialogConstantUtil(常量管理类)、ChoosePictrueUtil(选择图片管理类)、ChoosePictrueDialog(选择图片Dialog类)。


Github地址:ZDialog,ZDialogConstantUtil,ChoosePictrueUtil,ChoosePictrueDialog


这里也可以直接引入该封装内容到自己的工程当中,该如何使用呢?


一、引入资源

引入Android Studio:

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


或Maven引入,在pom.xml文件中添加以下代码:


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


二、使用


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


启动拍照将会对一些权限进行判断,所以要在启动Dialog的Activity中添加权限请求回调处理。


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


选择图片之后,会进行图片选择结果回调,所以这里可以进行图片选择回调进行监听:


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


三、其他方法使用(如下只是部分方法)


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


如何您想进技术群和大牛们交流,关注公众号在后台回复 “加群”,或者 “学习” 即可

作者:zrunker

链接:http://www.jianshu.com/p/88aca46f3249

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

如果您觉得不错,请别忘了分享到您的朋友圈让更多的人看到!! 您的举手之劳,就是对我最好的支持,非常感谢!

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用

每日英文


Nobody can go back and start a new begining, but anyone can start today and make a new ending.

没有人可以回到过去重新开始,但谁都可以从今日开始,书写一个全然不同的结局。


乐乐有话说


有时,我可能脆弱得一句话就泪流满面;有时,也发现自己咬着牙走了很长的路。


裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用


推荐阅读




知识星球
这里聚集了业界内的大牛,值得各位大牛的加入!

裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用 

看完本文有收获?请转发分享给更多人
关注「杨守乐」,提升编程技能

【QQ技术群】279126311 []
【QQ技术群】484572225 [未]

以上就是:裁剪、压缩、上传(一)、图片选择(拍照+本地相册)Dialog封装的使用 的全部内容。

本站部分内容来源于互联网和用户投稿,如有侵权请联系我们删除,谢谢。
Email:[email protected]


0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论