Android中使用相机的步骤如下:

  • Detect and Access Camera - Create code to check for the existence ofcameras and request access.
  • Create a Preview Class - Create a camera preview class that extendsSurfaceView and implements theSurfaceHolder interface. Thisclass previews the live images from the camera.
  • Build a Preview Layout - Once you have the camera preview class, create aview layout that incorporates the preview and the user interface controls you want.
  • Setup Listeners for Capture - Connect listeners for your interfacecontrols to start image or video capture in response to user actions, such as pressing abutton.
  • Capture and Save Files - Setup the code for capturing pictures orvideos and saving the output.
  • Release the Camera - After using the camera, your application mustproperly release it for use by other applications.

具体详细的代码如下:

1.Manifest.xml文件

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.syy.camera.activity" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.syy.camera.activity.MainActivity" android:label="@string/app_name"  android:screenOrientation="landscape" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>

2.CameraUtil.java

package com.syy.camera.util;import android.content.Context;import android.content.pm.PackageManager;import android.hardware.Camera;public class CameraUtil { /**   * 检查设备是否有照相的功能   * @param context 上下文环境  * @return  * */ public static boolean checkCameraHardware(Context context) {  if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){  // this device has a camera  return true;  } else {  // no camera on this device  return false;  } } /**   * 获得Camera实例 */ public static Camera getCameraInstance(){  Camera c = null;  try {  c = Camera.open(); // attempt to get a Camera instance  }  catch (Exception e){  // Camera is not available (in use or does not exist)  }  return c; // returns null if camera is unavailable } }

3.创建预览布局文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="horizontal"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    >  <FrameLayout    android:id="@+id/camera_preview"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:layout_weight="1"    />  <Button    android:id="@+id/button_capture"    android:text="Capture"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_gravity="center"    /></LinearLayout>
4.CameraPriview.java

package com.syy.camera.util;import java.io.IOException;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.graphics.Rect;import android.hardware.Camera;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;/**  *  照相预览的类*/public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {    private SurfaceHolder mHolder;    private Camera mCamera;    private static final String TAG="tag";        public CameraPreview(Context context, Camera camera) {        super(context);        mCamera = camera;        // Install a SurfaceHolder.Callback so we get notified when the        // underlying surface is created and destroyed.        mHolder = getHolder();        mHolder.addCallback(this);        // deprecated setting, but required on Android versions prior to 3.0        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);    }    public void surfaceCreated(SurfaceHolder holder) {        // The Surface has been created, now tell the camera where to draw the preview.        try {            mCamera.setPreviewDisplay(holder);            mCamera.startPreview();         // get Camera parameters            Camera.Parameters params = mCamera.getParameters();            // set the focus mode            params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);            // set Camera parameters            mCamera.setParameters(params);        } catch (IOException e) {            Log.d(TAG, "Error setting camera preview: " + e.getMessage());        }    }    public void surfaceDestroyed(SurfaceHolder holder) {        // empty. Take care of releasing the Camera preview in your activity.    }    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {        // If your preview can change or rotate, take care of those events here.        // Make sure to stop the preview before resizing or reformatting it.        if (mHolder.getSurface() == null){          // preview surface does not exist          return;        }        // stop preview before making changes        try {            mCamera.stopPreview();        } catch (Exception e){          // ignore: tried to stop a non-existent preview        }        // set preview size and make any resize, rotate or        // reformatting changes here        // start preview with new settings        try {            mCamera.setPreviewDisplay(mHolder);            mCamera.startPreview();        } catch (Exception e){            Log.d(TAG, "Error starting camera preview: " + e.getMessage());        }    }}
5.MainActivity.java

package com.syy.camera.activity;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import android.app.Activity;import android.hardware.Camera;import android.hardware.Camera.PictureCallback;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.FrameLayout;import android.widget.Toast;import com.syy.camera.util.CameraPreview;import com.syy.camera.util.CameraUtil;public class MainActivity extends Activity {private Camera mCamera; private CameraPreview mPreview;  private static final String TAG="tag"; public static final int MEDIA_TYPE_IMAGE = 1; public static final int MEDIA_TYPE_VIDEO = 2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// Create an instance of Camera        mCamera = CameraUtil.getCameraInstance();        // Create our Preview view and set it as the content of our activity.        mPreview = new CameraPreview(this, mCamera);        // Create our Preview view and set it as the content of our activity.        mPreview = new CameraPreview(this, mCamera);        FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);        preview.addView(mPreview);     // Add a listener to the Capture button        Button captureButton = (Button) findViewById(R.id.button_capture);        captureButton.setOnClickListener(            new View.OnClickListener() {                @Override                public void onClick(View v) {                    // get an image from the camera                    mCamera.takePicture(null, null, mPicture);                }            }        );}private PictureCallback mPicture = new PictureCallback() {    @Override    public void onPictureTaken(byte[] data, Camera camera) {        File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);        if (pictureFile == null){                      return;        }        try {            FileOutputStream fos = new FileOutputStream(pictureFile);            fos.write(data);            fos.close();            Toast.makeText(MainActivity.this, "文件已保存", 2000).show();        } catch (FileNotFoundException e) {            Log.d(TAG, "File not found: " + e.getMessage());        } catch (IOException e) {            Log.d(TAG, "Error accessing file: " + e.getMessage());        }    }};/** Create a file Uri for saving an image or video */private static Uri getOutputMediaFileUri(int type){      return Uri.fromFile(getOutputMediaFile(type));}/** Create a File for saving an image or video */private static File getOutputMediaFile(int type){    // To be safe, you should check that the SDCard is mounted    // using Environment.getExternalStorageState() before doing this.    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(              Environment.DIRECTORY_PICTURES), "MyCameraApp");    // This location works best if you want the created images to be shared    // between applications and persist after your app has been uninstalled.    // Create the storage directory if it does not exist    if (! mediaStorageDir.exists()){        if (! mediaStorageDir.mkdirs()){            Log.d("MyCameraApp", "failed to create directory");            return null;        }    }    // Create a media file name    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());    File mediaFile;    if (type == MEDIA_TYPE_IMAGE){        mediaFile = new File(mediaStorageDir.getPath() + File.separator +        "IMG_"+ timeStamp + ".jpg");    } else if(type == MEDIA_TYPE_VIDEO) {        mediaFile = new File(mediaStorageDir.getPath() + File.separator +        "VID_"+ timeStamp + ".mp4");    } else {        return null;    }    return mediaFile;}@Override    protected void onPause() {        super.onPause();        releaseCamera();              // release the camera immediately on pause event    } private void releaseCamera(){        if (mCamera != null){            mCamera.release();        // release the camera for other applications            mCamera = null;        }    }}


更多相关文章

  1. Android lint 删除无用图片文件和配置文件
  2. android 开发-数据存储之文件存储
  3. [Android] 该文件包与具有同一名称的现有文件包存在冲突
  4. Android 布局中调字体的行距和间距
  5. Android SO文件的兼容和适配
  6. 解决在3.6.2安装android的ADT文件bug
  7. Android studio相对布局的常用属性
  8. 【转】Android中对Log日志文件的分析
  9. android:gravity 和 android:layout_Gravity属性——android开发

随机推荐

  1. (window)Android(安卓)Studio安装以及Fet
  2. Android(安卓)安全攻防(二): SEAndroid(安卓
  3. “加一”项目总结--android使用篇(二)(转)
  4. [Android(安卓)与 js 简单互调
  5. Android实现全屏显示的方法
  6. android:id="@*android:id/seekbar" 注意
  7. Android(安卓)ROM研究---如何在ubuntu下
  8. android layout属性介绍
  9. 【Android】 基于XMPP Smack框架 开发QQ
  10. [Android] 对android:layout_weight的一