现在的位置: 首页 > 综合 > 正文

camera.takePicture拍照案例

2017年11月14日 ⁄ 综合 ⁄ 共 4814字 ⁄ 字号 评论关闭

给大家来一个使用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" />

抱歉!评论已关闭.