您的位置:首页 > 移动开发 > Android开发

Android开发: 调用Camera API 创建Camera

2012-11-14 17:14 507 查看
steps to follow to create your own camera using camera API,

1. add permission to AndroidManifest.xml to get the camera hardware resource and save picture into SD card,

<uses-permission android:name= "android.permission.CAMERA" />

[align=left]<uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" />[/align]
[align=left] [/align]

AndroidManifest.xml[/b]

<? xml version= "1.0" encoding = "utf-8"?>
< manifest xmlns:android ="http://schemas.android.com/apk/res/android"
package= "android.study.sample"
android:versionCode= "1"
android:versionName= "1.0" >

<uses-sdk android:minSdkVersion= "15" />
<uses-permission android:name= "android.permission.CAMERA" />
<uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" />

<application
android:icon ="@drawable/ic_launcher"
android:label ="@string/app_name" >

< activity android:name =".CameraActivity"
android:label ="@string/app_name"

android:screenOrientation ="landscape" >
<!-- configure this activity to use landscape orientation -->

< intent-filter>
< action android:name ="android.intent.action.MAIN" />
< category android:name ="android.intent.category.LAUNCHER" />
</ intent-filter>
</ activity>

</application >

</ manifest>


2. set a preview layout and button in your camera UI to control camera

res/layout/main.xml[/b]

<? 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>


3.implement your a surfaceView for your own camera to preview the live image before taking a picture

android.study.sample.CameraPreview.java[/b]

package android.study.sample;

import java.io.IOException;

import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/** A basic Camera preview class */
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;

String TAG= "CAMERAAPI";

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();
} 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());
}
}
}


[align=left]4.build your CameraActivity to start the camera app [/align]

[align=left]get an camera available , add this camera to the surfaceview of the screen layout, listen for the User action, If user click to Copture button, call camera to take a picture, and save image into the SD card, this is implemented by the PictureCallback method set to Camera.takePicture() [/align]

android.study.sample.CameraActivity.java[/b]

package android.study.sample;
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.os.Bundle;
import android.os.Environment;
import android.study.sample.R.id;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;

public class CameraActivity extends Activity {

public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;

private Camera mCamera;
private CameraPreview mPreview;
String TAG= "CAMERAAPI";

@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout. main );

// Create an instance of Camera
mCamera = getCameraInstance();

// 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);

Button captureButton = (Button) findViewById(id. button_capture );
captureButton.setOnClickListener( new CaptureButtonOnClickListener());
}

public class CaptureButtonOnClickListener implements View.OnClickListener{
public void onClick(View v) {

PictureCallback mPicture = new CameraPictureCallBack();
mCamera.takePicture( null , null , mPicture);
}
}
/** A safe way to get an instance of the Camera object. */
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
}

public class CameraPictureCallBack implements PictureCallback{

public void onPictureTaken( byte[] data, Camera camera) {

File pictureFile = getOutputMediaFile( MEDIA_TYPE_IMAGE);
if (pictureFile == null){
Log. d( TAG, "Error creating media file, check storage permissions!");
return ;
}

try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
} 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 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 ;
}
}

}

5. when open the app, UI display like below ,





[align=left] [/align]

本文出自 “whithin's” 博客,请务必保留此出处http://whithin.blog.51cto.com/690417/1059946
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: