开源一款android 偷拍 app【静拍】豌豆荚、flyme商店已经上线
首先先花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:增加摄像功能
因为精力关系,以上两点可能要延后进行哦
开源一款android 偷拍 app【静拍】豌豆荚、flyme商店已经上线的更多相关文章
- 个人开发者做一款Android App需要知道的事情
个人开发者做一款Android App需要知道的事情 在大学时, 自己是学计算机专业的,而且还和老师一起做过一年半的项目. 有时候是不是有这样的想法,做一个自己的网站.但一直未付诸行动.2012年时, ...
- 分享一下怎么开发一款图片视频类App,秒拍和prisma
第一步,分解短视频App的功能 我们在秒拍官网看到如此描述: [视频拍摄及导入]支持直接拍摄及导入手机本地的视频 [照片电影]照片专属特效,轻松创作照片电影 [MV特效]10余款全新MV特效,让普通视 ...
- 开源整理:Android App新手指引开源控件
开源整理:Android App新手指引开源控件 一个App第一次与用户接触或者发生大版本更新时,常常会用户进行新手引导,而一个好的新手指引,往往能够方便新用户快速了解操作你的应用功能.新手指引的重要 ...
- 140款Android开源优秀项目源码
BeautifulRefreshLayout-漂亮的美食下拉刷新 https://github.com/android-cjj/BeautifulRefreshLayout/tree/Beautifu ...
- [转载]或许您还不知道的八款Android开源游戏引擎
或许您还不知道的八款Android开源游戏引擎 分类: 技术文章 2010-08-04 20:27 17430人阅读 ...
- 转载: 开源整理:Android App新手指引开源控件
http://blog.coderclock.com/2017/05/22/android/open-source-android-app-guide-view-library/ 开源整理:Andro ...
- 或许您还不知道的八款Android开源游戏引擎
很多初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于iPhone下有诸如Cocos2d-iphone之类的免费游戏 ...
- 工具推荐:2016年最佳的15款Android黑客工具
黑客技术,曾被认为是专家的专有领域,但随着技术的崛起和移动安全领域的进步,黑客技术已经变得越来越普遍.随着人们越来越依赖于智能手机和其它的便携式设备来完成他们的日常活动,我们有必要了解一些Androi ...
- Lottie开源库实现Android动画效果
Lottie简介 Lottie是一个支持Android.iOS.React Native,并由Adobe After Effects制作aep格式的动画,然后经由bodymovin插件转化渲染为jso ...
随机推荐
- ProcessBuilder执行本地命令
/**关键技术剖析 * 用本命令名和命令的参数选项构造ProcessBuilder对象,它的start方法执行命令,启动一个进程,返回一个Process对象 * ProcessBuilder的envi ...
- 自记(项目npm)
cnpm install pug pug-cli vuex node-sass sass-loader vue-beauty axios 在main.js里面使用vue-beauty: import ...
- 85、android handler的警告Handler Class Should be Static or Leaks Occur
转载:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1106/1922.html 在使用Handler更新UI的时候,我是这样写 ...
- centos7上开启路由转发
CentOS7 开启路由转发 2018-03-27 09:18:14 1.临时开启,(写入内存,在内存中开启) echo "1" > /proc/sys/net/ipv4 ...
- 关于ios7 UINavigationController.interactivePopGestureRecognizer手势集成
因为公司业务需求,结合网上的资料整理了一下. 如果自定义过navbar的leftbarbutton 或者backbarbutton 原生interactivePopGestureRecognizer默 ...
- 通过实现一个TableView来理解iOS UI编程
推荐一篇神作: 通过实现一个TableView来理解iOS UI编程 http://blog.jobbole.com/61101/
- inode file 结构
inode位图(inode Bitmap) 和块位图类似,本身占一个块,其中每个bit表示一个inode是否空闲可用. inode表(inode Table) 我们知道,一个文件除了数据需要存储之外, ...
- 剑指Offer——数据流中的中位数
题目描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. ...
- GraphicsMagick 1.3.25 Linux安装部署
1.安装相关依赖包 yum install -y gcc libpng libjpeg libpng-devel libjpeg-devel ghostscript libtiff libtiff-d ...
- Pandas 如何通过获取双(多)重索引获取指定行DataFrame数据
图片看不清楚的话,可以右键选择:“在新标签页中打开图片(I)” 参数 df.loc[(a,b),c]中第一个参数元组为索引内容,a为level0索引对应的内容,b为level1索引对应的内容 因为df ...
