http://item.congci.com/item/android-camera-houtai-paizhao

有许多人希望在不让用户知道的情况下,使用Android后台Service调用摄像头拍照,网上不少资料,都讲到不预览无法实现拍照,涉及到用户隐私,属于非法调用摄像头...怎么办!!!

曾经看到一篇博文,里面有一句经典的话:没有什么是绝对的,没有什么是绕不过去的。接下来就来分析一下怎么绕过去,实现不预览拍照。

要求①:不让用户看到拍照界面

难点:预览界面必须在一个Activity上,而弹出了Activity之后,用户再傻,都知道你在干嘛,怎么办!!

思路:弹出Activity就弹出吧,咱对Activity做手脚,让他全透明,再来个全屏,和无标题栏,不就和没东西弹出来一个效果。

要点②:不预览

难点:非法调用摄像头,怎么办!!报错 "take picture failed ! !"

思路:你要在Activity上有SurfaceView进行预览,那就来一个SurfaceView,打不了咱再对SurfaceView做手脚就是   了...设这SurfaceView长和宽都为0.1  你不是要预览吗,也有,问题是预览框这么小,要是你还能看到那就没办   法了...

好了,不多说,思路有了就开始工作:

首先,用来拍照的Activity布局:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context=".MyCamera" >
  6. <!-- 预览框,长宽都为0.1 -->
  7. <SurfaceView
  8. android:id="@+id/camera_surfaceview"
  9. android:layout_width="0.1dp"
  10. android:layout_height="0.1dp" >
  11. </SurfaceView>
  12. </RelativeLayout>

接下来时全透明,在AndroidManifest.xml里,主题设置成全透明,记得添加调用摄像头权限、自动对焦权限和读写SD卡权限:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.chenww.camera.ui"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-sdk
  7. android:minSdkVersion="10"
  8. android:targetSdkVersion="16">
  9. </uses-sdk>
  10. <!-- 调用相机权限 -->
  11. <uses-permission android:name="android.permission.CAMERA" />
  12. <uses-feature android:name="android.hardware.camera" />
  13. <uses-feature android:name="android.hardware.camera.autofocus" />
  14. <!-- 读写SD卡权限 -->
  15. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  16. <application
  17. android:allowBackup="true"
  18. android:icon="@drawable/ic_launcher"
  19. android:label="@string/app_name"
  20. android:theme="@style/AppTheme" >
  21. <!-- 拍照界面Activity -->
  22. <activity
  23. android:name="com.chenww.camera.ui.CameraActivity"
  24. android:theme="@android:style/Theme.Translucent" >
  25. <!-- theme设置成全透明 -->
  26. <intent-filter>
  27. <action android:name="android.intent.action.MAIN" />
  28. <category android:name="android.intent.category.LAUNCHER" />
  29. </intent-filter>
  30. </activity>
  31. </application>
  32. </manifest>

然后是CameraActivity.java文件,这里就得在oncreate开头添加如下代码设置窗口全屏并且无标题。

  1. // 无title
  2. requestWindowFeature(Window.FEATURE_NO_TITLE);
  3. // 全屏
  4. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  5. WindowManager.LayoutParams.FLAG_FULLSCREEN);

绑定SurfaceView 初始化SurfaceHolder

  1. //初始化surfaceview
  2. mySurfaceView = (SurfaceView) findViewById(R.id.camera_surfaceview);
  3. //初始化surfaceholder
  4. myHolder = mySurfaceView.getHolder();
  5. myHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

接下来,初始化Camera对象,并调用该对象的setPreviewDisplay函数设置SurfaceHolder对象(这里为myHolder)

  1. //这里的myCamera为已经初始化的Camera对象
  2. myCamera.setPreviewDisplay(myHolder);

接下来就是拍照,不过记得在takepicture之前startPreview

这里提醒一下,能把拍照代码直接写在oncreate函数里,那时Activity还未初始化完成,SurfaceView还没出来,结果就是 "take ticture failed!!",最好在oncreate内新建一个线程执行拍照操作,一般不建议在UI线程内实现耗时操作。

并且摄像头的开启需要一定的事件,最好在调用open函数之后让线程睡个两秒。

  1. myCamera.startPreview();
  2. //自动对焦
  3. myCamera.autoFocus(myAutoFocus);
  4. //对焦后拍照
  5. myCamera.takePicture(null, null, myPicCallback);

上面的myAutoFocus及myPicCallback分别自动对焦回调函数和成功拍照回调函数

myAutoFocus我直接空实现,可以直接new一个接口对象,不过那样代码太乱,干脆空实现。

myPicCallback的话,就是实现onPictureTaken函数,在里面对摄像头拍摄下来的照片字节数据进行处理(存储)。

额....废话多了点,上代码:

myAutoFocus:

  1. //自动对焦回调函数(空实现)
  2. private AutoFocusCallback myAutoFocus = new AutoFocusCallback() {
  3. @Override
  4. public void onAutoFocus(boolean success, Camera camera) {
  5. }
  6. };

