现在的手机的功能可谓是五花八门,手机照相功能就是特别突出的一点,现在的手机照相机甚至成了专业数码照相机,可以拍摄出清晰的照片和录制高分辨率的视频。Android操作系统呢,提供了相应的功能来控制拍照:

通过Camera进行拍照

1.调用Camera的open()方法打开相机。

2.调用Camera的setParameters()方法获取拍照参数。该方法返回一个Camera.Parameters对象。

3.调用Camera.Paramers对象方法设置拍照参数

4.调用Camera的startPreview()方法开始预览取景,在预览取景之前需要调用Camera的setPreViewDisplay(SurfaceHolder holder)方法设置使用哪个SurfaceView来显示取景图片。

5.调用Camera的takePicture()方法进行拍照.

6.结束程序时,调用Camera的StopPriview()结束取景预览,并调用release()方法释放资源.

创建项目:CaptureImage

运行效果:

程序代码:

==>CaptureImage.java

  1. package org.wwj.sound;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import android.app.Activity;
  6. import android.app.AlertDialog;
  7. import android.content.Context;
  8. import android.content.DialogInterface;
  9. import android.content.DialogInterface.OnClickListener;
  10. import android.graphics.Bitmap;
  11. import android.graphics.Bitmap.CompressFormat;
  12. import android.graphics.BitmapFactory;
  13. import android.graphics.PixelFormat;
  14. import android.hardware.Camera;
  15. import android.hardware.Camera.PictureCallback;
  16. import android.os.Bundle;
  17. import android.os.Environment;
  18. import android.view.Display;
  19. import android.view.KeyEvent;
  20. import android.view.SurfaceHolder;
  21. import android.view.SurfaceHolder.Callback;
  22. import android.view.SurfaceView;
  23. import android.view.View;
  24. import android.view.Window;
  25. import android.view.WindowManager;
  26. import android.widget.EditText;
  27. import android.widget.ImageView;
  28. public class CaptureImage extends Activity
  29. {
  30. SurfaceView sView;
  31. SurfaceHolder surfaceHolder;
  32. int screenWidth, screenHeight;
  33. // 定义系统所用的照相机
  34. Camera camera;
  35. //是否在浏览中
  36. boolean isPreview = false;
  37. @Override
  38. public void onCreate(Bundle savedInstanceState)
  39. {
  40. super.onCreate(savedInstanceState);
  41. // 设置全屏
  42. requestWindowFeature(Window.FEATURE_NO_TITLE);
  43. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  44. WindowManager.LayoutParams.FLAG_FULLSCREEN);
  45. setContentView(R.layout.main);
  46. WindowManager wm = (WindowManager) getSystemService(
  47. Context.WINDOW_SERVICE);
  48. Display display = wm.getDefaultDisplay();
  49. // 获取屏幕的宽和高
  50. screenWidth = display.getWidth();
  51. screenHeight = display.getHeight();
  52. // 获取界面中SurfaceView组件
  53. sView = (SurfaceView) findViewById(R.id.sView);
  54. // 获得SurfaceView的SurfaceHolder
  55. surfaceHolder = sView.getHolder();
  56. // 为surfaceHolder添加一个回调监听器
  57. surfaceHolder.addCallback(new Callback()
  58. {
  59. public void surfaceChanged(SurfaceHolder holder, int format, int width,
  60. int height)
  61. {
  62. }
  63. public void surfaceCreated(SurfaceHolder holder)
  64. {
  65. // 打开摄像头
  66. initCamera();
  67. }
  68. public void surfaceDestroyed(SurfaceHolder holder)
  69. {
  70. // 如果camera不为null ,释放摄像头
  71. if (camera != null)
  72. {
  73. if (isPreview)
  74. camera.stopPreview();
  75. camera.release();
  76. camera = null;
  77. }
  78. }
  79. });
  80. // 设置该SurfaceView自己不维护缓冲
  81. surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  82. }
  83. private void initCamera()
  84. {
  85. if (!isPreview)
  86. {
  87. camera = Camera.open();
  88. }
  89. if (camera != null && !isPreview)
  90. {
  91. try
  92. {
  93. Camera.Parameters parameters = camera.getParameters();
  94. // 设置预览照片的大小
  95. parameters.setPreviewSize(screenWidth, screenHeight);
  96. // 每秒显示4帧
  97. parameters.setPreviewFrameRate();
  98. // 设置图片格式
  99. parameters.setPictureFormat(PixelFormat.JPEG);
  100. // 设置JPG照片的质量
  101. parameters.set();
  102. //设置照片的大小
  103. parameters.setPictureSize(screenWidth, screenHeight);
  104. camera.setParameters(parameters);
  105. //通过SurfaceView显示取景画面
  106. camera.setPreviewDisplay(surfaceHolder);
  107. // 开始预览
  108. camera.startPreview();
  109. // 自动对焦
  110. camera.autoFocus(null);
  111. }
  112. catch (Exception e)
  113. {
  114. e.printStackTrace();
  115. }
  116. isPreview = true;
  117. }
  118. }
  119. @Override
  120. public boolean onKeyDown(int keyCode, KeyEvent event)
  121. {
  122. switch (keyCode)
  123. {
  124. // 当用户单击照相键、中央键时执行拍照
  125. case KeyEvent.KEYCODE_DPAD_CENTER:
  126. case KeyEvent.KEYCODE_CAMERA:
  127. )
  128. {
  129. // 拍照
  130. camera.takePicture(nullnull , myjpegCallback);
  131. return true;
  132. }
  133. break;
  134. }
  135. return super.onKeyDown(keyCode, event);
  136. }
  137. PictureCallback myjpegCallback = new PictureCallback()
  138. {
  139. public void onPictureTaken(byte[] data, Camera camera)
  140. {
  141. // 根据拍照所得的数据创建位图
  142. final Bitmap bm = BitmapFactory.decodeByteArray(data
  143. , , data.length);
  144. // 加载/layout/save.xml文件对应的布局资源
  145. View saveDialog = getLayoutInflater().inflate(
  146. R.layout.save, null);
  147. final EditText photoName = (EditText) saveDialog
  148. .findViewById(R.id.photo_name);
  149. // 获取saveDialog对话框上的ImageView组件
  150. ImageView show = (ImageView) saveDialog.findViewById(R.id.show);
  151. // 显示刚刚拍得的照片
  152. show.setImageBitmap(bm);
  153. //使用对话框显示saveDialog组件
  154. new AlertDialog.Builder(CaptureImage.this)
  155. .setView(saveDialog)
  156. .setPositiveButton("保存", new OnClickListener()
  157. {
  158. public void onClick(DialogInterface dialog,
  159. int which)
  160. {
  161. // 创建一个位于SD卡上的文件
  162. File file = new File(Environment.getExternalStorageDirectory()
  163. ,  photoName.getText().toString() + ".jpg");
  164. FileOutputStream outStream = null;
  165. try
  166. {
  167. // 打开指定文件对应的输出流
  168. outStream = new FileOutputStream(file);
  169. // 把位图输出到指定文件中
  170. bm.compress(CompressFormat.JPEG, , outStream);
  171. outStream.close();
  172. }
  173. catch (IOException e)
  174. {
  175. e.printStackTrace();
  176. }
  177. }
  178. })
  179. .setNegativeButton("取消", null)
  180. .show();
  181. //重新浏览
  182. camera.stopPreview();
  183. camera.startPreview();
  184. isPreview = true;
  185. }
  186. };
  187. }

