final SurfaceHolder sh = sv.getHolder(); //获取SurfaceHolder对象
sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //设置该SurfaceHolder不维护缓冲
(5)获取布局管理器中添加的“预览”按钮,并为其添加单击事件监听器,在重写的onClick()方法中,首先判断相机是否为预览模式,如果不是,则打开相机,然后为相机设置显示预览画面的SurfaceView,并设置相机参数,最后开始预览并设置自动对焦,具体代码如下:
Button preview = (Button) findViewById(R.id.preview); //获取“预览”按钮
preview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//如果相机为非预览模式,则打开相机
if (!isPreview) {
camera=Camera.open(); //打开相机
}
try {
camera.setPreviewDisplay(sh); //设置用于显示预览的SurfaceView
Camera.Parameters parameters = camera.getParameters(); //获取相机参数
parameters.setPictureSize(640, 480); //设置预览画面的尺寸
parameters.setPictureFormat(PixelFormat.JPEG); //指定图片为JPEG格式
parameters.set("jpeg-quality", 80); //设置图片的质量
parameters.setPictureSize(640, 480); //设置拍摄图片的尺寸
camera.setParameters(parameters); //重新设置相机参数
camera.startPreview(); //开始预览
camera.autoFocus(null); //设置自动对焦
} catch (IOException e) {
e.printStackTrace();
}
}
});
(6)获取布局管理器中添加的“拍照”按钮,并为其设置单击事件监听器,在重写的onClick()方法中,如果相机对象不为空,则调用takePicture()方法进行拍照,具体代码如下:
Button takePhoto = (Button) findViewById(R.id.takephoto); //获取“拍照”按钮
takePhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(camera!=null){
camera.takePicture(null, null, jpeg); //进行拍照
}
}
});
(7)实现拍照的回调接口,在重写的onPictureTaken()方法中,首先根据拍照所得的数据创建位图,然后实现一个带“保存”和“取消”按钮的对话框,用于保存所拍图片,具体代码如下:
final PictureCallback jpeg = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
//根据拍照所得的数据创建位图
final Bitmap bm = BitmapFactory.decodeByteArray(data, 0,data.length);
//加载layout/save.xml文件对应的布局资源
View saveView = getLayoutInflater().inflate(R.layout.save, null);
final EditText photoName = (EditText) saveView.findViewById(R.id.phone_name);
//获取对话框上的ImageView组件
ImageView show = (ImageView) saveView.findViewById(R.id.show);
show.setImageBitmap(bm); //显示刚刚拍得的照片
camera.stopPreview(); //停止预览
isPreview = false;
//使用对话框显示saveDialog组件
new AlertDialog.Builder(MainActivity.this).setView(saveView)
.setPositiveButton("保存", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
File file = new File("/sdcard/pictures/" + photoName
.getText().toString() + ".jpg"); //创建文件对象
try {
file.createNewFile(); //创建一个新文件
//创建一个文件输出流对象
FileOutputStream fileOS = new FileOutputStream(file);
//将图片内容压缩为JPEG格式输出到输出流对象中
bmpress(Bitmap.CompressFormat.JPEG, 100, fileOS);
fileOS.flush(); //将缓冲区中的数据全部写出到输出流中
fileOS.close(); //关闭文件输出流对象
isPreview = true;
resetCamera();
} catch (IOException e) {
e.printStackTrace();
}
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
isPreview = true;
resetCamera(); //重新预览
}
}).show();