myPicCallback:

  1. //拍照成功回调函数
  2. private PictureCallback myPicCallback = new PictureCallback() {
  3. @Override
  4. public void onPictureTaken(byte[] data, Camera camera) {
  5. }
  6. }

骚年,在处理完Camera返回的数据之后,记得关闭Activity并各种释放资源

  1. //完成拍照后关闭Activity
  2. MyCameraActivity.this.finish();
  3. myCamera.stopPreview();
  4. myCamera.release();
  5. myCamera = null;

PS:对照片的处理,我在上一篇博文中有讲到,比如android摄像头获取的照片都是横屏的...要让他直起来怎么搞或者是竖直预览:点击打开链接

最后,我把我做的一个小小的后台拍照Demo发上来,供大家学习。

打开程序后自动调用前置摄像头,如果无前置则调用后置摄像头,并将获取的照片调整为竖屏。

ps:导入工程后最好右键工程 android tools -->fix project properties  另外,我使用的是4.1.2版本编译,如果需要改,右键工程properties-->android选择其他版本

Android Camera后台拍照的更多相关文章

  1. Android Camera进行拍照

    Android应用提供了Camera来控制拍照,使用Camera进行拍照的步骤: 1.调用Camera的open()方法打开相机. 2.调用Camera的getParameters()方法获取拍照参数 ...

  2. 使用Camera进行拍照 & 后台静默拍照的思路

    Android中的Camera可以用来进行自定义相机.取景框实时预览.拍照等操作.在5.0中,这个类不推荐使用了,新出了一个Camera2,那个东西没怎么研究过,反正一时半会用不到.本篇讲解的是如果用 ...

  3. Android之Camera控制拍照

    package com.android.xiong.cameratest; import java.io.File; import java.io.FileOutputStream; import j ...

  4. Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能

    Android Camera开发系列(下)--自定义Camera实现拍照查看图片等功能 Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 上 ...

  5. Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片

    Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 最近也是在搞个破相机,兼容性那叫一个不忍直视啊,于是自己翻阅了一些基本的资料,自己实现了一 ...

  6. Android Camera 拍照 三星BUG总结

    Android Camera 三星BUG  : 近期在Android项目中使用拍照功能 , 其他型号的手机执行成功了  只有在三星的相机上遇到了bug . BUG详细体现为 : (1) 摄像头拍照后图 ...

  7. Android Camera拍照 压缩

    http://www.linuxidc.com/Linux/2014-12/110924.htm package com.klp.demo_025; import java.io.ByteArrayI ...

  8. Android — Camera聚焦流程

    原文  http://www.cnphp6.com/archives/65098 主题 Android Camera.java autoFocus()聚焦回调函数 @Override public v ...

  9. Android调用相册拍照控件实现系统控件缩放切割图片

    android 下如果做处理图片的软件 可以调用系统的控件 实现缩放切割图片 非常好的效果 今天写了一个demo分享给大家 package cn.m15.test; import java.io.By ...

随机推荐

  1. POJ-1458.CommonSubsequence.(DP:最长公共子序列裸题)

    本题大意:给出两个字符串,让你求出最长公共子序列的长度并输出. 本题思路:本题是经典的DP问题,由于是两个字符串,那么我们就用一个二维数组来进行区分,用dp[ i ][ j ]来表示在s1和s2中分别 ...

  2. 【zipkin】链路追踪

    1,安装zipkin:https://zipkin.io/pages/quickstart.html 推荐使用docker去安装zipkin服务,下载安装执行都有了.缺点是下载要等待一段时间 2,使用 ...

  3. visual studio build and rebuild 的区别

    build 只编译发生改变的dll, (如下, 我只修改了web API,build的时候, 只有webAPI.dll发生更新) rebuild = clean + build (如下, 本项目中dl ...

  4. blockchain good article

    https://medium.com/programmers-blockchain/create-simple-blockchain-java-tutorial-from-scratch-6eeed3 ...

  5. 微软官方的.net开发人员代码示例

    微软官方的.net开发人员代码示例,需要的同学到这里下载: https://code.msdn.microsoft.com/

  6. 数据库以及pymysql

    1.pymysql模块操作数据库详细 import pymysql # user = 'chun' # psw = conn = pymysql.connect(host='localhost',us ...

  7. c#dev tabcontrol 与嵌套gridcontrol 总结

    Gridcontrol设置 1: 拖进去的时候别拖到tabcontrol外边, 否则dock 停靠的时候,停靠错了地方. 2:去掉Drag a column header here to group. ...

  8. guide dpdk

    Welcome to DPDK Guide! Contents: Setting up DPDK Important Prerequisites Setting up repositories Red ...

  9. What is MaxiSys Pro MS908P Software Advantage

    The Autel Maxisys Pro Diagnostic Platform is an evolutionary smart solution for specialized automoti ...

  10. python中的迭代器 生成器 装饰器

    什么迭代器呢?它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了__iter__和__next__()(python2中实现next())方法的对象都是迭代器,_ ...