Androi学习:Camera初探——控制摄像头拍照

来源:互联网 发布:js 拆分字符串为数组 编辑:程序博客网 时间:2024/06/05 05:50

实习接触的项目中需要调用系统摄像头进行拍照,通过完成这个功能点暂时初步了解了Android中的Camera,当然目前只是停留在使用阶段,对于Camera的深度剖析有机会也要了解一下。

通过Camera控制摄像头拍照的步骤:

1.调用Camera的open()方法打开相机。

2.调用Camera的setParameters()方法获取拍照参数。该方法返回一个Camera.Parameters对象。

3.调用Camera.Paramers对象方法设置拍照参数

4.调用Camera的setParameters,并将Camera.Paramers作为参数传入,这样即可对相机的拍照参数进行控制

5.调用Camera的startPreview()方法开始预览取景,在预览取景之前需要调用Camera的setPreViewDisplay(SurfaceHolder holder)方法设置使用哪个SurfaceView来显示取景图片。

6.调用Camera的takePicture()方法进行拍照.

7.结束程序时,调用Camera的StopPriview()结束取景预览,并调用release()方法释放资源

运行效果:




涉及Camera使用的相关代码:

private void initCamera(){if (!isPreview){camera = Camera.open();  //1.调用Camera的open()方法打开相机。}if (camera != null && !isPreview){try{//2.调用Camera的setParameters()方法获取拍照参数。该方法返回一个Camera.Parameters对象。Camera.Parameters parameters = camera.getParameters();//3.调用Camera.Paramers对象方法设置拍照参数// 设置预览照片的大小parameters.setPreviewSize(screenWidth, screenHeight);// 每秒显示4帧parameters.setPreviewFrameRate(4);// 设置图片格式parameters.setPictureFormat(PixelFormat.JPEG);// 设置JPG照片的质量parameters.set("jpeg-quality",85);//设置照片的大小parameters.setPictureSize(screenWidth, screenHeight);//4.调用Camera的setParameters,并将Camera.Paramers作为参数传入,这样即可对相机的拍照参数进行控制camera.setParameters(parameters);/** *  5.调用Camera的startPreview()方法开始预览取景,在预览取景之前需要调用 *  Camera的setPreViewDisplay(SurfaceHolder holder)方法设置使用哪个SurfaceView来显示取景图片。 *  通过SurfaceView显示取景画面 */camera.setPreviewDisplay(surfaceHolder);// 开始预览camera.startPreview();// 自动对焦camera.autoFocus(afcb);}catch (Exception e){e.printStackTrace();}isPreview = true;}}

//设置监听器,触摸屏幕即拍照sView.setOnTouchListener(new View.OnTouchListener() {public boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubif(event.getAction()==MotionEvent.ACTION_DOWN){if (camera != null){// 6.调用Camera的takePicture()方法进行拍照.camera.takePicture(null, null , myjpegCallback);return true;}}return false;}});

// surface摧毁时释放摄像头public void surfaceDestroyed(SurfaceHolder holder){// 如果camera不为null ,释放摄像头if (camera != null){//7.结束程序时,调用Camera的StopPriview()结束取景预览,并调用release()方法释放资源.if (isPreview)camera.stopPreview();camera.release();camera = null;}}
完整代码:

public class TakephotoActivity extends Activity{SurfaceView sView;SurfaceHolder surfaceHolder;int screenWidth, screenHeight;Button takePhoto;Camera camera;  // 定义系统所用的照相机boolean isPreview = false;//是否在浏览中        @Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);// 设置全屏requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置屏幕方向this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);setContentView(R.layout.takephoto);takePhoto=(Button)findViewById(R.id.takephoto);takePhoto.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {if (camera != null){// 拍照camera.takePicture(null, null , myjpegCallback);}}});WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);Display display = wm.getDefaultDisplay();// 获取屏幕的宽和高screenWidth = display.getWidth();screenHeight = display.getHeight();// 获取界面中SurfaceView组件sView = (SurfaceView) findViewById(R.id.sView);//设置监听器,触摸屏幕即拍照sView.setOnTouchListener(new View.OnTouchListener() {public boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubif(event.getAction()==MotionEvent.ACTION_DOWN){if (camera != null){// 6.调用Camera的takePicture()方法进行拍照.camera.takePicture(null, null , myjpegCallback);return true;}}return false;}});// 获得SurfaceView的SurfaceHoldersurfaceHolder = sView.getHolder();// 为surfaceHolder添加一个回调监听器surfaceHolder.addCallback(new Callback(){public void surfaceChanged(SurfaceHolder holder, int format, int width,int height){}public void surfaceCreated(SurfaceHolder holder){// surface被创建时打开摄像头initCamera();}// surface摧毁时释放摄像头public void surfaceDestroyed(SurfaceHolder holder){// 如果camera不为null ,释放摄像头if (camera != null){//7.结束程序时,调用Camera的StopPriview()结束取景预览,并调用release()方法释放资源.if (isPreview)camera.stopPreview();camera.release();camera = null;}}});// 设置该SurfaceView自己不维护缓冲    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);}private void initCamera(){if (!isPreview){camera = Camera.open();  //1.调用Camera的open()方法打开相机。}if (camera != null && !isPreview){try{//2.调用Camera的setParameters()方法获取拍照参数。该方法返回一个Camera.Parameters对象。Camera.Parameters parameters = camera.getParameters();//3.调用Camera.Paramers对象方法设置拍照参数// 设置预览照片的大小parameters.setPreviewSize(screenWidth, screenHeight);// 每秒显示4帧parameters.setPreviewFrameRate(4);// 设置图片格式parameters.setPictureFormat(PixelFormat.JPEG);// 设置JPG照片的质量parameters.set("jpeg-quality",85);//设置照片的大小parameters.setPictureSize(screenWidth, screenHeight);//4.调用Camera的setParameters,并将Camera.Paramers作为参数传入,这样即可对相机的拍照参数进行控制camera.setParameters(parameters);/** *  5.调用Camera的startPreview()方法开始预览取景,在预览取景之前需要调用 *  Camera的setPreViewDisplay(SurfaceHolder holder)方法设置使用哪个SurfaceView来显示取景图片。 *  通过SurfaceView显示取景画面 */camera.setPreviewDisplay(surfaceHolder);// 开始预览camera.startPreview();// 自动对焦camera.autoFocus(afcb);}catch (Exception e){e.printStackTrace();}isPreview = true;}}AutoFocusCallback afcb=new AutoFocusCallback() {public void onAutoFocus(boolean success, Camera camera) {if(success){//takePhoto.setEnabled(true);System.out.println("可以拍照");}}};PictureCallback myjpegCallback = new PictureCallback(){public void onPictureTaken(byte[] data, Camera camera){// 根据拍照所得的数据创建位图final Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);// 加载/layout/save.xml文件对应的布局资源View saveDialog = getLayoutInflater().inflate(R.layout.save, null);final EditText photoName = (EditText) saveDialog.findViewById(R.id.phone_name);// 获取saveDialog对话框上的ImageView组件ImageView show = (ImageView) saveDialog.findViewById(R.id.show);// 显示刚刚拍得的照片show.setImageBitmap(bitmap);//使用对话框显示saveDialog组件new AlertDialog.Builder(TakephotoActivity.this).setView(saveDialog).setPositiveButton("上传", new OnClickListener(){public void onClick(DialogInterface dialog,int which){// 创建一个位于SD卡上的文件File file = new File(Environment.getExternalStorageDirectory(),  photoName.getText().toString() + ".jpg");FileOutputStream outStream = null;try{// 打开指定文件对应的输出流outStream = new FileOutputStream(file);// 把位图输出到指定文件中    Matrix matrix = new Matrix();Bitmap bm = Bitmap.createBitmap(1200, 1200*bitmap.getHeight()/bitmap.getWidth(), Config.ARGB_8888);//固定所拍相片大小matrix.setScale(( float ) bm.getWidth() / ( float ) bitmap.getWidth(),( float ) bm.getHeight() / ( float ) bitmap.getHeight());// 注意参数一定是float哦Canvas canvas = new Canvas(bm);//用bm创建一个画布 可以往bm中画入东西了canvas.drawBitmap(bitmap,matrix,null);bm.compress(CompressFormat.JPEG, 40, outStream);outStream.close();}catch (IOException e){e.printStackTrace();}}}).setNegativeButton("取消", null).show();//重新浏览camera.stopPreview();camera.startPreview();isPreview = true;}};}
网上看到Camera架构相关文章很对,有空也了解一下。奋斗


原创粉丝点击