camera.takePicture拍照案例

转载 2012年03月29日 20:47:11
给大家来一个使用camera.takePicture拍照的案例,这个是使用android.hardware.Camera硬件方式的。
主要源码:
  1. package com.android.cameraAndroid;

  2. import android.app.Activity;
  3. import android.os.Bundle;

  4. import java.io.File;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;

  7. import android.content.Context;
  8. import android.content.Intent;
  9. import android.graphics.PixelFormat;
  10. import android.hardware.Camera;
  11. import android.hardware.Camera.Parameters;
  12. import android.hardware.Camera.PictureCallback;
  13. import android.hardware.Camera.ShutterCallback;
  14. import android.media.AudioManager;
  15. import android.media.ToneGenerator;
  16. import android.net.Uri;
  17. import android.os.Environment;
  18. import android.os.StatFs;
  19. import android.view.Menu;
  20. import android.view.MenuItem;
  21. import android.view.SurfaceHolder;
  22. import android.view.SurfaceView;

  23. public class CameraAndroid extends Activity {

  24.         private CameraPreview preview;
  25.         private Camera camera;
  26.         private ToneGenerator tone;
  27.         private static final int OPTION_SNAPSHOT = 0;

  28.         @Override
  29.         public void onCreate(Bundle savedInstanceState) {
  30.                 super.onCreate(savedInstanceState);
  31.                 preview = new CameraPreview(this);
  32.                 setContentView(preview);
  33.         }

  34.         @Override
  35.         public boolean onOptionsItemSelected(MenuItem item) {
  36.                 int itemId = item.getItemId();
  37.                 switch(itemId){
  38.                 case OPTION_SNAPSHOT:
  39.                         //拍摄照片
  40.                         camera.takePicture(shutterCallback, null, jpegCallback);
  41.                         break;
  42.                 }
  43.                 return true;
  44.         }
  45.         //返回照片的JPEG格式的数据
  46.         private PictureCallback jpegCallback = new PictureCallback(){

  47.                 public void onPictureTaken(byte[] data, Camera camera) {
  48.                         Parameters ps = camera.getParameters();
  49.                         if(ps.getPictureFormat() == PixelFormat.JPEG){
  50.                             //存储拍照获得的图片
  51.                             String path = save(data);
  52.                             //将图片交给Image程序处理
  53.                             Uri uri = Uri.fromFile(new File(path));
  54.                                Intent intent = new Intent();
  55.                                intent.setAction("android.intent.action.VIEW");
  56.                                intent.setDataAndType(uri, "image/jpeg");
  57.                                startActivity(intent);
  58.                         }
  59.                 }
  60.         };
  61.        
  62.         //快门按下的时候onShutter()被回调
  63.         private ShutterCallback shutterCallback = new ShutterCallback(){
  64.                 public void onShutter() {
  65.                         if(tone == null)
  66.                                 //发出提示用户的声音
  67.                                 tone = new ToneGenerator(AudioManager.STREAM_MUSIC,
  68.                                                 ToneGenerator.MAX_VOLUME);
  69.                         tone.startTone(ToneGenerator.TONE_PROP_BEEP2);
  70.                 }
  71.         };
  72.        
  73.         private String save(byte[] data){
  74.                 String path = "/sdcard/"+System.currentTimeMillis()+".jpg";
  75.                 try {
  76.                         //判断是否装有SD卡
  77.                         if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
  78.                                 //判断SD卡上是否有足够的空间
  79.                                 String storage = Environment.getExternalStorageDirectory().toString();
  80.                                 StatFs fs = new StatFs(storage);
  81.                                 long available = fs.getAvailableBlocks()*fs.getBlockSize();
  82.                                 if(available<data.length){
  83.                                         //空间不足直接返回空
  84.                                         return null;
  85.                                 }
  86.                                 File file = new File(path);
  87.                                 if(!file.exists())
  88.                                         //创建文件
  89.                                         file.createNewFile();
  90.                                 FileOutputStream fos = new FileOutputStream(file);
  91.                                 fos.write(data);
  92.                                 fos.close();
  93.                         }
  94.                 } catch (Exception e) {
  95.                         e.printStackTrace();
  96.                         return null;
  97.                 }
  98.                 return path;
  99.         }

  100.         @Override
  101.         public boolean onCreateOptionsMenu(Menu menu) {
  102.                 menu.add(0, OPTION_SNAPSHOT, 0, R.string.snapshot);
  103.                 return super.onCreateOptionsMenu(menu);
  104.         }

  105.         class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
  106.                 SurfaceHolder mHolder;

  107.                 public CameraPreview(Context context) {
  108.                         super(context);
  109.                         mHolder = getHolder();
  110.                         mHolder.addCallback(this);
  111.                         mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  112.                 }
  113.                 //Sureface创建的时候,此方法被调用
  114.                 public void surfaceCreated(SurfaceHolder holder) {
  115.                         //打开摄像头,获得Camera对象
  116.                         camera = Camera.open();
  117.                         try {
  118.                                 //设置显示
  119.                                 camera.setPreviewDisplay(holder);
  120.                         } catch (IOException exception) {
  121.                                 camera.release();
  122.                                 camera = null;
  123.                         }
  124.                 }

  125.                 //Surface销毁的时候,此方法被调用
  126.                 public void surfaceDestroyed(SurfaceHolder holder) {
  127.                         camera.stopPreview();
  128.                         //释放Camera
  129.                         camera.release();
  130.                         camera = null;
  131.                 }

  132.                 public void surfaceChanged(SurfaceHolder holder, int format, int w,
  133.                                 int h) {
  134.                         //已经获得Surface的width和height,设置Camera的参数
  135.                         Camera.Parameters parameters = camera.getParameters();
  136.                         parameters.setPreviewSize(w, h);
  137.                         camera.setParameters(parameters);
  138.                         //开始预览
  139.                         camera.startPreview();
  140.                 }
  141.         }
  142. }
