Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> 教你在Android中創建相機應用(Camera App)

教你在Android中創建相機應用(Camera App)

編輯:Android開發實例

  在sdk中找到/sdk/docs/guide/topics/media/camera.html#custom-camera,裡面有詳細的api參考

  在清單文件中添加相應的權限:

XML/HTML代碼
  1. <uses-permission android:name="android.permission.CAMERA" />  
  2. <uses-feature android:name="android.hardware.camera" />  
  3. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
  4. <uses-permission android:name="android.permission.RECORD_AUDIO" />  

  按照官方文檔,分為下面幾步:

  • Detect and Access Camera - Create code to check for the existence of cameras and request access.

  • Create a Preview Class - Create a camera preview class that extends SurfaceView and implements theSurfaceHolder interface. This class previews the live images from the camera.

  • Build a Preview Layout - Once you have the camera preview class, create a view layout that incorporates the preview and the user interface controls you want.

  • Setup Listeners for Capture - Connect listeners for your interface controls to start image or video capture in response to user actions, such as pressing a button.

  • Capture and Save Files - Setup the code for capturing pictures or videos and saving the output.

  • Release the Camera - After using the camera, your application must properly release it for use by other applications.

  接下來分別實現:

  1、檢查設備是否有照相機

Java代碼
  1. /** 檢查設備是否存在照相機 */  
  2. private boolean checkCameraHardware(Context context) {  
  3.     if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){  
  4.         // this device has a camera  
  5.         return true;  
  6.     } else {  
  7.         // no camera on this device  
  8.         return false;  
  9.     }  
  10. }  

  2、得到一個照相機

Java代碼
  1. /** 一種安全的方式獲取Cameer對象的實例. */  
  2. public static Camera getCameraInstance(){  
  3.     Camera c = null;  
  4.     try {  
  5.         c = Camera.open(); // attempt to get a Camera instance  
  6.     }  
  7.     catch (Exception e){  
  8.         // Camera is not available (in use or does not exist)  
  9.     }  
  10.     return c; // returns null if camera is unavailable  
  11. }  

  3、新建一個名為CameraPreview的類

Java代碼
  1. package com.wuyudong.mycamera;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import android.content.Context;  
  6. import android.hardware.Camera;  
  7. import android.util.Log;  
  8. import android.view.SurfaceHolder;  
  9. import android.view.SurfaceView;  
  10.   
  11. /** A basic Camera preview class */  
  12. public class CameraPreview extends SurfaceView implements  
  13.         SurfaceHolder.Callback {  
  14.     private static final String TAG = "CameraPreview";  
  15.     private SurfaceHolder mHolder;  
  16.     private Camera mCamera;  
  17.   
  18.     public CameraPreview(Context context, Camera camera) {  
  19.         super(context);  
  20.         mCamera = camera;  
  21.   
  22.         // Install a SurfaceHolder.Callback so we get notified when the  
  23.         // underlying surface is created and destroyed.  
  24.         mHolder = getHolder();  
  25.         mHolder.addCallback(this);  
  26.         // deprecated setting, but required on Android versions prior to 3.0  
  27.         mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  28.     }  
  29.   
  30.     public void surfaceCreated(SurfaceHolder holder) {  
  31.         // The Surface has been created, now tell the camera where to draw the  
  32.         // preview.  
  33.         try {  
  34.             mCamera.setPreviewDisplay(holder);  
  35.             mCamera.startPreview();  
  36.         } catch (IOException e) {  
  37.             Log.d(TAG, "Error setting camera preview: " + e.getMessage());  
  38.         }  
  39.     }  
  40.   
  41.     public void surfaceDestroyed(SurfaceHolder holder) {  
  42.         // empty. Take care of releasing the Camera preview in your activity.  
  43.     }  
  44.   
  45.     public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {  
  46.         // If your preview can change or rotate, take care of those events here.  
  47.         // Make sure to stop the preview before resizing or reformatting it.  
  48.   
  49.         if (mHolder.getSurface() == null) {  
  50.             // preview surface does not exist  
  51.             return;  
  52.         }  
  53.   
  54.         // stop preview before making changes  
  55.         try {  
  56.             mCamera.stopPreview();  
  57.         } catch (Exception e) {  
  58.             // ignore: tried to stop a non-existent preview  
  59.         }  
  60.   
  61.         // set preview size and make any resize, rotate or  
  62.         // reformatting changes here  
  63.   
  64.         // start preview with new settings  
  65.         try {  
  66.             mCamera.setPreviewDisplay(mHolder);  
  67.             mCamera.startPreview();  
  68.   
  69.         } catch (Exception e) {  
  70.             Log.d(TAG, "Error starting camera preview: " + e.getMessage());  
  71.         }  
  72.     }  
  73. }  

  4、設置一個預覽功能的layout,將原來布局文件中的內容替換成下面的代碼

XML/HTML代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="horizontal"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7.   <FrameLayout  
  8.     android:id="@+id/camera_preview"  
  9.     android:layout_width="fill_parent"  
  10.     android:layout_height="fill_parent"  
  11.     android:layout_weight="1"  
  12.     />  
  13.   
  14.   <Button  
  15.     android:id="@+id/button_capture"  
  16.     android:text="Capture"  
  17.     android:layout_width="wrap_content"  
  18.     android:layout_height="wrap_content"  
  19.     android:layout_gravity="center"  
  20.     />  
  21. </LinearLayout>  

  5、在清單文件中加入 android:screenOrientation="landscape" 調整相機為橫向拍攝

  6、在MainActivity中添加

