1. package com.android.xiong.cameratest;
  2.  
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6.  
  7. import android.app.Activity;
  8. import android.app.AlertDialog;
  9. import android.content.DialogInterface;
  10. import android.graphics.Bitmap;
  11. import android.graphics.Bitmap.CompressFormat;
  12. import android.graphics.BitmapFactory;
  13. import android.graphics.ImageFormat;
  14. import android.hardware.Camera;
  15. import android.hardware.Camera.AutoFocusCallback;
  16. import android.hardware.Camera.PictureCallback;
  17. import android.hardware.Camera.ShutterCallback;
  18. import android.os.Bundle;
  19. import android.os.Environment;
  20. import android.util.DisplayMetrics;
  21. import android.view.Display;
  22. import android.view.Menu;
  23. import android.view.SurfaceHolder;
  24. import android.view.SurfaceHolder.Callback;
  25. import android.view.LayoutInflater;
  26. import android.view.SurfaceView;
  27. import android.view.View;
  28. import android.view.Window;
  29. import android.view.WindowManager;
  30. import android.widget.EditText;
  31. import android.widget.ImageView;
  32.  
  33. public class MainActivity extends Activity {
  34.  
  35. SurfaceView sView;
  36. SurfaceHolder surfaceHodler;
  37. int screenWidth, screenHeight;
  38. // 定义系统所用的照相机
  39. Camera camera;
  40. // 是否存在预览中
  41. boolean isPreview = false;
  42.  
  43. @Override
  44. protected void onCreate(Bundle savedInstanceState) {
  45. super.onCreate(savedInstanceState);
  46. // 设置全屏
  47. requestWindowFeature(Window.FEATURE_NO_TITLE);
  48. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  49. WindowManager.LayoutParams.FLAG_FULLSCREEN);
  50. setContentView(R.layout.activity_main);
  51. // 获取窗口管理器
  52. WindowManager wm = getWindowManager();
  53. Display display = wm.getDefaultDisplay();
  54. DisplayMetrics metrics = new DisplayMetrics();
  55. // 获取屏幕的宽和高
  56. display.getMetrics(metrics);
  57. screenWidth = metrics.widthPixels;
  58. screenHeight = metrics.heightPixels;
  59. sView = (SurfaceView) findViewById(R.id.sView);
  60. // 设置surface不需要自己的维护缓存区
  61. sView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  62. // 获得SurfaceView的SurfaceHolder
  63. surfaceHodler = sView.getHolder();
  64. // 为srfaceHolder添加一个回调监听器
  65. surfaceHodler.addCallback(new Callback() {
  66.  
  67. @Override
  68. public void surfaceDestroyed(SurfaceHolder arg0) {
  69. // 如果camera不为null,释放摄像头
  70. if (camera != null) {
  71. if (isPreview)
  72. camera.stopPreview();
  73. camera.release();
  74. camera = null;
  75. }
  76. }
  77.  
  78. @Override
  79. public void surfaceCreated(SurfaceHolder arg0) {
  80. // 打开摄像头
  81. initCamera();
  82.  
  83. }
  84.  
  85. @Override
  86. public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
  87. int arg3) {
  88. }
  89. });
  90. }
  91.  
  92. private void initCamera() {
  93. if (!isPreview) {
  94. // 此处默认打开后置摄像头
  95. // 通过传入参数可以打开前置摄像头
  96. camera = Camera.open();
  97. camera.setDisplayOrientation(90);
  98. }
  99. if (!isPreview && camera != null) {
  100. Camera.Parameters parameters = camera.getParameters();
  101. // 设置预览照片的大小
  102. parameters.setPreviewSize(screenWidth, screenHeight);
  103. // 设置预览照片时每秒显示多少帧的最小值和最大值
  104. parameters.setPreviewFpsRange(4, 10);
  105. // 设置照片的格式
  106. parameters.setPictureFormat(ImageFormat.JPEG);
  107. // 设置JPG照片的质量
  108. parameters.set("jpeg-quality", 85);
  109. // 设置照片的大小
  110. parameters.setPictureSize(screenWidth, screenHeight);
  111. // 通过SurfaceView显示取景画面
  112. try {
  113. camera.setPreviewDisplay(surfaceHodler);
  114. } catch (IOException e) {
  115. // TODO Auto-generated catch block
  116. e.printStackTrace();
  117. }
  118. // 开始预览
  119. camera.startPreview();
  120. isPreview = true;
  121. }
  122. }
  123.  
  124. public void capture(View source) {
  125. if (camera != null) {
  126. // 控制摄像头自动对焦后才拍摄
  127. camera.autoFocus(autoFocusCallback);
  128. }
  129. }
  130.  
  131. AutoFocusCallback autoFocusCallback = new AutoFocusCallback() {
  132.  
  133. @Override
  134. public void onAutoFocus(boolean arg0, Camera arg1) {
  135. if (arg0) {
  136. // takePicture()方法需要传入三个监听参数
  137. // 第一个监听器;当用户按下快门时激发该监听器
  138. // 第二个监听器;当相机获取原始照片时激发该监听器
  139. // 第三个监听器;当相机获取JPG照片时激发该监听器
  140. camera.takePicture(new ShutterCallback() {
  141.  
  142. @Override
  143. public void onShutter() {
  144. // 按下快门瞬间会执行此处代码
  145. }
  146. }, new PictureCallback() {
  147.  
  148. @Override
  149. public void onPictureTaken(byte[] arg0, Camera arg1) {
  150. // 此处代码可以决定是否需要保存原始照片信息
  151. }
  152. }, myJpegCallback);
  153. }
  154.  
  155. }
  156. };
  157. PictureCallback myJpegCallback = new PictureCallback() {
  158.  
  159. @Override
  160. public void onPictureTaken(byte[] data, Camera camera) {
  161. // 根据拍照所得的数据创建位图
  162. final Bitmap bm = BitmapFactory.decodeByteArray(data, 0,
  163. data.length);
  164. // 加载布局文件
  165. View saveDialog = getLayoutInflater().inflate(R.layout.save, null);
  166. final EditText potoName = (EditText) saveDialog
  167. .findViewById(R.id.photoNmae);
  168. // 获取saveDialog对话框上的ImageView组件
  169. ImageView show = (ImageView) saveDialog.findViewById(R.id.show);
  170. // 显示刚刚拍得的照片
  171. show.setImageBitmap(bm);
  172. // 使用AlertDialog组件
  173. new AlertDialog.Builder(MainActivity.this)
  174. .setView(saveDialog)
  175. .setNegativeButton("取消", null)
  176. .setPositiveButton("保存",
  177. new DialogInterface.OnClickListener() {
  178. @Override
  179. public void onClick(DialogInterface arg0,
  180. int arg1) {
  181. // 创建一个位于SD卡上的文件
  182. File file = new File(Environment
  183. .getExternalStorageDirectory()
  184. + "/"
  185. + potoName.getText().toString()
  186. + ".jpg");
  187. FileOutputStream fileOutStream=null;
  188. try {
  189. fileOutStream=new FileOutputStream(file);
  190. //把位图输出到指定的文件中
  191. bm.compress(CompressFormat.JPEG, 100, fileOutStream);
  192. fileOutStream.close();
  193. } catch (IOException io) {
  194. io.printStackTrace();
  195. }
  196.  
  197. }
  198. }).show();
  199. //重新浏览
  200. camera.stopPreview();
  201. camera.startPreview();
  202. isPreview=true;
  203. }
  204. };
  205.  
  206. @Override
  207. public boolean onCreateOptionsMenu(Menu menu) {
  208. getMenuInflater().inflate(R.menu.main, menu);
  209. return true;
  210. }
  211.  
  212. }

