CameraDemoActivity.java
package com.lau.camera;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class CameraDemoActivity extends Activity
implements SurfaceHolder.Callback, OnClickListener {
private Button btnPlay = null;
private SurfaceView surfaceView = null;
private SurfaceHolder holder = null;
private Camera mCamera = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
viewInit();
}
private void viewInit() {
btnPlay = (Button) findViewById(R.id.ok);
surfaceView = (SurfaceView) findViewById(R.id.surfaceview);
holder = surfaceView.getHolder();
holder.addCallback(this);
// holder.setFixedSize(176, 144);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
btnPlay.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(v.getId() == btnPlay.getId()) {
mCamera.takePicture(null, null, new PicCallback());
}
}
class PicCallback implements PictureCallback {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// TODO Auto-generated method stub
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
SimpleDateFormat dataFormat = new SimpleDateFormat("yyyyMMdd");
Date date = new Date(System.currentTimeMillis());
String time = dataFormat.format(date);
File picFile = new File(Environment.getExternalStorageDirectory() + "/books/" + time + ".jpg");
if(!picFile.exists()) {
try {
picFile.createNewFile();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(picFile));
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);
bos.flush();
bos.close();
Toast.makeText(getApplicationContext(), "Success", 3000).show();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
print("Take picture fail.");
}
}
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
print("surface changed");
mCamera.startPreview();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
print("surface created");
try {
//注意这里不能放在onCreate()里面,否则将无法形成预览效果
mCamera = Camera.open();
print("open camera success");
} catch (Exception e) {
mCamera = Camera.open(Camera.getNumberOfCameras()-1);
e.printStackTrace();
}
if(mCamera != null) {
try {
mCamera.setPreviewDisplay(holder);
mCamera.setDisplayOrientation(90);
} catch (IOException e) {
e.printStackTrace();
}
} else {
Toast.makeText(getApplicationContext(), "Open Camera Fail, exit!", 3000).show();
finish();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
private void print(Object o) {
Log.d("DEBUG", "" + o);
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<SurfaceView
android:id="@+id/surfaceview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
<Button
android:id="@+id/ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="OK" />
</RelativeLayout>
权限:
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
参考链接:
http://www.eoeandroid.com/thread-2193-1-1.html
http://blog.csdn.net/liujianminghero/article/details/7464038
http://topic.csdn.net/u/20120518/14/00457380-e333-46f8-9d7f-8eee0d82e3b9.html
http://vaero.blog.51cto.com/4350852/779942
http://stackoverflow.com/questions/3890381/camera-setparameters-failed-in-android setParameters failed,可见此贴。