Java代碼
  1. public class MainActivity extends Activity {  
  2.   
  3.     private Camera mCamera;  
  4.     private CameraPreview mPreview;  
  5.   
  6.     @Override  
  7.     public void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.main);  
  10.   
  11.         // Create an instance of Camera  
  12.         mCamera = getCameraInstance();  
  13.   
  14.         // Create our Preview view and set it as the content of our activity.  
  15.         mPreview = new CameraPreview(this, mCamera);  
  16.         FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);  
  17.         preview.addView(mPreview);  
  18.     }  
  19. }  

  7、實現拍攝按鈕的功能

  (1)添加拍照回調方法

Java代碼
  1. private PictureCallback mPicture = new PictureCallback() {  
  2.   
  3.     @Override  
  4.     public void onPictureTaken(byte[] data, Camera camera) {  
  5.   
  6.         File pictureFile = new File("/sdcard/" + System.currentTimeMillis()+".jpg");  
  7.         try {  
  8.             FileOutputStream fos = new FileOutputStream(pictureFile);  
  9.             fos.write(data);  
  10.             fos.close();  
  11.         } catch (IOException e) {  
  12.             Log.d("TAG", "Error accessing file: " + e.getMessage());  
  13.         }  
  14.     }  
  15. };  

  給拍照按鈕添加注冊事件:

Java代碼
  1. // Add a listener to the Capture button  
  2. Button captureButton = (Button) findViewById(R.id.button_capture);  
  3. captureButton.setOnClickListener(  
  4.     new View.OnClickListener() {  
  5.         @Override  
  6.         public void onClick(View v) {  
  7.             // get an image from the camera  
  8.             mCamera.takePicture(null, null, mPicture);  
  9.         }  
  10.     }  
  11. );  

  完整的代碼如下:

Java代碼
  1. package com.wuyudong.mycamera;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.sql.Date;  
  8.   
  9. import android.os.Bundle;  
  10. import android.app.Activity;  
  11. import android.content.Context;  
  12. import android.content.pm.PackageManager;  
  13. import android.hardware.Camera;  
  14. import android.hardware.Camera.AutoFocusCallback;  
  15. import android.hardware.Camera.PictureCallback;  
  16. import android.util.Log;  
  17. import android.view.Menu;  
  18. import android.view.View;  
  19. import android.widget.Button;  
  20. import android.widget.FrameLayout;  
  21.   
  22. public class MainActivity extends Activity {  
  23.   
  24.     private Camera mCamera;  
  25.     private CameraPreview mPreview;  
  26.   
  27.     @Override  
  28.     protected void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.activity_main);  
  31.   
  32.         // 創建一個 Camera 的實例  
  33.         mCamera = getCameraInstance();  
  34.   
  35.         // 創建一個預覽界面  
  36.         mPreview = new CameraPreview(this, mCamera);  
  37.         FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);  
  38.         preview.addView(mPreview);  
  39.           
  40.         // Add a listener to the Capture button  
  41.         Button captureButton = (Button) findViewById(R.id.button_capture);  
  42.         captureButton.setOnClickListener(  
  43.             new View.OnClickListener() {  
  44.                 @Override  
  45.                 public void onClick(View v) {  
  46.                     mCamera.autoFocus(new AutoFocusCallback() {  // 對焦  
  47.                           
  48.                         @Override  
  49.                         public void onAutoFocus(boolean success, Camera camera) {  
  50.                             // get an image from the camera  
  51.                             mCamera.takePicture(null, null, mPicture);  
  52.                               
  53.                         }  
  54.                     });  
  55.                       
  56.                 }  
  57.             }  
  58.         );  
  59.     }  
  60.   
  61.     /** 檢查設備是否存在照相機 */  
  62.     private boolean checkCameraHardware(Context context) {  
  63.         if (context.getPackageManager().hasSystemFeature(  
  64.                 PackageManager.FEATURE_CAMERA)) {  
  65.             // this device has a camera  
  66.             return true;  
  67.         } else {  
  68.             // no camera on this device  
  69.             return false;  
  70.         }  
  71.     }  
  72.   
  73.     /** 一種安全的方式獲取Cameer對象的實例. */  
  74.     public static Camera getCameraInstance() {  
  75.         Camera c = null;  
  76.         try {  
  77.             c = Camera.open(); // attempt to get a Camera instance  
  78.         } catch (Exception e) {  
  79.             // Camera is not available (in use or does not exist)  
  80.         }  
  81.         return c; // returns null if camera is unavailable  
  82.     }  
  83.       
  84.     private PictureCallback mPicture = new PictureCallback() {  
  85.   
  86.         @Override  
  87.         public void onPictureTaken(byte[] data, Camera camera) {  
  88.   
  89.             File pictureFile = new File("/sdcard/" + System.currentTimeMillis()+".jpg");  
  90.             try {  
  91.                 FileOutputStream fos = new FileOutputStream(pictureFile);  
  92.                 fos.write(data);  
  93.                 fos.close();  
  94.             } catch (IOException e) {  
  95.                 Log.d("TAG", "Error accessing file: " + e.getMessage());  
  96.             }  
  97.         }  
  98.     };  
  99.       
  100.     protected void onDestory() {  
  101.         if(mCamera != null) {    //釋放資源  
  102.             mCamera.release();  
  103.             mCamera = null;  
  104.         }  
  105.     }  
  106.   
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved