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 TakePicture過程分析

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

Android 4.0 Camera架构分析之preview和takePicture

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

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

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

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

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

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

android中,与图形相关的上层java package包括:android.graphics,android.view,android.widget,android.opengl。 androi...

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

takePicture()的问题在摄像头旧API的使用中,如果要保存全尺寸图像,只能通过takePicture() 分别是shutterCallback,pictureCallback,pictur...

Android Camera TakePicture過程分析

接著上一篇文章,繼續講解camera拍照等具體功能實行流程 Camera子系统采用C/S架构,客户端和服务端在两个不同的进程当中,它们使用android中的binder机制进行通信, 本系列文章将...

Android实战技巧之四十七:不用预览拍照与图片缩放剪裁

副标题:Take Picture without preview AndroidGoogle出于对隐私的保护,制定了一条门槛,即在Android应用开发中编写拍照程序是必需要有图像预览的。这会对那些恶...

调用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
  • 1298

TakePhoto-轻量级Android照片处理框架

TakePhoto简介 支持以拍照的方式获取照片 支持从相册选择照片 支持对照片进行裁切 支持对照片进行压缩 支持对裁切及压缩参数自定义 支持因拍照Activity被回收后的自动恢复...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:camera.takePicture拍照案例
举报原因:
原因补充:

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