Android之Camera控制拍照的更多相关文章

  1. Android Camera进行拍照

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

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

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

  3. 玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo

    杂家前文是在2012年的除夕之夜仓促完成,后来很多人指出了一些问题,琐事缠身一直没有进行升级.后来随着我自己的使用,越来越发现不出个升级版的demo是不行了.有时候就连我自己用这个demo测一些性能. ...

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

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

  5. Android 开发 Camera类的拍照与录像

    前言 在开发Android应用的时候,如果需要调用摄像头拍照或者录像,除了通过Intent调用系统现有相机应用进行拍照录像之外,还可以通过直接调用Camera硬件去去获取摄像头进行拍照录像的操作.本篇 ...

  6. Android Camera后台拍照

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

  7. 使用Camera进行拍照

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

  8. android——创建camera应用(译)

     只是选择相机部分来翻译.下面是主要内容 有些开发者可能需要Camera的接口,来定制自己程序的外观和特殊功能.创建自定义的Camera界面比使用using an Intent需要编写更多的代码,但是 ...

  9. 通过Camera进行拍照

    Android通过Camera来控制拍照,使用Camera比较简单,按步骤进行即可: 下面用一个示例来演示: Activity: package com.home.activity; import j ...

随机推荐

  1. _WSAStartup@8,该符号在函数 _main 中被引用

    int WSAStartup( __in WORD wVersionRequested, __out LPWSADATA lpWSAData ); WSAStartup 格  式: int PASCA ...

  2. vs c++配置opencv(1)

    环境: vs2013 opencv2.4.13 准备工作: 1.安装opencv. opencv各版本间存在API差异,opencv提供相应版本的vc文件,在其安装目录 ..opencv\build\ ...

  3. fopen()函数

    1.2 文件的输入输出函数 键盘.显示器.打印机.磁盘驱动器等逻辑设备, 其输入输出都能够通过文件管理的方法来完毕.而在编程时使用最多的要算是磁盘文件, 因此本节主要以磁盘文件为主, 具体介绍Turb ...

  4. ADO.NET基础笔记

    ADO.NET 程序要和数据库交互要通过ADO.NET进行,通过ADO.Net就能在程序中执行SQL了. ADO.Net中提供了对各种不同的数据库的统一操作接口. 连接字符串: 程序通过连接字符串指定 ...

  5. [Swust OJ 795]--Penney Game

    题目链接:http://acm.swust.edu.cn/problem/795/ Time limit(ms): 1000 Memory limit(kb): 65535   Description ...

  6. PHP 8大安全函数

    1. mysql_real_escape_string() 这个函数对于在PHP中防止SQL注入攻击很有帮助,它对特殊的字符,像单引号和双引号,加上了“反斜杠”,确保用户的输入在用它去查询以前已经是安 ...

  7. 转: ajax跨域之JSONP

    事件背景: 某个站点分为静态产品介绍页面(或由于某原因需要静态化),和一个独立的在线应用程序.静态产品页面属于www.a.com下,而在线应用程序作为一个相对独立的系统存在于app.a.com上. 在 ...

  8. Linux下Qt应用程序的发布(使用LDD命令查看所有依赖的库文件)

    最近一直在学习Qt,用Qt写了一个程序,但是不知道怎么发布,网上说的都是在windows下怎么发布Qt应用程序,但是,在windows下Qt应用程序依赖的库文件与linux下的名字不同.于是,我就想到 ...

  9. 解读Google分布式锁服务

    解读Google分布式锁服务  背景介绍 在2010年4月,Google的网页索引更新实现了实时更新,在今年的OSDI大会上,Google首次公布了有关这一技术的论文. 在此之前,Google的索引更 ...

  10. java学习之url

    package com.gh.URL; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ...