Android多媒體應用開發-控制攝像頭拍照

查志強發表於2014-07-13

【原文: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

執行效果:

程式程式碼:

==>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" />
linux

相關文章