首先先花3秒时间,预览下下app的大概是做啥的,解决啥痛点的:)

app:本地下载地址

需求点:

1:音量键可以拍照

2:没有快门声、闪光灯

3:锁屏下、或者是在其他程序界面都可以拍照

思路:

1:创建一个内容观察者(ContentObserver)来监听音量变化

2:使用原生camera实现拍照

3:同1

技术总结:

1:android的音量内容分很多种类,有系统的、铃声的、音乐的(AudioManager.STREAM_MUSIC),我们只监听音乐的就好了

那么问题来了,如何确保任何情况下,音量键操作的对象,都是音乐呢?

我的解决办法是,通过服务,在后台播放一段无声的音频,这样,就确保挡使用音量键时, 音乐音量发生变化:)如何录制无声音频呢,使用windows附带的录音机就好啦;录好之后记得转成ogg格式,这样体积小很多~

2:使用原生的Camera对象,必须要有预览的对象,这是android为了防止你在用户不知情的情况下在后台启动camera拍摄他。。解决办法:将预览对象宽高都设置成1dp(大概芝麻大)。。。别问我为啥不设置成0dp,这样camera输不出来,拍出来的是一个黑点。。

3:拍照对焦问题,原先的方法是采用camera对焦触发完成之后,回调里再输出图像,可惜相机对焦速度受环境、机子性能影响很大,会导致我摁了3次音量键,前2次在对焦中,拍不出照片,第三次合焦成功了之后,连续输出三张一样的照片,用户体验很差。

解决思路是,相机不断对焦,拍照时,我只管输出图像,不管合焦与否。代码:拍摄时将Camera的对焦模式设置为(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE),这是比较新的api,以前都是用video的,区别在于新的对焦模式更加激烈、频繁点,也确保我们不会拍糊掉。

4:既然是偷拍app,那么图片当然是不能在相册中出现的,本程序中,是放在程序包在sd卡上的位置(android4.4以后,外置sd卡,除了公开和本程序自己的包,其他位置不能写。)getExternalFilesDir(null).getAbsolutePath() + "/imgs/"

5:既然图片不归相册管,那只能自己管理了。安卓自带的图片控件已经Deprecated,所以只能自己用GridView声明每行3个,每个图片宽度=(Gridview宽- 图片之间padding*3)/3;(除三可能会导致除不尽,余了一两个dp,所以我们的Gridview的marginleft要设置1dp,补全)

一开始我直接从存储中加载拍摄出来的照片,结果内存耗尽程序崩溃(现在主流手机像素都是800w 1800w);第一版是每次拍照的时候,额外输出一张256*256的缩略图;后来在逛github的时候,发现图片框架PICASSO,用下来很方便,在读取本地图片的时候,使用它提供的Resize方法,缩略图都不用创建了,而且内存管理上效果没多大区别,很方便哦。

6:图片有两种模式:查看模式:点击可以缩放查看细节;编辑模式:点击进行选中

图片列表,我们使用ArrayAdapter,里面的实体有 boolean IsSelected;是否选中的属性

图片的模式:查看/编辑,我们将标示IsImageEdit放到公共变量中,每次getView的时候,根据IsImageEdit显示是否每个图片右上角出现勾选框;根据IsSelected来判断是否勾选框选中

7:底部微信酷炫的Tab卡是网友的代码,仿真度100%,作者实现了绘制代码,通过viewPager偏移值,来设置笔刷的alpha值,来达到淡入淡出的效果,很赞,值得一看,我反正是看不懂。。。

8:使用AsyncTask来实现将IO操作从主线程分离出去,再也不用担心卡顿了!

说了那么多解决步骤,如何在代码中具体实现我也不多说了,各位直接看代码:)。本app的源码也托管在了osChina(github不稳定哦),欢迎朋友们Star、Fork,有能力的狼道友推送pr就更好咯~

OSCHINA地址: https://git.oschina.net/yso/JingPai

测试环境:

虚拟机:android4.4 4.3

真机:魅族 mx3

其余手机没有广泛进行测试,欢迎朋友反馈:)

最后的几句话:app很好,可惜我没贼胆;百度审核很认真,竟然说这款app有强烈的误导作用而拒绝了我的提交申请,我只能说,道友你很识货!

最后的最后:求扩散app。。造福更多道友。。。。

TODO:

1:增加定时拍照功能(不用音量键,每若干秒触发一次拍照)

2:增加摄像功能

因为精力关系,以上两点可能要延后进行哦

更多相关文章

  1. 在android上实施不会OOM的内存管理方案
  2. android 类似微信朋友圈图片点击放大的ImageView
  3. Android使用 LruCache 缓存图片
  4. 「Android」 APK瘦身探索
  5. Android自定义导览地图组件(一)
  6. Android中AS创建点9图片与使用
  7. android 点击字体,图片背景效果一起变换Demo
  8. Android图片压缩小结
  9. android新浪分享实例

随机推荐

  1. linux使用mysqldump+expect+crontab实现m
  2. SQL 列不同的表查询结果合并操作
  3. MySQL5.7.31 64位免安装版使用教程图解
  4. 在SQL中对同一个字段不同值,进行数据统计
  5. 在sql中对两列数据进行运算作为新的列操
  6. 详解监听MySQL的binlog日志工具分析:Canal
  7. 简单了解SQL常用删除语句原理区别
  8. MySQL死锁检查处理的正常方法
  9. MySQL查看与修改字符集的方法实例教程
  10. mysql对于模糊查询like的一些汇总