转载自:http://blog.csdn.net/lissdy/article/details/8512395
实习接触的项目中需要调用系统摄像头进行拍照,通过完成这个功能点暂时初步了解了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 stub
- if(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;//是否在浏览中
- @Override
- public 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 stub
- if(event.getAction()==MotionEvent.ACTION_DOWN){
- if (camera != null)
- {
- // 6.调用Camera的takePicture()方法进行拍照.
- camera.takePicture(null, null , myjpegCallback);
- return true;
- }
- }
- return false;
- }
- });
- // 获得SurfaceView的SurfaceHolder
- surfaceHolder = 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;
- }
- };
- }