Android应用提供了Camera来控制拍照,使用Camera进行拍照的步骤:

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

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

3、调用Camera.Parameters对象方法设置拍照参数。

4、调用Camera的setParameter(),将Camera.Parameters对象作为参数传入,既可对相机的拍照参数进行控制,注:Android 2.2.3以后不需要这步。

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

6、调用Camera的takePicture()方法进行拍照。

7、结束程序时,调用Camera的stopPreview()结束取景预览,并调用release()方法释放资源。

下面直接上代码:

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

Android Camera进行拍照的更多相关文章

  1. Android Camera后台拍照

    http://item.congci.com/item/android-camera-houtai-paizhao 有许多人希望在不让用户知道的情况下,使用Android后台Service调用摄像头拍 ...

  2. Android之Camera控制拍照

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

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

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

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

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

  5. Android Camera 拍照 三星BUG总结

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

  6. Android Camera拍照 压缩

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

  7. Android — Camera聚焦流程

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

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

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

  9. android: 调用摄像头拍照

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

随机推荐

  1. C#:涉及DPI的高分辨率下的显示问题

    一.背景 在PC机上显示正常,在高分辨率下的Pad上,显示出现问题: 1.显示在屏幕最右端的窗体(控件)显示不出来: 2.截图时,被截图的界面字体文字变大,界面因此显示不全. 二.解决方法: 方法一: ...

  2. CSS中的浮动问题

    有关于我们经常做的导航问题.我们如果想用ul>li来做导航的话,我是一般是用到浮动这个属性的. 也就是 float:left; 或者是 display:inline-block;  下边代码: ...

  3. AC自动机——Uva 11468 子串

    题目链接:http://vjudge.net/contest/142513#problem/A 题意:给出一些字符和各自对应的选择概率,随机选择L次后将得到一个长度为L的随机字符串S.给出K个模版串, ...

  4. [ASM C/C++] C makefile:2: *** missing separator. Stop. 问题

    在利用make编译代码时,makefile文件的目标代码前面要用tab而不能用空格来代替. 要不然就会提示: makefile:2: *** missing separator.  Stop. 要注意 ...

  5. AOJ 0121: Seven Puzzle (BFS DP STL 逆向推理)(转载)

    转载自:  http://m.blog.csdn.net/blog/Enjoying_Science/42008801 题目链接:http://acm.hust.edu.cn/vjudge/probl ...

  6. 如何使用double-check实现一个单例模式

    private object m_mutex = new object(); private bool m_initialized = false; private BigInstance m_ins ...

  7. R----stringr包介绍学习

    1. stringr介绍 stringr包被定义为一致的.简单易用的字符串工具集.所有的函数和参数定义都具有一致性,比如,用相同的方法进行NA处理和0长度的向量处理. 字符串处理虽然不是R语言中最主要 ...

  8. centos配置163源

    1.参考Centos镜像帮助 (1.1)备份原始repo shell> sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Ce ...

  9. Android ListView简单实用

    layout创建: activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/ ...

  10. jQuery核心之DOM操作的常用方法

    参考jQuery官网API文档 1..attr() 获取 :  ); 3.选择器与常用方法: ) .html( "new text for the third h3!" ) .en ...