设置权限:

  1. <!-- 授予程序使用摄像头的权限 -->
  2. <uses-permission android:name="android.permission.CAMERA" />
  3. <uses-feature android:name="android.hardware.camera" />
  4. <uses-feature android:name="android.hardware.camera.autofocus" />

Android多媒体应用开发-控制摄像头拍照的更多相关文章

  1. Android开发之控制摄像头拍照

    如今的手机一般都会提供相机功能,有些相机的镜头甚至支持1300万以上像素,有些甚至支持独立对焦.光学变焦这些仅仅有单反才有的功能,甚至有些手机直接宣传能够拍到星星.能够说手机已经变成了专业数码相机.为 ...

  2. 在WPF中使用AForge.net控制摄像头拍照

    原文:在WPF中使用AForge.net控制摄像头拍照 利用AForge.net控制摄像头拍照最方便的方法就是利用PictureBox显示摄像头画面,但在WPF中不能直接使用PictureBox.必须 ...

  3. 用Python控制摄像头拍照并发邮件

    概述前言 工具 思路 安装及导入包 设置参数 实现拍照 构造邮件内容 发送邮件 判断网络连接 开机自启 后记 o1 前言为什么会有写这个程序的想法呢? 最初的想法是写一个可以用电脑前置摄像头拍照的程序 ...

  4. Python控制自己的手机摄像头拍照,并把照片自动发送到邮箱

    写在前面的一些P话: 今天这个案例,就是控制自己的摄像头拍照,并且把拍下来的照片,通过邮件发到自己的邮箱里.想完成今天的这个案例,只要记住一个重点:你需要一个摄像头 思路 通过opencv调用摄像头拍 ...

  5. Android开发手记(32) 使用摄像头拍照

    在Android中,使用摄像头拍照一般有两种方法, 一种是调用系统自带的Camera,另一种是自己写一个摄像的界面. 我们要添加如下权限: <uses-permission android:na ...

  6. VS2010开发MFC ActiveX,摄像头拍照上传Webservice(2)

    继续记录,第二步开发摄像头拍照功能. 使用vfw.h开发摄像头拍照功能,关于vfw网上有很多文章,很多代码可以参考 参考:http://blog.163.com/huangqiao_8/blog/st ...

  7. android: 调用摄像头拍照

    很多应用程序都可能会使用到调用摄像头拍照的功能,比如说程序里需要上传一张图片 作为用户的头像,这时打开摄像头拍张照是最简单快捷的.下面就让我们通过一个例子来学 习一下,如何才能在应用程序里调用手机的摄 ...

  8. Android开发技巧——Camera拍照功能

    本篇是我对开发项目的拍照功能过程中,对Camera拍照使用的总结.由于camera2是在api level 21(5.0.1)才引入的,而Camera到6.0仍可使用,所以暂未考虑camera2. 文 ...

  9. VS2010开发MFC ActiveX,摄像头拍照上传Webservice(1)

    最近工作项目,BS中需要用到摄像头拍照,需要存储本地,同时上传到服务器,尝试使用vc++做ActiveX来实现. 完全没有使用过vc,上网搜索各种知识,初步完成.在这里记录下有帮助的资料. 第一步:编 ...

