有时候我们想要在不打开相机预览界面的情况下,实现后台拍照或者录像,这种情况该怎么实现呢?

其实很简单,先讲一下实现的原理,我们开启一个前台service(android新版本不让后台service去操作相机,所以选择前台service),然后通过一个很小的surfaceview或者textureview,比如5*5像素绑定在前台service当中,这样基本肉眼不可见,来达到后台录像的目的。

代码如下:

首先是基本的权限:

    <uses-feature android:name="android.hardware.camera" /><uses-feature android:name="android.hardware.camera.autofocus" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /><uses-permission android:name="android.permission.RECORD_AUDIO" />

前台服务:

package com.jxd.recordbackservice;import android.app.Notification;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.Gravity;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;import java.io.File;
import java.util.Date;public class RecordBackService extends Service implements SurfaceHolder.Callback{private WindowManager windowManager = null;private SurfaceView surfaceView = null;private MediaRecorder mediaRecorder = null;private Camera camera = null;public RecordBackService() {}@Overridepublic IBinder onBind(Intent intent) {// TODO: Return the communication channel to the service.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic void onCreate() {super.onCreate();// Start foreground service to avoid unexpected killNotification notification = new Notification.Builder(this).setContentTitle("正在后台录制视频").setContentText("").setSmallIcon(R.mipmap.ic_launcher).build();startForeground(1234, notification);// Create new SurfaceView, set its size to 1x1, move it to the top left corner and set this service as a callbackwindowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);surfaceView = new SurfaceView(this);WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(10, 10,WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,PixelFormat.TRANSLUCENT);layoutParams.gravity = Gravity.LEFT | Gravity.TOP;windowManager.addView(surfaceView, layoutParams);surfaceView.getHolder().addCallback(this);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {try {mediaRecorder = new MediaRecorder();camera = Camera.open(RecordApp.getInstance().getCurrentCamera());camera.unlock();mediaRecorder.setCamera(camera);mediaRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() {@Overridepublic void onError(MediaRecorder mr, int what, int extra) {mediaRecorder.stop();mediaRecorder.release();mediaRecorder = null;}});mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//aac_adif, aac_adts, output_format_rtp_avp, output_format_mpeg2ts ,webmmediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);//  mediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);// mediaRecorder.setVideoSize(640,480);if(RecordApp.getInstance().getCurrentCamera() == 0){mediaRecorder.setVideoEncodingBitRate(2*1024 * 1024);mediaRecorder.setVideoFrameRate(20);mediaRecorder.setVideoSize(640,480);if (RecordApp.getInstance().isVertical()) {Log.d("JXDBACKRecord","竖屏录制");mediaRecorder.setOrientationHint(90);}else{Log.d("JXDBACKRecord","横屏录制");mediaRecorder.setOrientationHint(90);}}else {mediaRecorder.setVideoEncodingBitRate(1024 * 1024);mediaRecorder.setVideoFrameRate(20);mediaRecorder.setVideoSize(640,480);if (RecordApp.getInstance().isVertical()) {Log.d("JXDBACKRecord","竖屏录制");mediaRecorder.setOrientationHint(270);}else{Log.d("JXDBACKRecord","横屏录制");mediaRecorder.setOrientationHint(90);}}mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());File folder = new File( Environment.getExternalStorageDirectory()+ File.separator+"1ARecordService");if(!folder.exists()){folder.mkdirs();}mediaRecorder.setOutputFile(folder.getAbsolutePath()+File.separator+DateFormat.format("yyyy-MM-dd_kk-mm-ss", new Date().getTime())+ ".mp4");mediaRecorder.prepare();mediaRecorder.start();} catch (Exception e) {Log.e("JXDBACKRecord","设置录像参数异常");e.printStackTrace();}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}// Stop recording and remove SurfaceView@Overridepublic void onDestroy() {if(mediaRecorder!=null){mediaRecorder.stop();mediaRecorder.reset();mediaRecorder.release();}if(camera!=null){camera.lock();camera.release();}if(windowManager!=null){windowManager.removeView(surfaceView);}}}

开启前台服务:

   Intent intent = new Intent(MainActivity.this, RecordBackService.class);startForegroundService(intent);或者startService(intent); 看你的api版本

快上车,老司机带你实现后台录像功能相关推荐

  1. 老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩、击穿、穿透

    前文回顾 建议前一篇文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 过期策略 Redis 的过期策略都有哪些? 在聊这个问题之前,一定 ...

  2. 十年建站老司机带你十分钟搭建网站

    十年建站老司机带你十分钟搭建网站 本文概要: 1. 域名 + 域名注册 + 域名备案 + 域名解析绑定 2. 服务器 + 虚拟主机 + windows服务器 + linux服务器 3. CMS建站系统 ...

  3. Java用map实现沁园春_QQ飞车:沁园春地图车神跑法,实力老司机带你了解这几个技巧...

    原标题:QQ飞车:沁园春地图车神跑法,实力老司机带你了解这几个技巧 QQ手游飞车上线以来收获了一大堆的迷妹迷弟,小编当然也是其中之一啦,小编在这里给大家带来最新的游戏资讯,和各种模式以及赛道的解说. ...

  4. 纵剑仙界一直显示连接服务器,纵剑仙界h5新手指引 老司机带你少走弯路

    纵剑仙界h5新手指引,老司机带你少走弯路.新手初来乍到,不知道该做什么怎么办?别怕!让小编来手把手教你玩转纵剑仙界! 在<纵剑仙界>手游中,等级是一个非常重要的因素.除了转生.装备高阶装备 ...

  5. 老司机带你从源码开始撸Spring生命周期!!!

    导读 Spring在Java Web方面有着举足轻重的地位,spring的源码设计更是被很多开发者所惊叹,巧妙的设计,精细的构思,都注定他的地位.今天陈某大言不惭的带你来从源码角度解析Spring的生 ...

  6. 老司机带你玩转SDL(一)

    老司机带你玩转SDL --第一站"缘由" 啦啦啦,啦啦啦 我是SDL的老司机 大厂小厂曾呆过 今天的内容真正好 带着大家把SDL玩转了 ---- 伴随着类似聂耳<卖报歌> ...

  7. 短视频+直播源码,直播老司机带你飞

    短视频+直播源码,直播老司机带你飞 脱胎于视频直播的短视频以近乎疯狂的速度攫取着互联网的流量,当抖音.快手的月活已经足够强大,他们又毫不犹豫地切入了直播腹地. 当互联网竞争进入下半场,依靠互联网人口. ...

  8. 金士顿固态硬盘不认盘修复_#原创新人#老司机带你玩转PC,故障之SSD篇 篇一:金士顿 V300 240G SATA3 固态硬盘 丢盘掉速解决记录...

    #原创新人#老司机带你玩转PC,故障之SSD篇 篇一:金士顿 V300 240G SATA3 固态硬盘 丢盘掉速解决记录 2016-10-25 11:14:08 12点赞 72收藏 23评论 小编注: ...

  9. 直播平台怎么搭建,老司机带你了解

    直播平台怎么搭建,老司机带你了解 1.创建前端工程 直播平台怎么搭建毫无疑问,搭建一个项目的框架,那第一步肯定是得创建一个工程啦.cmd命令,输入vue create mylive ,然后一直回车就好 ...

最新文章

  1. 工程介绍好处费性质_水运工程造价工程师继续教育课件上新丨海外水运工程造价编制介绍课程发布...
  2. Firefox 控制台
  3. 浅析手机端网站建设的基本流程
  4. 在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序
  5. 实例——在编程过程中进行单元测试
  6. Python为何如此优秀?斯坦福教授告诉你!
  7. js hover图片放大不遮挡_CSS3+JS 实现放大镜
  8. Educational Codeforces Round 23 E. Choosing The Commander 字典树
  9. windows 读写锁 python_用Python实现读写锁的示例代码
  10. ORDER BY 子句在视图、派生表、子查询等表达式中无效
  11. java计算机毕业设计服装批发进销存系统MyBatis+系统+LW文档+源码+调试部署
  12. hi3519叠加OSD
  13. 基于二阶矩阵的优化问题(一)线搜索策略(附matlab代码)
  14. Flowers Sky Wallet First school/Primary school holiday Getting up early Reading Home c
  15. java写的家谱_关于java:家谱计划的逻辑
  16. GPS,RTK,PPS及网络RTK科普
  17. DOOM之父约翰·卡马克
  18. mysql数据库外连_数据库外连接及MySQL实现
  19. 物联网无线技术具体是怎么分类的,主要的应用场景是什么?
  20. 图像视觉保真度(VIF)评估-MATLAB代码与matlab-PyrTools-master工具包

热门文章

  1. 关于考研的反省和一些感悟
  2. WF2011 Chips Challenge
  3. yo generator 强制更新文件
  4. 【LaTex】3.2 数据结构(TikZ)
  5. C++数据结构,三万字详解(强烈建议收藏)
  6. 联通签到php,联通营业厅微博双签(云函数自动签到)
  7. python jupyter notebook 多个excel文档合并
  8. 记win10下ubantu子系统运行shell脚本的坑
  9. 职场是个技术活-马未都
  10. 社会要去温暖每一个打工人