复制代码

注意:记得加权限:<uses-permission android:name="android.permission.CAMERA" />

Android Camera 流程学习记录(五,完结)—— Camera.takePicture() 流程解析

在前面的几篇笔记中,我已经把 Camera 控制流的部分梳理得比较清楚了。在 Camera 流程中,还有一个重要的部分,即数据流。 由于数据流的部分相对来说比较简单,所以我就将其与 Camera 的控...
  • qq_16775897
  • qq_16775897
  • 2017年09月08日 16:26
  • 848

Android 笔记 camera.takePicture(),使用flashMode,改变focusMode,continuous-picture中遇到的问题

takePicture()的问题在摄像头旧API的使用中,如果要保存全尺寸图像,只能通过takePicture() 分别是shutterCallback,pictureCallback,pictur...
  • super_zq
  • super_zq
  • 2016年09月23日 14:37
  • 2438

我的第一篇博客:关于android的Camera在takePicture()时不回调onPictureTaken()方法

在看书学习中,简单用到camera API去拍摄照片,但是在小米Note上运行时,卡在了拍摄界面,不动了,没有报错信息,可以知道是回调了Camera.ShutterCallback中的onShutte...
  • chen_jingling
  • chen_jingling
  • 2015年11月24日 12:53
  • 3678

Android Camera TakePicture過程分析

Android Camera TakePicture過程分析 接著上一篇文章,繼續講解camera拍照等具體功能實行流程 Camera子系统采用C/S架构,客户端和服务端在两个不同的进程当中,...
  • Tommy_wxie
  • Tommy_wxie
  • 2014年04月03日 11:35
  • 9776

调用Camera.takePicture(null, null, pictureCallback);拍照并保存于sd卡

package com.ygy; import java.io.BufferedOutputStream; import java.io.File; import java.io.Fil...
  • cm
  • cm
  • 2016年12月11日 21:50
  • 1768

魅族 mx2拍照无反应 Camera.takePicture 未回调PictureCallback jpeg

要在Android中调用相机功能,一是调用系统相机,二是利用Camera与SurfaceView进行处理。而我的问题是使用第二种方法,拍照时系统无反应,具体描述如下: 现象描述: 魅族mx2上,点...
  • wangfayinn
  • wangfayinn
  • 2013年07月13日 16:38
  • 7182

Android图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的联系 && camera的takePicture实例

android中,与图形相关的上层java package包括:android.graphics,android.view,android.widget,android.opengl。 androi...
  • zhandoushi1982
  • zhandoushi1982
  • 2010年01月25日 23:36
  • 12157

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

本篇是我对开发项目的拍照功能过程中,对Camera拍照使用的总结。由于camera2是在api level 21(5.0.1)才引入的,而Camera到6.0仍可使用,所以暂未考虑camera2。文档...
  • maosidiaoxian
  • maosidiaoxian
  • 2016年03月01日 17:58
  • 18514

Android 4.0 Camera架构分析之preview和takePicture

上篇文章介绍了,Camera初始化的过程,完成初始化之后就可以使用Camera提供的以下功能了 1.预览preview 2.视频录制 3.拍照和参数设置 打开Camera第...
  • dnfchan
  • dnfchan
  • 2012年05月25日 16:43
  • 15339

camera.takePicture拍照案例

http://blog.csdn.net/emerald0106/article/details/7408531 给大家来一个使用camera.takePicture拍照的案例,这个是使...
  • summerxzg
  • summerxzg
  • 2013年01月19日 13:06
  • 2384
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:camera.takePicture拍照案例
举报原因:
原因补充:

(最多只允许输入30个字)