Android多媒体应用开发-控制摄像头拍照

时间:2021-11-15 20:34:22

【原文:http://www.linuxidc.com/Linux/2012-08/67202.htm

现在的手机的功能可谓是五花八门,手机照相功能就是特别突出的一点,现在的手机照相机甚至成了专业数码照相机,可以拍摄出清晰的照片和录制高分辨率的视频。Android操作系统呢,提供了相应的功能来控制拍照:

通过Camera进行拍照

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

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

3.调用Camera.Paramers对象方法设置拍照参数

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

5.调用Camera的takePicture()方法进行拍照.

6.结束程序时,调用Camera的StopPriview()结束取景预览,并调用release()方法释放资源.

创建项目:CaptureImage

运行效果:

Android多媒体应用开发-控制摄像头拍照

程序代码:

==>CaptureImage.java

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

设置权限:

  1. <!-- 授予程序使用摄像头的权限 -->  
  2.     <uses-permission android:name="android.permission.CAMERA" />   
  3.     <uses-feature android:name="android.hardware.camera" />   
  4.     <uses-feature android:name="android.hardware.camera.autofocus" />
Android多媒体应用开发-控制摄像头拍照