随机推荐

  1. android 官网处理图片 代码

    /** * 获取压缩后的图片 (官网大图片加载对应代码) * * @param res * @param resId * @param reqWidth * 所需图片压缩尺寸最小宽度 * @param ...

  2. Oracle中表结构和表内容复制

    处理该问题注意以下几点: 1. 清空表中数据SQL:truncate table table_name; 2.复制表结构SQL:create table table_name1 as select * ...

  3. Config配置文件详解

    (默认的配置设置)以下所有的代码都应该位于 <configuration> <system.web> 和 </system.web> </configurat ...

  4. Probabilistic SVM 与 Kernel Logistic Regression(KLR)

    本篇讲的是SVM与logistic regression的关系. (一) SVM算法概论 首先我们从头梳理一下SVM(一般情况下,SVM指的是soft-margin SVM)这个算法. 这个算法要实现 ...

  5. bzoj 4423 [AMPPZ2013]Bytehattan(对偶图,并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4423 [题意] 给定一个平面图,随时删边,并询问删边后两点是否连通.强制在线. [科普 ...

  6. 《Genesis-3D开源游戏引擎-官方录制系列视频教程:进阶实例篇》

    注:本系列教程仅针对引擎编辑器:v1.2.2及以下版本 G3D进阶实例   第四课<2D编辑与脚本的统一入口> 使用G3D完成一个简单的类飞机大战游戏,介绍了G3D2d游戏制作的流程包括: ...

  7. 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇02:滚屏》

    2.滚屏 滚屏概述: 打飞机游戏场景背景设计通常很简单,因为角色敌人道具等都不与背景发生交互事件.开发者只需要根据设定的游戏类型,为游戏制作背景,模拟一个大环境即可. 滚屏原理: 材质UV动画,实现背 ...

  8. C++中的重载,隐藏,覆盖,虚函数,多态浅析

    直到今日,才发现自己对重载的认识长时间以来都是错误的.幸亏现在得以纠正,真的是恐怖万分,雷人至极.一直以来,我认为重载可以发生在基类和派生类之间,例如: class A { public: void ...

  9. 从Count看Oracle执行计划的选择

    一. 前言 在调查一个性能问题的时候,一个同事问道,为什么数据库有些时候这么不聪明,明明表上有索引,但是在执行一个简单的count的时候居然全表扫描了!难道不知道走索引更快么? 试图从最简单的coun ...

  10. 如何使用git创建远程仓库(供局域网多人使用)

    用git init(默认创建的是私人的仓库)创建的仓库,推送是不会成功的. 因此在git server端,我们要用 git --bare init --shared=group 来创建一个bare库, ...