开源一款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 ...
随机推荐
- ios开发之--CGRect/CGSize/CGPoint/CGVector/CGAffineTransform/UIEdgeInsets/UIOffset和NSString之间的转换
仅做记录,一个函数和字符串之间的互相转换 方法如下: UIKIT_EXTERN NSString *NSStringFromCGPoint(CGPoint point); UIKIT_EXTERN N ...
- iOS开发之 -- 判断是否第一次登陆APP
判断是否第一次登陆app,具体方法如下: if (![[NSUserDefaults standardUserDefaults]boolForKey:@"firstLaunch"] ...
- cx_Oracle在sublime text里运行遇到 ImportError错误解决办法
如果你装完cx_Oracle之后,命令行运行没错,但是在sublime text里运行, 就遇到这个错误: ImportError: dlopen(/Library/Python/2.7/site-p ...
- 安装mysql最后一步未响应,卡死。(解决方法mySql5.5,以及安装教程)
安装教程:http://www.server110.com/mysql/201308/784.html 重装mysql的时候,总是在提交配置后的最后一步,安装失败,进程管理器里显示程序无响应,mysq ...
- 修改\Servlet和Jsp模板的方法
1.在MyEclipse6.6\myeclipse\eclipse\plugins下找到com.genuitec.eclipse.wizards 2.templates\替换Servlet.java ...
- 20165330 实验一 Java开发环境的熟悉
一.实验内容及步骤 使用JDK编译.运行简单的Java程序 使用命令 cd 20165330 进入到学号目录下 mkdir exp1新建文件夹 mkdir bin src建立bin src目录 vim ...
- TFS中工作项的定制-修改面板
上一篇文章我们讲到了<TFS 中工作项的订制-修改工作流>,工作流只要我们设计出来,就可以进行定制修改了.这次通过简单的案例,了解一下,工作项的面板如何定制. 1.软件准备 ...
- 【转载】为什么不常见include .c文件
备:对于#include <filename.h> ,编译器从标准库路径开始搜索 filename.h 对于#include “filename.h” ,编译器从用户的工作 ...
- 深入理解Flask中的上下文
https://blog.csdn.net/barrysj/article/details/51519254 1.AppContext类即是应用上下文,可以看到里面只保存了几个变量,其中比较重要的有: ...
- python中yield使用
16.yield使用 列表推导与生成器表达式 当我们创建了一个列表的时候,就创建了一个可以迭代的对象: >>> squares=[n*n for n in range(3)] ...