首先看看使用照相机的google SDK的说明。这个就自己慢慢看文档吧。接下来第一个实验是取景的照相机,后面的例子更加充实的,这就简单些。
先贴上代码:
package com.TestCamera1;
import java.io.IOException;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.Window;
import android.view.WindowManager;
public class TestCamera1Activity extends Activity {
/** Called when the activity is first created. */
private SurfaceHolder surfaceHolder;
private Camera camera;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//强制横屏
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceView.getHolder().addCallback(new SurfaceViewCallback());
}
private final class SurfaceViewCallback implements SurfaceHolder.Callback {
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
camera = Camera.open();
Camera.Parameters parameters = camera.getParameters();
// 选择合适的预览尺寸
List<Camera.Size> sizeList = parameters.getSupportedPreviewSizes();
Camera.Size cameraSize=(Camera.Size)sizeList.get(1);
parameters.setPreviewSize(cameraSize.width, cameraSize.height);//设置预览图的大小,很关键
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); // 获取当前屏幕管理器对象
Display display = wm.getDefaultDisplay(); // 获取屏幕信息的描述类
Log.i("width|heigt",display.getWidth()+"|"+display.getHeight() );//获取屏幕的信息
parameters.setPreviewFrameRate(5);//设置预览图的帧数
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.set("jpeg-quality", 100);
camera.setParameters(parameters);
try {
camera.setPreviewDisplay(surfaceHolder);
} catch (IOException e) {
System.out.println(e.getMessage());
}
camera.startPreview();//开始预览
}
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
if (camera != null) {
camera.stopPreview();//停止预览
}
camera.release();//释放照相机
camera = null;
}
}
}
由google SDK看出要预览照片,首先需要一个surfaceHolder还需要一个Surfaceview来呈现预览图,否则没有办法预览了“Pass a fully initializedSurfaceHolder
tosetPreviewDisplay(SurfaceHolder)
. Without a surface, the camera will be unable to start the preview.”这里有一篇介绍surfaceHolder的文章http://www.cnblogs.com/bausch/archive/2011/10/20/2219068.html
首先这个activity实现了SurfaceHolder.Callback接口,并重写了这个接口的三个方法。这个是必须实现的。大家看这三个方法的名字就知道他们的调用时机了。
虽然这个例子比较简单,但是有地方要注意的就是:
今晚就到这里,第一次写博客不太会写。下集更精彩,介绍如果拍照还有一些自己的感想
虽然这个例子比较简单,但是有地方要注意的就是:
parameters.setPreviewSize(cameraSize.width, cameraSize.height);//设置预览图的大小,很关键
预览图的大小是不能随意设置的,否则就会报错setparameter fail。所以首先要查询一下自己的机型适合的大小,以下是方法:
Camera.Parameters parameters = mCamera.getParameters();
// 选择合适的预览尺寸
List<Camera.Size> sizeList = parameters.getSupportedPreviewSizes();
Iterator<Camera.Size> itor1 = sizeList.iterator();
while (itor1.hasNext()) {
Camera.Size cur1 = itor1.next();
Log.i("Camera Parameters:", cur1.width + "," + cur1.height);
}
附件下载:在我的资源页找android camera1
今晚就到这里,第一次写博客不太会写。下集更精彩,介绍如果拍照还有一些自己的感想
更新补充:
parameters.setPreviewSize(cameraSize.width, cameraSize.height);
surfaceView.getWidth(),surfaceView.getHeight();
预览图的大小跟屏幕看到的surfaceview的大小可以不相等,可以说他们没有必然联系。在我实验中,surfaceview的宽高分别为300px,300px,而我的previewsize的宽高分别为640px,480px。这么小的surfaceview只是在屏幕观看的时候显得小而已。
那么这会导致什么后果呢?就是surfaceview跟预览图宽高不同,下节应该会有结果。我猜想是造成图片大小不一