万书网 > 文学作品 > Android从入门到精通 > 第123页

第123页





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